![]() |
TIniFile und DeleteKey
Hallo
Ich möchte gerne mit "DeleteKey" ein Eintrag aus der ini löschen funktioniert nur leider nicht :( wo liegt der Fehler?
Delphi-Quellcode:
procedure TfMain.btnDeleteClick(Sender: TObject);
var i:integer; Ini:TIniFile; begin //Ausgewählter Eintrag ist zu löschender Key in 'Properties' for i := 0 to ListBox1.Count -1 do begin if ListBox1.Selected[i] = true then begin Ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+'setting.ini'); ListBox1.Items.Delete(i); Ini.DeleteKey('Properties',ListBox1.Items.Strings[i]); end else begin end;//if end;//for Ini.Free; |
Re: TIniFile und DeleteKey
Kommt ein Fehler?
|
Re: TIniFile und DeleteKey
Hallo Holger,
du erhältst beim Testen deines Codes eine Meldung der Form "Listenindex überschreitet das Maximum", richtig? Schaue einmal in diesen ![]() Gruß Hawkeye |
Re: TIniFile und DeleteKey
Hallo
Problem gelöst :-D Lösung: "Ini.DeleteKey('Properties',ListBox1.Items.Str ings[i])" muss vor "ListBox1.Items.Delete(i)" gesetzt werden denn wenn es danach gesetzt wird ist ja ListBox1.Items nicht mehr aktuell weil beretis ein Eintrag gelöscht wurde
Delphi-Quellcode:
DANKE an alle
procedure TfMain.btnDeleteClick(Sender: TObject);
var i:integer; Ini:TIniFile; begin //Ausgewählter Eintrag ist zu löschender Key in 'Properties' for i := 0 to ListBox1.Count -1 do begin if ListBox1.Selected[i] = true then begin Ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+'setting.ini'); Ini.DeleteKey('Properties',ListBox1.Items.Strings[i]);//vor ListBox1.Items.Delete(i) gesetzt ListBox1.Items.Delete(i); end else begin end;//if end;//for Ini.Free; |
Re: TIniFile und DeleteKey
Zitat:
Gruß Hawkeye |
Re: TIniFile und DeleteKey
Delphi-Quellcode:
so vielleicht ?
procedure TfMain.btnDeleteClick(Sender: TObject);
var i:integer; Ini:TIniFile; begin Ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+'setting.ini'); for i := 0 to ListBox1.Count -1 do begin if ListBox1.Selected[i] = true then begin Ini.DeleteKey('Properties',ListBox1.Items.Strings[i]);//vor ListBox1.Items.Delete(i) gesetzt ListBox1.Items.Delete(i); Ini.Free; end else begin end;//if end;//for |
Re: TIniFile und DeleteKey
Nicht wirklich ;) . Free hast du nun zwar in die Schleife gepackt, den Konstruktoraufruf aber unsinnigerweise ausgelagert, wodurch ein und diesselbe Instanz mehrmals freigegeben wird. Hawkeyes dritten Punkt solltest du ebenfalls beachten.
|
Re: TIniFile und DeleteKey
Hallo Holger,
ich habe deinen Code etwas überarbeitet und alle Hinweise berücksichtigt. Jede Änderung hat ihren speziellen Grund und ist es wert, dass du darüber nachdenkst.
Delphi-Quellcode:
Getippt und nicht getestet.
uses
IniFiles; const INI_NAME = 'Settings.ini'; PROPS_SECTION = 'Properties'; procedure TDemoForm.btnDeleteClick(Sender: TObject); var i: Integer; fn: TFileName; ini: TMemIniFile; begin fn := ExtractFilePath(Application.ExeName) + INI_NAME; ini := TMemIniFile.Create(fn); with lbKeys do begin Items.BeginUpdate; for i := Pred(Items.Count) downto 0 do if Selected[i] then begin ini.DeleteKey(PROPS_SECTION, lbKeys.Items[i]); Items.Delete(i); end; Items.EndUpdate; end; ini.UpdateFile; ini.Free; end; Gute Nacht marabu |
Re: TIniFile und DeleteKey
Ich hab bis jetzt noch nicht so recht begriffen warum es besser ist die Schleife rückwärts laufen zu lassen :gruebel: es hat bei mir noch nicht so richtig klick gemacht :mrgreen: Ich vermute mal wenn in der Rückwärtsversion "i" immer ListBox1.Count ist dann ist ja "i" somit auch immer aktuell oder ? denn wenn in der Vorwärtsversion "i" nur hochzählen würde aber ListBox1.Count nun plötzlich nicht mehr stimmt dann FEHLER oder ?
Delphi-Quellcode:
procedure TfMain.btnDeleteClick(Sender: TObject);
var i:integer; Ini:TIniFile; begin Ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+'setting.ini'); for i := ListBox1.Count -1 downto 0 do begin if ListBox1.Selected[i] = true then begin Ini.DeleteKey('Properties',ListBox1.Items.Strings[i]); ListBox1.Items.Delete(i); end else begin end;//if end;//for Ini.UpdateFile; Ini.Free; |
Re: TIniFile und DeleteKey
Guten Morgen.
Hawkeye hatte es ja in dem verlinkten thread schon erklärt. Bei einer vorwärts laufenden Zählschleife sägst du an dem Ast auf dem du sitzt - bildlich gesprochen. Der Endwert der Laufvariable in einer Zählschleife wird nur einmal ganz am Anfang ermittelt. Nimm eine Liste mit zwei items, der Index läuft von 0 bis 1. Wenn das erste item innerhalb der Zählschleife gelöscht wird, passiert folgendes: die Liste verschiebt das zweite item an die Position des ersten, der maximale Listenindex ist nun 0, die Laufvariable wird von 0 auf 1 erhöht, das Abbruchkriterium der Schleife (Laufvariable größer als Endwert) ist nicht erfüllt (1 > 1 ist Falsch) und ein Zugriff auf das nicht mehr vorhandene item mit dem Index 1 (welches durch die Verschiebung nach dem Löschen jetzt den Index 0 hat) findet statt - und scheitert mit einer Exception. Leicht nachzuvollziehen, warum das bei rückwärts laufenden Zählschleifen nicht passieren kann - oder? Grüße vom marabu |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz