Newsgroup: it.comp.lang.delphi
Titolo: [Delphi 5] TIniFile.ReadString che in realtà modifica la stringa!

Salve, ho un odioso problema con i TIniFile e i TMemIniFile. Ho un file di
configurazione dove ci sono salvate tutte le impostazioni del programma. Ma
ogni volta che vado a leggere queste impostazioni, un valore si cancella!! E
ho spulciato il codice e non ci sono "WriteString" nascoste.
In pratica in un form scrivo nel file di configurazione con
try
 ini := TmemIniFile ( o TIniFile, l'errore c'è sempre)
.Create('config.ini');
 ( ... altri writestring .. )
 ini.WriteString('Elenco','Titolo',txttitolo.text);
 ini.Updatefile;
finally
 ini.Destroy;
end;
e leggo nel form principale con
try
 ini := TmemIniFile ( o TIniFile, l'errore c'è sempre)
.Create('config.ini');
 ( ... altri readstring .. )
 titolo := ini.ReadString('Elenco','Titolo','');
finally
 Destroy;
end;
ma ogni volta che vado a rileggere, mi cancella questo valore!! Come è
possibile?

 end;
del tuo problema non so che dire ho un prg che fa + o - lo stesso utilizzo
dei file ini e non ho _MAI_ avuto problemi.
detto ciň IMO sostituirei quel 
ini.Destroy con ini.Free come dall'esempio del Help di Delphi
Ciao


Open Delphi Manual (
http://groups.yahoo.com/group/delphi_open_manual/
)

Non ha problemi nel riconoscere e trovare il file .ini perchè le altre
impostazione le legge/scrive correttamente. Purtroppo ho notato che, uscendo
da quel "form" tramite il pulsante Annulla (che da un modalresult
"mrAbort" ) avviene questo fatto.
Il codice l'ho scritto a mano si.

 Annulla (che da un modalresult "mrAbort" ) avviene questo fatto.
Mmmmmmm sento puzza di bruciato... perché non posti il codice di
quel pezzo?
Andrea

 Il codice l'ho scritto a mano si.
Non scrivere codice manualmente, poichè rischi di introdurre in quella
porzione di codice errori che tutti i partecipanti al NG sono tentati di
correggere e che, magari, non affliggono veramente il codice verace
della tua applicazione mentre, al contrario, potrebbero nascondere i
veri errori, magari di semplice distrazione.
Fai "copia e incolla" (delle parti significative) del tuo codice...ci
pensiamo noi ad interpretare.
Ciao!



Allora: ecco cosa avviene alla pressione del pulsante "Applica"
var title : string;
Begin
(...)
title := txtitle.Text;
(...)
try
  ini :=
TMemIniFile.Create(ExtractFilePath(Application.Exename)+'config.ini');
  ini.WriteBool('Titolo','attivato',cbtit.Checked);
  ini.WriteString('Titolo','valore',title);
  ini.UpdateFile;
 finally
  ini.Free;
 end;
Ed infatti il titolo viene scritto correttamente.
Per la lettura delle opzioni invece uso questo:
 try
  ini :=
TMemIniFile.Create(ExtractFilePath(Application.Exename)+'config.ini');
  cbtit.Checked := ini.ReadBool('Titolo','attivato',false);
  txtitle.Text := ini.ReadString('Titolo','Valore','');
 finally
  ini.Free;
 end;
e neanche questo mi da problemi. Tutto questo avviene in un form,
frmOpzioni, che viene richiamato dal form principale, frmMain, in questo
modo (evento onClick di un bottone)
with TfrmOpzioni.Create (self) do
 try
  ShowModal;
 finally
  Free;
 end;
Ho scoperto, controllando il file config.ini, che il valore titolo viene
cancellato quando viene caricato il form delle opzioni una volta letto il
valore. Ovvero, in txtitle.Text viene scritto il valore letto dal file .ini,
che però poi viene cancellato. E solo questo (che tra l'altro è l'ultimo
della sezione). Come mai?

> ...ci pensiamo noi ad interpretare.
da oggi ti posso chiamare Marco "The parser" Breveglieri? ;)
Ciao, Sandro

 questo (che tra l'altro è l'ultimo della sezione). Come mai?
Ho notato che hai usato minuscole e maiuscole differenti negli
identificatori delle chiavi, ma non dovrebbe comportare un problema dato
che la ricerca è "case insensitive".
Molto strano. Probabilmente scrivi quel valore in qualche modo, o compi
operazioni che portano indirettamente a tale effetto collaterale. Mi
sembra che tu abbia già controllato la presenza di WriteString() sparsi
in giro nell'applicazione...verifica con un breakpoint che tali metodi
non vengano eseguiti quando non te lo aspetti.
P.S.: la chiamata al metodo costruttore Create deve essere esterna al
costrutto try...finally.


 ha scritto nel messaggio
news:cdn7b.36367$hE5.1...@news1.tin.it...


 Prova un po' ad aggiustarlo... o imposti casesensitive a false.
La classe TMemIniFile tratta già le chiavi in modo "case insensitive".


 ha scritto nel messaggio
news:EkB7b.56615$R32.1...@news2.tin.it...
