PDA

Ver la Versión Completa : error al pasar una cadena de delphi7 a delphi 10.3


tiqui_loquito
28-07-2020, 23:42:19
Hola a todos

Estoy realizando conexión entre delphi7 y delphi10.3

En delphi7 tenemos el aplicativos que esa el cliente y en delphi10.3 realice una bpl para conectarse a un servicio mediante el post.

Lo que sucede es que envío una cadena desde delphi7 a la bpl pero al llegar a la BPL me llega en caracteres chinos. Se que hay un problema de conversión pero aún no logro encontrar la solución, espero me puedan ayudar.


var
vCadena: string;
begin
vCadena := 'Esta es una cadena de prueba sel servico';

TU_ServicioCliente.ServicioPrueba(vCadena);//procedimiento en la BPL


Gracias

tiqui_loquito
29-07-2020, 01:20:08
Solucione el inconveniente con algo de investigación y cacharreo

Por ahora me ha funcionado, tengo que ver con cadenas con más caracteres.

En delphi7 define la variable como AnsiString


var
vCadena: AnsiString;
begin
vCadena := 'Esta es una cadena de prueba sel servico';


y en el servicio igual. Aunque me toco usar UTF8ToWideString, ya que al asignar la variable al label me la enviaba vacía.


procedure TForm2.validarCadena(pCadena: AnsiString);
begin
Label1.Caption := UTF8ToWideString(pCadena);



Espero a alguien le sea de ayuda alguna vez

MaxiDucoli
29-07-2020, 01:20:34
No será problemas con la configuración UTF-8?

ElKurgan
29-07-2020, 16:28:13
Este problema se ha tratado muchas veces en el foro. A partir de la versión 2009 de Delphi, los antiguos String son ahora AnsiString, y los antiguos WideString son los actuales String. Lo mismo pasa con PChar y PAnsiChar. Todo ello con vistas a soportar Unicode en la herramienta.

Saludos

Al González
07-09-2020, 06:02:19
A partir de la versión 2009 de Delphi, los antiguos String son ahora AnsiString, y los antiguos WideString son los actuales String. Lo mismo pasa con PChar y PAnsiChar. Todo ello con vistas a soportar Unicode
Me siento obligado a enmendar una pequeña parte de tu respuesta, ElKurgan. Qué gusto leerte nuevamente, por cierto. :)

WideString sigue siendo único en su diseño y comportamiento. Ciertamente es Unicode como el String actual, y el valor de ambos se representa como una matriz (array) unidimensional de WideChars. Pero tienen una diferencia importante:

String1 := String2;
hace que String1 apunte a la misma dirección de memoria que String2, sin copiar realmente ningún carácter. Solo se incrementa en 1 el contador de referencias de la cadena, un pequeño campo numérico interno que indica cuántas variables String están apuntando al mismo contenido. String (o UnicodeString) es un tipo de dato eficiente y ágil para tratar con cadenas de caracteres.

Mientras que
WideString1 := WideString2;
realmente crea una copia del valor de WideString2, de tal manera que resulta en dos cadenas con los mismos caracteres, y por lógica en un mayor consumo de memoria. A diferencia de String, WideString no usa un contador de referencias. Este tipo de dato es apropiado para usarlo con interfaces COM, donde las cadenas expuestas por la interfaz (en forma de propiedades) o recibidas por la misma (en forma de parámetros) no emplean un contador de referencias.