Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   convertir unicode string to char en c++ builder (https://www.clubdelphi.com/foros/showthread.php?t=80995)

LuisMiguel 30-09-2012 22:17:53

convertir unicode string to char en c++ builder
 
Saludos a todos
Necesito convertir un String 'o UnicodeString a un char *

char * a = "Ejemplo"; // El resultado de esto es: "Ejemplo";
String a = "Ejemplo"; // El resultado de esto es: L"Ejemplo";

Como ven la (L) esta delante de lo que me da como resultado,cosa que quisiera eliminar porque asi me da error en lo que estoy haciendo.

lmpadron 01-10-2012 15:25:35

Cita:

Empezado por LuisMiguel (Mensaje 445876)
Saludos a todos
Necesito convertir un String 'o UnicodeString a un char *

char * a = "Ejemplo"; // El resultado de esto es: "Ejemplo";
String a = "Ejemplo"; // El resultado de esto es: L"Ejemplo";

Como ven la (L) esta delante de lo que me da como resultado,cosa que quisiera eliminar porque asi me da error en lo que estoy haciendo.

Saludos

Revisa este link puede que te sirva

escafandra 01-10-2012 18:45:07

Cita:

Empezado por LuisMiguel (Mensaje 445876)
Saludos a todos
Necesito convertir un String 'o UnicodeString a un char *

char * a = "Ejemplo"; // El resultado de esto es: "Ejemplo";
String a = "Ejemplo"; // El resultado de esto es: L"Ejemplo";

Como ven la (L) esta delante de lo que me da como resultado,cosa que quisiera eliminar porque asi me da error en lo que estoy haciendo.

La "L" es una notación, no aparece en la cadena.
1.- Si tienes activada en las opciones del proyecto: _TCHAR maps to = char entonces y partiendo un un String Unicode, la función t_str() te devuelve una cadena tipo char*.
2.- Si tienes activada en las opciones del proyecto: _TCHAR maps to = wchar_t entonces y partiendo un un String Unicode, la función t_str() te devuelve una cadena tipo wchar_t*.
3.- c_str() siempre devuelve un wchar_t si se aplica a un UnicodeString.
4.- Siempre puedes forzar la conversión a AnsiString y aplicar c_str():
Código Delphi [-]
char *c = AnsiString(L"HOLA").c_str();


Saludos.

LuisMiguel 01-10-2012 22:12:36

Gracias amigos por contestar
Estuve probando las variantes que me dieron pero aun sigue mi el problema
Voy a explicar mejor lo que quiero lograr,quizas este cometiendo algun error,
En la exportacion de un excel quiero dar la opcion de que se escoja la carpeta donde se va a guardar ese excel,para ello obtengo la direccion de un DirectoryListBox1 y lo paso a un Edit,en otro Edit doy la opcion para ponerle el nombre al excel
Código:

  String Direccion = Edit1->Text;
  String Nombre = Edit2->Text;
  String Barras = "\\";
  String Salvar = Direccion + Barras+ Nombre + ".xlsx";
  char *c = AnsiString (Salvar).c_str();

cuando trato de salvarlo en esta linea me da error:no se puede tener acceso al archivo,intente lo siguiente: ....... y pone unas cuantas cosas.
Código:

Excel.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs", c);
Si le pongo la direccion donde quiero salvar el excel directamente funciona perfectamente
Código:

Excel.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs","D:\\prueba.xlsx");
En si lo que quisiera lograr es que : c tuviera ese valor("D:\\prueba.xlsx")
Gracias por su tiempo!!

ecfisa 01-10-2012 22:20:27

Cita:

Empezado por LuisMiguel (Mensaje 445991)
En si lo que quisiera lograr es que : c tuviera ese valor("D:\\prueba.xlsx")

Hola.

Entonces creo que podrías simplemente hacer:
Código:

  String Salvar = Edit1->Text + "\\\\" + Edit2->Text + ".xlsx";
  char *c = Salvar.c_str();
  ...

Saludos.

Edito: Y se puede reducir el código un poco más:
Código:

  char *c = AnsiString(Edit1->Text + "\\\\" + Edit2->Text + ".xlsx").c_str();
  ...


LuisMiguel 01-10-2012 22:47:29

saludos ecfisa
Me sigue dando el mismo error:
Compruebe que la carpeta especificada existe. Compruebe que la carpeta que contiene el archivo no es de solo lectura. Compruebe que el archivo no contiene ninguno de los siguientes caracteres: < > ? [ ] : | o * Compruebe que el nombre del archivo o de la ruta no tienen mas de 218 caracteres.

Sin embargo como le decia cuando lo pongo directamente funciona
Código:

Excel.OlePropertyGet("Workbooks").OlePropertyGet("Item",1).OleProcedure("SaveAs","D:\\prueba.xlsx");

ecfisa 01-10-2012 22:59:30

Hola LuisMiguel.

Pero ese eror no proviene de la composición de la cadena, cuyo valor es fácilmente comprobable:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender) {
  TCaption a = "D:",
          b = "\\\\",
          c = "prueba",
          d = ".xlsx";
  ShowMessage(AnsiString(a+b+c+d).c_str());
}

Saludos.

LuisMiguel 01-10-2012 23:16:08

Hice la siguiente prueba con lo que usted me dijo:
Código:

  char *b = AnsiString(Edit1->Text + "\\\\" + Edit2->Text + ".xlsx").c_str();//  resultado D:\backups\\prueba.xlsx
  char *c = "D:\\backups\\prueba.xlsx"; // resultado D:\backups\prueba.xlsx
  ShowMessage(b);
  ShowMessage(c);

Como ve el resultado de las 2 cadenas son diferentes.
Quizas el detalle este en las \\\\ que tiene
Código:

char *b = AnsiString(Edit1->Text + "\\\\" + Edit2->Text + ".xlsx").c_str();

LuisMiguel 01-10-2012 23:20:26

probe como me dijo y devuelve: Tipo de variable incorrecto

ecfisa 01-10-2012 23:24:49

Hola LuisMiguel
.
Cita:

Quizas el detalle este en las \\\\ que tiene
Si claro, de ese modo agrega "\\", eso interpreté cuando dijiste
Cita:

lo que quisiera lograr es que : c tuviera ese valor("D:\\prueba.xlsx")
Te hago una consulta, ¿ Que valores tienen Edit1->Text y Edit2->Text exáctamente ? (no lo que muestra sino lo que le ingresas)

Saludos.

LuisMiguel 01-10-2012 23:31:07

Lo que ingreso
Edit1 D:\backups
Edit2 prueba

ecfisa 01-10-2012 23:50:14

Cita:

Empezado por LuisMiguel (Mensaje 446009)
Lo que ingreso
Edit1 D:\backups
Edit2 prueba

Hola.

Dado tu ingreso, si deseas como resultado: "D:\backups\Prueba.xlsx" podés hacer:
Código:

  String s = Edit1->Text;

  char *c = AnsiString(IncludeTrailingPathDelimiter(s)+
                      Edit2->Text+".xlsx").c_str();

Si deseas como resultado: "D:\\bakcups\\Prueba.xlsx":
Código:

AnsiString s = Edit1->Text;

  s = s.SubString(0,s.Pos("\\")) + "\\" +
      s.SubString(s.Pos("\\")+1,s.Length()) +
      + "\\\\" + Edit2->Text + ".xlsx";
 char *c = AnsiString(s).c_str();

Saludos

LuisMiguel 02-10-2012 01:03:52

Finalmente la solucion para exportarlo es con:
Código:

String s = Edit1->Text;
  char *c = AnsiString(IncludeTrailingPathDelimiter(s)+
                      Edit2->Text+".xlsx").c_str();

Muchismas gracias por su tiempo y por su ayuda.Funciona perfectamente!!!


La franja horaria es GMT +2. Ahora son las 14:00:25.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi