Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802

    TStrings e recupero dati da file INI

    Ciao a tutti,
    da un file INI vorrei recuperare tutte le stringhe di una sezione per infilarle allegramente in una TStrings (nel codice è ElencoIp) che mi servirà per elaborare i dati per poi inserirli in una ListBox. Il problema è che mi da Access Violation.

    Il codice che uso:
    //leggo i dati dalla sezione e li infilo in ElencoIp
    ConfigFile.ReadSectionValues('ipaddress', ElencoIp);


    Cos'ha che non và? Se al posto di ElencoIp uso direttamente la ListBox in questo modo funziona: ConfigFile.ReadSectionValues('ipaddress', ListBox.Items);

    Eppure dovrebbe essere identica la cosa visto che tutti e due gli oggetti sono TStrings. Qualcuno che mi da una mano?

    Grazie
    www.beppegrillo.it
    Il blog di Beppe!!

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Il codice è insufficiente. ConfigFile è stato inizializzato? Se sì, come?

    Non si deve usare TStrings: come indicato nella Guida in linea, si tratta di una classe astratta, quindi non può essere direttamente istanziata normalmente (in alcuni linguaggi, come Delphi, è possibile, in altri no).

    E' necessario creare un'istanza di una classe discendente da TStrings, ad esempio TStringList.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802
    codice:
    constructor TConnectionForm.Create(AOwner: TComponent);
    var
      ConfigFile: TIniFile;
      ElencoIp: TStringList;
      lang: string;
      I: integer;
    begin
      inherited Create(AOwner);
    
    begin
        ConfigFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'Config\conf.ini');
    try
        lang := ConfigFile.ReadString('Lang', 'Language', 'ERRORE');
        LabelConnection.Caption := ConfigFile.ReadString(lang, 'LabelConnection', 'ERROR');
        ButtonConnect.Caption := ConfigFile.ReadString(lang, 'ButtonConnectionConnect', 'ERROR');
        ButtonDisconnect.Caption := ConfigFile.ReadString(lang, 'ButtonConnectionDisconnect', 'ERRORE');
        ConfigFile.ReadSectionValues('ipaddress', ElencoIp);
        ShowMessage(ElencoIp[0]);
        MessageConnection := ConfigFile.ReadString(lang, 'MessageConnection', 'ERROR');
    finally
        ConfigFile.Free;
    end;
    end;
    end;
    Questo è il codice pseudo-completo, ho eliminato un po di commenti e ora ElencoIp è di tipo TStringList ma il problema non cambia e ho sempre access violation.
    www.beppegrillo.it
    Il blog di Beppe!!

  4. #4
    Utente di HTML.it L'avatar di colde
    Registrato dal
    Feb 2001
    Messaggi
    1,802
    Scusami come non detto. Maledetta creazione!!
    ElencoIp := TStringList.Create();
    Il problema era quello.

    Grazie
    www.beppegrillo.it
    Il blog di Beppe!!

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da colde
    ora ElencoIp è di tipo TStringList ma il problema non cambia e ho sempre access violation.
    Quando c'è un Access Violation, al 99,9% si tratta di un oggetto non creato.

    Come recita la guida
    Call ReadSectionValues to read the keys, and the values from all keys, within a specified section of an INI file into a string list object (TStrings descendant).

    Laddove viene richiesto un oggetto, è necessario passare - appunto - un oggetto.

    Un oggetto è per definizione l'istanza di una classe, che va quindi creata per poter essere utilizzata (altrimenti non si tratta di un oggetto, ma di un riferimento non inizializzato o non valido che genera poi l'Access Violation).

    Devi creare quindi un'istanza di TStringList per poterla passare alla funzione ReadSectionValues.

    codice:
    ElencoIp := TStringList.Create;
    try
      ConfigFile.ReadSectionValues('NomeSezione', ElencoIp);
    finally
      ElencoIp.Free;
    end;
    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,472
    Originariamente inviato da colde
    Maledetta creazione!!
    In qualsiasi linguaggio, per poter essere usato, un oggetto dev'essere creato, quindi la maledetta creazione va sempre fatta quando un oggetto è richiesto.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.