Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Otra corrupción de cadenas en Builder2010 (Maldito unicode)

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Otra corrupción de cadenas en Builder2010 (Maldito unicode) Responder citando

Buenas de nuevo,

Vengo con otro caso que no comprendo.
Tengo la siguiente funcion que ajusta una cadena de caracteres a una longitud determinada y rellena por la izquierda o por la derecha con el caracter que aparece en sRelleno.

Código:

String Tfrm_principal::Ajusta(String sCampo, String sOrientacion,int iLongitud, wchar_t sRelleno)
{
   String Result="";
   Result=sCampo.Trim();

   if (Result.Length() > iLongitud)
   {
     Result = Result.SubString(1,iLongitud);
   }
   else
   {
     if (sOrientacion=="I")  //Relleno por la izquierda
     {
       Result = String::StringOfChar(sRelleno,iLongitud - sCampo.Length())+sCampo;
     }
     else
     {
       Result = sCampo+String::StringOfChar(sRelleno,iLongitud - sCampo.Length());
     }
   }
   return Result;
}


Bien, pues ¿alguien me puede explicar porque cuando se hace Trim(), me corrompe la cadena Result?

Y si comento esta función, cuando llega al StringOfChar también me lo corrompe, y en Embarcadero dicen que esta función se ha portado.

Un ejemplo de llamada que realizo es:

Código:

linea+=Ajusta(query_cms->FieldByName("num_poliza_k")->AsString,"D",20,' ');



Por favor, se trata de un marrón que tengo que solucionar hoy.
Muchas gracias a todos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Haz una prueba, cambia la siguiente línea:

    linea+=Ajusta(query_cms->FieldByName("num_poliza_k")->AsString,"D",20,' ');

por:

    linea+=Ajusta(query_cms->FieldByName("num_poliza_k")->AsString.c_str(),"D",20,' ');


Si, ya se que parece que no tiene mucho sentido, pero pruébalo y dime si notas alguna diferencia. Tampoco has dicho si estas pruebas te generan alguna excepción ? o las estas ignorando ?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias _Leo, funciona sin problemas.


¿Tiene una explicación razonable?, porqué me estoy volviendo loco.
Si el parametro es una cadena String y estoy pasando por valor, ¿porque ocurre esto?

Es más, he probado con _TCHAR maps a char y a wchar_t, y ocurría lo mismo.

¿Me aconsejas algo para que evite estos errores, o es inevitable?
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Es un error de la versión 2010, en las anteriores no ocurre.. el problema esta en que parece que llama al destructor antes de tiempo.

Una forma de reproducir el problema, ponemos el siguiente código en el OnClick de un botón:
Código:
    struct TSomeField
    {
        String GetAsString() { return "CORRECTO"; };
        __property String AsString = { read = GetAsString };
        String SomeField;
    };

    struct LOCAL {
        static void SomeFunction(String str, void*)
        {
            String wrongVersion = "INCORRECTO";
            ShowMessage(str);
        }
    };

    LOCAL::SomeFunction(TSomeField().AsString, 0);

Al pulsar debería mostrar la cadena: "CORRECTO", pero no lo hace.

Tienes más detalles sobre este problema en los siguientes posts del foro de Embarcadero:

    https://forums.embarcadero.com/thread.jspa?threadID=31033
    https://forums.embarcadero.com/thread.jspa?threadID=29072

Y en los siguientes partes de errores:

    http://qc.embarcadero.com/wc/qcmain.aspx?d=78772
    http://qc.embarcadero.com/wc/qcmain.aspx?d=80204
    http://qc.embarcadero.com/wc/qcmain.aspx?d=81101
    http://qc.embarcadero.com/wc/qcmain.aspx?d=82558

---

Y la razón por la que funciona haciendo ese cambio en la respuesta anterior, es porque de esta manera le obligamos a crear una variable temporal que será la que pasara a la función. Otras formas de evitarlo en tu código anterior podrían ser:

- Creando una variable temporal (similar al anterior):

    linea+=Ajusta(String(query_cms->FieldByName("num_poliza_k")->AsString),"D",20,' ');

o:

    String temporal = query_cms->FieldByName("num_poliza_k")->AsString;
    linea+=Ajusta(temporal,"D",20,' ');

- Otra forma que funciona es pasando la variable por referencia:

    String Tfrm_principal::Ajusta(const String& sCampo, String sOrientacion,int iLongitud, wchar_t sRelleno)
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Shocked
Bueno, pues por un lado, me tranquiliza pensar que no estoy paranoico, y que supongo se solucione este error en algún Update.

Por otro, pues bueno, me toca revisarme quintillones lineas de código

Gracias _Leo por la informacion
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.