Hola Angel.Matilla
Cita:
Empezado por Angel.Matilla
...
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
...
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
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) {
TIniFile* ini = new TIniFile (iniName);
TStrings* sl = new TStringList;
ini->ReadSectionValues("Datos", sl);
for(int i = 0; i < sl->Count; i++)
sl->Strings[i] = sl->Strings[i].SubString(sl->Strings[i].Pos("=")+1, MaxInt);
Memo2->Clear();
Memo2->Lines->Assign(sl);
// (*)
AnsiString Entorno = sl->Strings[0].SubString(sl->Strings[0].Pos("=")+1, MaxInt);
ShowMessage(Entorno);
delete ini;
delete sl;
}
Cita:
Empezado por Angel.Matilla
...
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