Registriert seit: 19. Jan 2003
732 Beiträge
Turbo Delphi für Win32
|
Problem mit Speichern von Combobox-Items in Inifile
16. Mär 2004, 20:03
Hallo Allerseits,
Ich versuche gerade verzweifelt, den Inhalt einer Combobox (mit Dropdown) beim Schließen meines Programms in einer Ini-Datei zu speichern... das Problem ist: Nach jeden Neustart, also beim laden der Ini-Einstellungen, fehlt plötzlich der letzte Eintrag, sodass die Liste mit jedem Neustart des Programms ein bischen kürzer wird. Ich bin aber nicht in der Lage, den Fehler im Code zu finden
Laut Debugger wird die Schleife in SetBoxItems genau einmal zu wenig durchlaufen. Es werden alle Einträge in die Ini-Datei geschrieben, es liegt also vermutlich nicht am Speichervorgang, sondern eher am Ladevorgang... ich finde trotzdem keinen Fehler
Hat jemand bessere Augen als ich?
Hier der betreffende Code:
Delphi-Quellcode:
//Konstanten
const
NUMDIV = 'NUM_DIV';
NUMMAL = 'NUM_MAL';
NUMMINUS = 'NUM_MINUS';
INI_SEP = #20;
//Items aus Ini-Key in Combobox schreiben
procedure SetBoxItems(Items: TStrings; InputStr: String);
var i: Integer;
begin
If trim(InputStr)='' then exit;
While pos(INI_SEP, InputStr)<> 0 do
begin
Items.Add( StringReplace(copy(InputStr,1,pos(INI_SEP, InputStr)-1), #13#10, '', [rfReplaceAll]) );
Delete(InputStr, 1, pos(INI_SEP, InputStr));
end;
end;
//combobox Items und anderes aus ini Datei laden
procedure TForm1.FormCreate(Sender: TObject);
var ini: Tinifile;
i: Integer;
begin
Randomize;
Inifilepath := ExtractFilePath(Application.ExeName) + 'skSettings.ini';
Syshotkey1.Add(HotKeyItem(vkDivide,[] ));
Syshotkey1.Add(HotKeyItem(vkMultiply,[] ));
Syshotkey1.Add(HotKeyItem(vkSubtract,[] ));
Syshotkey1.Add(HotKeyItem(vkHome,[] ));
ini := TInifile.Create(Inifilepath);
try
SetBoxItems(Box1.Items, ini.ReadString(NUMDIV, 'Items', ''));
Box1.ItemIndex := ini.ReadInteger(NUMDIV, 'LastIndex', -1);
Rand1.Checked := ini.ReadBool(NUMDIV, 'Randomize', false);
SetBoxItems(Box2.Items, ini.ReadString(NUMMAL, 'Items', ''));
Box2.ItemIndex := ini.ReadInteger(NUMMAL, 'LastIndex', -1);
Rand2.Checked := ini.ReadBool(NUMMAL, 'Randomize', false);
SetBoxItems(Box3.Items, ini.ReadString(NUMMINUS, 'Items', ''));
Box3.ItemIndex := ini.ReadInteger(NUMMINUS, 'LastIndex', -1);
Rand3.Checked := ini.ReadBool(NUMMINUS, 'Randomize', false);
finally
ini.Free;
end;
//Combobox Items in formatierten String umwandeln. Separator = #20
function GatherItems(aBox: TCombobox): String;
var i: Integer;
begin
Result := '';
for i:=0 to aBox.Items.Count-1 do
Result := Result + aBox.Items[i] + INI_SEP;
end;
//Combobox und anderes in Ini speichern
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var ini: TInifile;
i: Integer;
begin
CanClose := true;
DeleteFile(Inifilepath);
ini := Tinifile.Create(Inifilepath);
try
Ini.WriteString( NUMDIV, 'Items', GatherItems(Form1.Box1) );
Ini.WriteInteger( NUMDIV, 'LastIndex', Form1.Box1.Items.IndexOf(Form1.Box1.Text) );
Ini.WriteBool(NUMDIV, 'Randomize', Form1.Rand1.Checked);
Ini.WriteString( NUMMAL, 'Items', GatherItems(Form1.Box2) );
Ini.WriteInteger( NUMMAL, 'LastIndex', Form1.Box2.Items.IndexOf(Form1.Box2.Text) );
Ini.WriteBool(NUMMAL, 'Randomize', Form1.Rand2.Checked);
Ini.WriteString( NUMMINUS, 'Items', GatherItems(Form1.Box3) );
Ini.WriteInteger( NUMMINUS, 'LastIndex', Form1.Box3.Items.IndexOf(Form1.Box3.Text) );
Ini.WriteBool(NUMMINUS, 'Randomize', Form1.Rand3.Checked);
finally
ini.UpdateFile;
ini.Free;
end;
end;
end;
Gruß,
Dani
Dani H.
|