Ir al contenido


Foto

No aparecen acentos en los controles

acentos caracteres especiales UTF8 ANSI

  • Por favor identifícate para responder
5 respuestas en este tema

#1 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 22 mayo 2015 - 06:52

Hace un tiempo que vengo luchando con un "programita" que hice como por diversión. La cuestión es que no puede hacer que Lazarus me muestre los acentos y otros caracteres especiales en los controles.

Para obtener los datos usé una planilla de cálculo y guardé la tabla en formato texto separado por comas (en realidad punto y comas).

Luego mediante una rutina los separo en sus correspondientes campos leyendo el archivo tratándolo como archivo de texto y los hago coincidir con los campos que tengo en una MemTable. Todo funciona a la perfección excepto por que los cuadro de texto que están ligados a los campos no muestran los acentos (y quizá algún otro caracter especial).

Se supone que es un problema de codificación de los caracteres.

Al abrir el archivo de texto con el bloc de notas todo se ve bien.

Probé codificando a UTF8, como lo leí en otro hilo sobre un caso similar, pero no funcionó. Lo hago precisamente al momento de leer una línea.

 

Saludos

 


  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 22 mayo 2015 - 08:23

¿Podés darnos una muestra de código? Quizá así podremos ver donde está el problema.

 

Saludos,


  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 22 mayo 2015 - 08:43

Hice una prueba con este código:


delphi
  1. // uses windows;                                                                                   
  2.  
  3. procedure TForm1.Button1Click(Sender: TObject);
  4. var
  5. hFile, FileSize: integer;
  6. Buffer: array [0..20] of char;
  7. begin
  8. hFile:=_lopen('Prueba.txt', 0);
  9. _lread(hFile, @Buffer[0], 20);
  10. Button1.Caption:= SysToUTF8(Buffer);
  11. _lclose(hFile);
  12. end;

En el archivo prueba.txt está escrita la palabra "Camión", que es leída en Buffer y asignada como Caption de Button1 mediante  SysToUTF8, el resultado es el esperado.

 

 

Saludos.


  • 2

#4 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 23 mayo 2015 - 04:05

Lamentableente no estoy en mi PC, por lo que no tengo el código.

Pero, dado que no probé un código como el de Escafandra, supongo que es la solución, sobre todo porque no probé sar la función SysToUTF8. (y)

Muchas gracias, apenas pueda lo probaré y les aviso.

 

Ya pondré el código, quizá el programa entero.

 

Saludos

(b)


  • 0

#5 cram

cram

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 832 mensajes
  • LocationMisiones, Argentina

Escrito 24 mayo 2015 - 08:53

Y sí. Funciona de maravillas. Una vez más gracias Escafandra.

Aquí pego el código de la unidad principal de la mini-aplicación.


delphi
  1. {
  2.   Unidad principal de la aplicación Tabla Periódica
  3.   La aplicación sirve de puente entre un archivo con campos delimitados por coma
  4.   y un archivo binario generado con el resultado del proceso de separación.
  5.   Además permite leer el archivo producido por sí mismo acortando drásticamente
  6.   el tiempo de carga de los datos a memoria.
  7.   Muchos controles (la mayoría) llevan sus nombres por default, dado que no
  8.   se justifica el esfuerzo de nombrar a cada uno en este caso.
  9.   Las imágenes correspondiente a las estructuras cristalinas se encuentran en
  10.   un componente y son cargadas a memoria junto con la carga del ejecutable. El
  11.   orden de las mismas es importante al momento de su lectura, ya que se usa como
  12.   índice, por lo cual debe respetarse en la carga de los datos.
  13.  
  14.   Esta aplicación no se encuentra terminada. Ya que su interfaz está incompleta.
  15.   Para que se encuentre completa,los cambios que deberán darse son:
  16.   1. La ventana debe incluir la distribución típica de la tabla periódica
  17.   (aquella propuesta por Mendeleyev)
  18.   2. Acceso a los elementos mediante los cuadros de los elementos en la tabla
  19.   3. Ocultación de características como la conversión de CSV a BIN, ya que esto
  20.   no es una función final de la aplicación
  21.   4. Lectura automática del archivo binario y opción de búsqueda en caso de no
  22.   encontrarse.
  23.   5. Controlar errores, la aplicación actual carece de ellos.
  24.   6. Mejor organizacion de los campos en pantalla.
  25.   7. Una interfaz gráfica con controles más vistosos y en ubicaciones cómodas
  26.   8. Una ayuda, presentación y "Acerca de".
  27.   9. Mejorar la "inteligencia" del cuadro de búsqueda dejando que el programa
  28.   decida qué buscar de acuerdo con la cadena de caracteres ingresada, su
  29.   longitud, y características
  30.  
  31.   Carlos R. Micolis
  32.   Mayo, 2015
  33.  
  34.   Se agradece la colaboración de DelphiAccess, por la ayuda dada mediante la
  35.   respuesta de Escafandra con la función de conversión SysToUTF8, sin la cual
  36.   los datos se verían muy desagradables e incluso incomprensibles.
  37.   Los datos de la tabla fueron tomados de varias fuentes, entre ellas la
  38.   Wikipedia.
  39. --------------------------------------------------------------------------------
  40. }
  41. unit Principal;
  42.  
  43. {$mode objfpc}{$H+}
  44.  
  45. interface
  46.  
  47. uses
  48. Classes, SysUtils, db, BufDataset, memds, FileUtil, Forms, Controls,
  49. Graphics, Dialogs, StdCtrls, DbCtrls, ExtCtrls;
  50.  
  51. type
  52.  
  53. { TfrmPrincipal }
  54.  
  55. TfrmPrincipal = class(TForm)
  56. btLeer: TButton;
  57. btSalvar: TButton;
  58. btCargar: TButton;
  59. DBEdit1: TDBEdit;
  60. DBEdit10: TDBEdit;
  61. DBEdit11: TDBEdit;
  62. DBEdit12: TDBEdit;
  63. DBEdit13: TDBEdit;
  64. DBEdit14: TDBEdit;
  65. DBEdit15: TDBEdit;
  66. DBEdit16: TDBEdit;
  67. DBEdit17: TDBEdit;
  68. DBEdit18: TDBEdit;
  69. DBEdit19: TDBEdit;
  70. DBEdit2: TDBEdit;
  71. DBEdit20: TDBEdit;
  72. DBEdit21: TDBEdit;
  73. DBEdit22: TDBEdit;
  74. DBEdit23: TDBEdit;
  75. DBEdit24: TDBEdit;
  76. DBEdit25: TDBEdit;
  77. DBEdit26: TDBEdit;
  78. DBEdit27: TDBEdit;
  79. DBEdit28: TDBEdit;
  80. DBEdit29: TDBEdit;
  81. DBEdit3: TDBEdit;
  82. DBEdit30: TDBEdit;
  83. DBEdit31: TDBEdit;
  84. DBEdit32: TDBEdit;
  85. DBEdit33: TDBEdit;
  86. DBEdit34: TDBEdit;
  87. DBEdit4: TDBEdit;
  88. DBEdit5: TDBEdit;
  89. DBEdit6: TDBEdit;
  90. DBEdit7: TDBEdit;
  91. DBEdit8: TDBEdit;
  92. DBEdit9: TDBEdit;
  93. DBNavigator1: TDBNavigator;
  94. dsTabla: TDataSource;
  95. edValor: TEdit;
  96. ilEstrCrist: TImageList;
  97. imgEstrCrist: TImage;
  98. Label1: TLabel;
  99. Label10: TLabel;
  100. Label11: TLabel;
  101. Label12: TLabel;
  102. Label13: TLabel;
  103. Label14: TLabel;
  104. Label15: TLabel;
  105. Label16: TLabel;
  106. Label17: TLabel;
  107. Label18: TLabel;
  108. Label19: TLabel;
  109. Label2: TLabel;
  110. Label20: TLabel;
  111. Label21: TLabel;
  112. Label22: TLabel;
  113. Label23: TLabel;
  114. Label24: TLabel;
  115. Label25: TLabel;
  116. Label26: TLabel;
  117. Label27: TLabel;
  118. Label28: TLabel;
  119. Label29: TLabel;
  120. Label3: TLabel;
  121. Label30: TLabel;
  122. Label31: TLabel;
  123. Label32: TLabel;
  124. Label33: TLabel;
  125. Label34: TLabel;
  126. Label4: TLabel;
  127. Label5: TLabel;
  128. Label6: TLabel;
  129. Label7: TLabel;
  130. Label8: TLabel;
  131. Label9: TLabel;
  132. memTabla: TMemDataset;
  133. odFuente: TOpenDialog;
  134. rgBuscar: TRadioGroup;
  135. sdMemTable: TSaveDialog;
  136. procedure btCargarClick(Sender: TObject);
  137. procedure btLeerClick(Sender: TObject);
  138. procedure btSalvarClick(Sender: TObject);
  139. procedure dsTablaDataChange(Sender: TObject);
  140. procedure edValorKeyPress(Sender: TObject; var Key: char);
  141. private
  142. public
  143. { public declarations }
  144. end;
  145.  
  146. var
  147. frmPrincipal: TfrmPrincipal;
  148.  
  149. implementation
  150.  
  151. {$R *.lfm}
  152.  
  153. { TfrmPrincipal }
  154.  
  155. procedure TfrmPrincipal.btLeerClick(Sender: TObject);
  156. // Lee líneas de texto de un archivo con campos separados por coma y los
  157. // convierte en campos de una tabla en memoria
  158. var
  159. F: Textfile;
  160. C, R: String;
  161. I, J: Integer; // I cuenta los campos y J la posición de un caracter
  162.  
  163. begin
  164. // Prepara y ejecuta el diálogo de apertura de archivo
  165. odFuente.Filter:= 'Texto|*.txt;*.csv';
  166. odFuente.DefaultExt:= '*.csv';
  167. if odFuente.Execute then
  168. begin
  169. AssignFile(F, odFuente.FileName);
  170. Reset(F);
  171. dsTabla.DataSet.Open;
  172. dsTabla.DataSet.DisableControls;
  173. dsTabla.DataSet.First;
  174. // Bucle donde se lee una línea del archivo y se la procesa separando cada
  175. // campo utilizando el punto y coma y el fin de la misma.
  176. while not Eof(F) do
  177. begin
  178. ReadLn(F, R);
  179. R:= SysToUtf8(R);
  180. dsTabla.DataSet.Append;
  181. J:= 1;
  182. I:= 0;
  183. repeat
  184. C:= '';
  185. while (J <= Length(R)) and (R[J] <> ';') do
  186. begin
  187. C:= C + R[J]; // Aquí se agrega un caracter al campo
  188. Inc(J);
  189. end;
  190. dsTabla.DataSet.Fields[I].Value:= C;
  191. Inc(I);
  192. if R[J] = ';' then Inc(J);
  193. until J > Length(R);
  194. dsTabla.DataSet.Post;
  195. end;
  196. CloseFile(F);
  197. dsTabla.DataSet.EnableControls;
  198. end else ShowMessage('Cancelado por el usuario');
  199. end;
  200.  
  201. procedure TfrmPrincipal.btCargarClick(Sender: TObject);
  202. // Lee un archivo binario previamente creado por esta misma aplicación
  203. begin
  204. odFuente.Filter:= 'Binario|*.bin';
  205. odFuente.DefaultExt:= '*.bin';
  206. memTabla.Close;
  207. if odFuente.Execute
  208. then memTabla.LoadFromFile(odFuente.FileName);
  209. memTabla.Open;
  210. end;
  211.  
  212. procedure TfrmPrincipal.btSalvarClick(Sender: TObject);
  213. // Escribe los datos de la tabla en memoria a un archivo binario
  214. begin
  215. if dsTabla.DataSet.IsEmpty then ShowMessage('La tabla está vacía')
  216. else if sdMemTable.Execute
  217. then memTabla.SaveToFile(sdMemTable.FileName)
  218. else ShowMessage('Escritura cancelada por el usuario');
  219. end;
  220.  
  221. procedure TfrmPrincipal.dsTablaDataChange(Sender: TObject);
  222. // Cambia la imagen de la estructura cristalina, que está almacenada mediante
  223. // componente TImageList
  224. begin
  225. if not memTabla.IsEmpty then
  226. begin
  227. ilEstrCrist.GetBitmap(StrToInt(
  228. dsTabla.DataSet.FieldByName('CodEstrCrist').AsString) -1,
  229. imgEstrCrist.Picture.Bitmap);
  230. imgEstrCrist.Repaint;
  231. end;
  232. end;
  233.  
  234. procedure TfrmPrincipal.edValorKeyPress(Sender: TObject; var Key: char);
  235. // Busca la primer coincidencia de la cadena ingresada con el valor de un campo
  236. // seleccionado en un TRadioGroup
  237. var
  238. NombreCampo, ValorCampo: String;
  239. begin
  240. if Key = #13 then
  241. begin
  242. case rgBuscar.ItemIndex of
  243. 0: NombreCampo:= 'Simbolo';
  244. 1: NombreCampo:= 'Nombre';
  245. 2: NombreCampo:= 'NumeroAtomico';
  246. end;
  247. ValorCampo:= edValor.Text;
  248. // Se ignoran las mayúsculas y se buscan coincidencias parciales
  249. if not memTabla.Locate(NombreCampo, ValorCampo, [loCaseInsensitive, loPartialKey])
  250. then ShowMessage('No se halla coincidencia');
  251. end;
  252. end;
  253.  
  254. end.


  • 0

#6 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 24 mayo 2015 - 02:08

Me alegra de que te solucionase el problema. 27.gif

 

Saludos.


  • 0





Etiquetado también con una o más de estas palabras: acentos, caracteres especiales, UTF8, ANSI

IP.Board spam blocked by CleanTalk.