Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-04-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿No limpiarás las variables antes de volver a leerlas?
Responder Con Cita
  #2  
Antiguo 01-04-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿No limpiarás las variables antes de volver a leerlas?
No. Las inicializo al principio de la función. No quería extenderme en exceso proque hay llamadas a funciones externas y demás, pero este es el código completo que estoy usando:
Código:
void __fastcall TfPersona::FormCreate(TObject *Sender)
{
    BROWSEINFO bi;
    int nDirectorio = 0;
    LPITEMIDLIST ItemID;
    TStringList *slIniFile = new TStringList();
    UnicodeString cInicio;
    wchar_t WDir[MAX_PATH], FolderName[MAX_PATH];

    UnicodeString cAcceso  = "";
    UnicodeString cEntorno = "";
    UnicodeString cTablas  = "";

    cAux = ChangeFileExt(Application->ExeName, ".ini");
    if (!FileExists(cAux))
    {
        slBotones->Clear();
        slBotones->Text = "Buscar\r\nCancelar";
        if (Mensaje(this, String("Instalación"), String("Indique la situación de la base de datos"), tdiShield, slBotones) == mrCancel)
        {
            slBotones->Text = "Abandonar";
            Mensaje(this, String("Instalación"), String("No puede iniciarse la sesión.\r\nDesconozco la situación de los ficheros."), tdiError, slBotones);
            Application->Terminate();
            return;
        }

        while (nDirectorio == 0)
        {
            memset(&bi, 0, sizeof(BROWSEINFO));
            memset(WDir, 0, MAX_PATH);
            bi.hwndOwner = NULL;
            bi.pszDisplayName = FolderName;
            bi.lpszTitle = String("Seleccione la situación de la base de datos").c_str();
            ItemID = SHBrowseForFolder(&bi);
            SHGetPathFromIDList(ItemID, WDir);
            GlobalFreePtr(ItemID);
            cInicio = String(WDir);

            if (cInicio == "")
            {
                slBotones->Text = "Abandonar";
                Mensaje(this, String("Instalación"), String("No puede iniciarse la sesión.\r\nDesconozco la situación de los ficheros."), tdiError, slBotones);
                Application->Terminate();
                return;
            }

            if (cInicio[1] > 'B')
               {
                    if (cInicio.LastDelimiter("\\") == cInicio.Length())
                         cInicio = cInicio.SubString(1, cInicio.LastDelimiter("\\") - 1);

                    cAux = "La base de datos de afiliados se ";
                    if (DirectoryExists(cInicio + "\\DatAfi21"))
                         cAux = cAux + "encuentra";
                    else
                         cAux = cAux + "creará";
                    cAux = cAux + " en:\r\n\r\n" + cInicio + "\\DatAfi21\r\n\r\n¿Es correcta la elección?";
                slBotones->Text = "Es correcta\r\nCambiar ubicación";
                if (Mensaje(this, String("Instalación"), cAux, tdiNone, slBotones) == 100)
                {
                    nDirectorio = 1;
                    try
                    {
                        System::ChDir(cInicio);
                    }
                    catch(...)
                    {
                        slBotones->Text = "Volver";
                        Mensaje(this, String("Instalación"), String("La vía seleccionada no está accesible.\r\nRevise su elección, por favor."), tdiError, slBotones);
                              nDirectorio = 0;
                         }
                    }
               }
               else
            {
                slBotones->Text = "Volver";
                Mensaje(this, String("Instalación"), String("La vía seleccionada no está accesible.\r\nRevise su elección, por favor."), tdiError, slBotones);
                nDirectorio = 0;
               }
        }

        TIniFile *fIni = new TIniFile(ChangeFileExt(Application->ExeName, ".ini"));
        fIni->WriteString("DATOS", "Entorno", cInicio + "\\DatAfi21\\Gia.ini");
        fIni->WriteString("DATOS", "Acceso" , cInicio + "\\DatAfi21\\Acceso");
        fIni->WriteString("DATOS", "Tablas" , cInicio + "\\DatAfi21\\Tablas");
        delete fIni;
    }

    TIniFile *fIni = new TIniFile(ChangeFileExt(Application->ExeName, ".ini"));
    fIni->ReadSectionValues(UnicodeString("DATOS"), slIniFile);
    cEntorno = UnicodeString(fIni->ReadString(UnicodeString("DATOS"), "Entorno", cEntorno));
    cAcceso  = UnicodeString(fIni->ReadString(UnicodeString("DATOS"), "Acceso" , cAcceso));
    cTablas  = UnicodeString(fIni->ReadString(UnicodeString("DATOS"), "Tablas" , cTablas));
    delete fIni;
}
Responder Con Cita
  #3  
Antiguo 01-04-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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;
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.
Responder Con Cita
  #4  
Antiguo 01-04-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 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
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Leer fichero XML itsi Internet 1 23-10-2008 22:50:15
Leer parte de un fichero .RTf Tonio Varios 2 27-03-2008 11:25:53
leer de fichero machingol Varios 7 09-05-2007 17:22:42
Leer fichero rocio84 Varios 1 21-05-2006 10:45:06
Leer un fichero .ini oesteve OOP 6 16-06-2003 16:40:20


La franja horaria es GMT +2. Ahora son las 17:03:26.


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
Copyright 1996-2007 Club Delphi