[Lazarus-es] Funci?n para convertir n?mero a cadena

JoshyFun joshyfun en gmail.com
Mie Dic 9 19:36:10 CET 2009


Hello Ismael,

Wednesday, December 9, 2009, 6:34:53 PM, you wrote:

ILDGa> De esa forma funciona pero no devuelve lo mismo.
ILDGa> Si quiere mira en pantalla para que veas: los códigos por ejemplo de 148,
ILDGa> 149 y 156

Aquí podemos vernos con varios problemas que se quedan ocultos entre
la maraña de conversiones y codepages.

ILDGa> El problema que tengo es que tengo aplicaciones
ILDGa> corriendo en Visual Basic 6 
ILDGa> y ahora no logro crear la función que me devuelva lo mismo con Lazarus, ya

Lo que podrías hacer por ejemplo es poner una cadena de ejemplo como
origen de datos, otra cadena con el resultado que da VB6 y cualquiera
de nosotros puede intentar realizar una función que haga la conversión
que tu esperas. Pero tenemos que daber de donde vienen los datos y en
que codificación. Por ejemplo si vienen de un textbox en Lazarus estos
vendrán en UTF-8, pero si vienen de la base de datos vendrán en ANSI
(ya que así las tienes diseñadas creo).

ILDGa> que AnsiToUTF8(Char(149)) <> Asc(149). Y esto me trae el embrollo de no

Eso no puede ser lo mismo nunca :) Asc(149) eso es de VB no ? Si es
así char(149)=asc(149) ya que un "char" no tiene codificación de
ningún tipo, un char es un byte que se usa en cadenas de texto.

Si quieres poner las funciones en VB6 (yo programaba en VB6, hace
tiempo pero creo que recordaré como iba) e intento hacer lo mismo en
Pascal.

Resumiendo el problema, las strings que le envias a lazarus (ojo,
lazarus no es freepascal) deben ir en UTF-8, y el contestará con UTF-8
también. Si lo que quieres es trabajar con ANSI (que es lo que veo que
necesitas) siempre que leas algo de un textbox, de un memo, o de
cualquier sitio tendrás que convertir de UTF-8 a ANSI antes de hacer
nada, y al revés si quieres enviarlo a los controles visuales.

FreePascal no es UTF-8 si no ANSI, por lo tanto las funciones que no
son visuales (son de freepascal) trabajan en ANSI, como los nombres de
ficheros y alguna cosa más.

Otras funciones de freepascal como RightStr, LeftStr, etc, trabajan en
ANSI pero se pueden usar en UTF-8 en muchos casos, pero hay que tener
cuidado porque en UTF-8 lo caracteres no tienen por qué ocupar un 1
byte, si no que pueden ocupar hasta 4 dependiendo del caracter que
sea. Así esto:

p:=pos(Cadena,'a');
r:=LeftStr(Cadena,p);

es perfectamente válido, esto:

p:=pos(Cadena,'á');
r:=LeftStr(Cadena,p);

no lo es, ya que en UTF-8 'á' son 2 bytes o 2 chars y el resultado
puede no ser el deseado.

ILDGa> poder atacar la misma base de datos con aplicaciones realizadas en los
ILDGa> diferentes lenguajes, cuestión esta que es
ILDGa> imprescindible para mi hasta que 
ILDGa> no migre todas las aplicaciones, que de hecho son bastantes. Esto sin contar
ILDGa> mi conocimiento nulo de Lazarus o Delphi y por
ILDGa> consiguiente el retrazo que 
ILDGa> esto trae en la migración.

Es comprensible, uno no va a cambiar una base de datos que funciona,
por lo menos por ahora.

ILDGa> Por lo que veo tendré que rehacer la función en VB6

Todo lo que puede hacer VB6 lo puede hacer Lazarus, al reves no.

PD: Por cierto, a lo del MaskEdit no te he contestado por que
desconozco totalmente el tema y no quiero dar ideas falsas.

-- 
Best regards,
 JoshyFun





More information about the Lazarus-es mailing list