Ver Mensaje Individual
  #12  
Antiguo 01-04-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Angel.Matilla

Cita:
Empezado por Angel.Matilla Ver Mensaje
...
Sin embargo si trato de leerlo con este otro código:
Código:
TIniFile *fIni = new TIniFile(ChangeFileExt(Application->ExeName, ".ini"));
cEntorno = fIni->ReadString("Datos", "Entorno", cEntorno);
cAcceso  = fIni->ReadString("Datos", "Acceso" , cAcceso);
cTablas  = fIni->ReadString("Datos", "Tablas" , cTablas);
delete fIni;
Siempre me devuelve cadenas vacías y no entiendo el motivo. Y me da lo mismo hacerlo sobre Builde 6 que sobre Builder XE3.
En C++ Builder 6 ese código no devuelve cadenas vacías (#7).

Cita:
Empezado por Angel.Matilla Ver Mensaje
...
Me he dado cuenta que si pongo esto:
Código:
TStringList *slIniFile = new TStringList();
TIniFile *fIni = new TIniFile(ChangeFileExt(Application->ExeName, ".ini"));
fIni->ReadSectionValues(UnicodeString("DATOS"), slIniFile);
cAux = slIniFile->Text;
en este slIniFile->Text aparece esto mirando con el depurador:
Cita:
"Entorno=C:\\DatAfi21\\Gia.ini\r\nAcceso=C:\\DatAfi21\\Acceso\r\nTablas=C:\\DatAfi21\\Tablas\r\n "
lo que significa que estar la información está, pero si hago esto:
Código:
cEntorno = slIniFile->Strings[0];
que en teoría debería valer Entorno=C:\\DatAfi21\\Gia.ini, ¡no hay ningún valor en la variable!Me devuelve NULL.
Me tiene total y aboslutamente despistado.
En C++ Builder 6, slIniFile->Strings[0] tiene el valor: Entorno=C:\DatAfi21\DatAfi21\Gia.ini

En resumen, tal como ya te comente en el mensaje #7, en C++ Builder 6 ambos casos funcionan.

Cita:
Empezado por Angel.Matilla Ver Mensaje
Después de toda la mañana dando vueltas y probando diferentes códigos he encontardo, más o menos. una solución.
Código:
TIniFile *fIni = new TIniFile(cIniFile);
TStringList *Entorno  = new TStringList();
fIni->ReadSectionValues("Datos", Entorno);

Entorno->Strings[0] = Entorno->Strings[0].SubString(Entorno->Strings[0].Pos("=") + 1, Entorno->Strings[0].Length());
Entorno->Strings[1] = Entorno->Strings[1].SubString(Entorno->Strings[1].Pos("=") + 1, Entorno->Strings[1].Length());
Entorno->Strings[2] = Entorno->Strings[2].SubString(Entorno->Strings[2].Pos("=") + 1, Entorno->Strings[2].Length());
delete fIni;
...
Pero eso es otra cosa que lo que mencionas en el primer mensaje. Ahora de lo obtenido con ReadSectionValues queres obtener la parte de la cadena posterior al "="...

La forma que expones es correcta, aunque podes ahorrar un poco de código usando un ciclo:
Código PHP:
void __fastcall TForm1::afterEqual(TObject *Sender) {
  
TIniFileini = new TIniFile (iniName);
  
TStringssl = new TStringList;

  
ini->ReadSectionValues("Datos"sl);
  for(
int i 0sl->Counti++)
    
sl->Strings[i] = sl->Strings[i].SubString(sl->Strings[i].Pos("=")+1MaxInt);

  
Memo2->Clear();
  
Memo2->Lines->Assign(sl);

  
// (*)
  
AnsiString Entorno sl->Strings[0].SubString(sl->Strings[0].Pos("=")+1MaxInt);
  
ShowMessage(Entorno);

  
delete ini;
  
delete sl;

Cita:
Empezado por Angel.Matilla Ver Mensaje
...
No es la forma que más me seduce pero no he encontrado otra ya que si trato de hacer esto:
Código:
UnicodeString cEntorno = Entorno->Strings[0].SubString(Entorno->Strings[0].Pos("=") + 1, Entorno->Strings[0].Length());
dentro de la variable me devuelve siempre una cadena vacía.
Como muestro bajo el comentario (*), en C++ Builder 6 no devuelve cadena vacía

Sobre si C++ Builder XE3 o el comportamiento de la función UnicodeString varían de algún modo el resultado lo ignoro, ya que mi versión de C++ Builder no la incluye.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita