Delphi - načítanie z INI súboru
Mám túto metódu:
procedure TfrmCustomHead.FormCreate(Sender: TObject);
var
Ini: TIniFile;
i: Byte;
begin
Ini := TIniFile.Create(MainForm.PrgPath + 'Spanwin.ini');
for i := 0 to 11 do
Ini.ReadString('Head', 'HeadString' + IntToStr(i), HeadString[i]);
Ini.Free;
end;
A tento INI súbor:
[Head]
HeadString0=0
HeadString1=1
HeadString2=2
HeadString3=3
HeadString4=4
HeadString5=5
HeadString6=6
HeadString7=7
HeadString8=8
HeadString9=9
HeadString10=10
HeadString11=11
Načítané reťazce sú prázdne. Vie mi niekto vysvetliť, kde robím chybu? Táto metóda funguje dobre:
procedure TfrmCustomHead.bbOKClick(Sender: TObject);
var
Ini: TIniFile;
i: Byte;
begin
Ini := TIniFile.Create(MainForm.PrgPath + 'Spanwin.ini');
for i := 0 to 11 do
begin
HeadString[i] := (Panel.Controls[i] as TEdit).Text;
Ini.WriteString('Head', 'HeadString' + IntToStr(i), HeadString[i]);
end;
Ini.Free;
end;
for i := 0 to 11 do
headstring[i]:=Ini.ReadString('Head', 'HeadString' + IntToStr(i), HeadString[i]);
delphi help:
Delphi syntax:
function ReadString(const Section, Ident, Default: String): String; override;
C++ syntax:
virtual AnsiString __fastcall ReadString(const AnsiString Section, const AnsiString Ident, const AnsiString Default);
Description
Call ReadString to read a string value from an INI file. Section identifies the section in the file that contains the desired key. Ident is the name of the key from which to retrieve the value. Default is the string value to return if the:
Section does not exist.
Key does not exist.
Data value for the key is not assigned.
Ďakujem, ale v helpe som bol. Keď vieš, kde je chyba, tak poraď. Ja som už skúšal na to aj watch, breakpoint atď. a zistil som, že metóda sa kompletne bezchybne vykoná a reťazce sa nenaplnia. Súbor existuje, kľúče tiež a hodnoty tiež, viď pastnutý súbor. Prosím vymazať opakovanú reakciu, zrejme došlo k dvojitému odoslaniu (nech je to tu prehľadnejšie).
no vzdyt jsem ti to napsal, je to funkce takze tam musi byt
headstring[i]:=Ini.ReadString('Head', 'HeadString' + IntToStr(i), HeadString[i]);
ten tvuj druhy headstring[i] je default hodnota
To je tak, keď funkcie a procedúry majú rovnaký zápis. Tak to ma ozaj nenapadlo, že to bude taká blbosť. Ďakujem.
nebo teda jeste lepe
headstring[i]:=Ini.ReadString('Head', 'HeadString' + IntToStr(i), 'toto je default hodnota, pri nenalezeni klice nebo ...');
A ja jen doplnim, pokud bude ten soubor vetsi, pouzij radeji TMemIniFile. Je to Delphi implmentace souboru, pouziva neco jako indexovane polozky, takze prace s tim je mnohem rychlejsi.
Staci zmenit deklaraci TIniFile za TMemIniFile, to je vse.
Áno, ďakujem. Raz dávnejšie som sa aj tak zamýšlal nad tým, že čo potom, ak sa pracuje s dlhým súborom (síce to nie je môj prípad). Že to iba zaťaží Delphi. NO a rozmýšlal som ako by to bolo lepšie riešiť. Ale nedáva si TMemIniFile šetko do pamäti? Teda tak to chápem z názvu (presnejšie povedané, doteraz som si to tak myslel).
TIniFile je take v pameti, tam si jej zase daji Windows...
Podla knihy co mam o Delphi rozdiel medzi TMemIniFile a TIniFile je ze TMemIniFile nepracuje s fyzickym suborom na disku ale vsetky udaje pre zvysenie rychlosti uklada do vyrovnavacej pamate. Na disk ich zapise az ked sa zavola metoda UpdateFile.
Důležité ovšem je, že TIniFile používá Woknouzí API funkce pro práci s INI soubory a ty nedovedou pracovat s delším jak 64KB. Kdežto v TMemIniFile (a potažmo, leč zdroják jsem nezkoumal, v TRegistryIniFile) si to ovládá Delphi na svoje triko, právě kvůli tomuto omezení.