AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TIniFile und DeleteKey

Ein Thema von newuser01 · begonnen am 26. Sep 2006 · letzter Beitrag vom 27. Sep 2006
Antwort Antwort
Seite 1 von 2  1 2      
newuser01

Registriert seit: 31. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#1

TIniFile und DeleteKey

  Alt 26. Sep 2006, 19:04
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;
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: TIniFile und DeleteKey

  Alt 26. Sep 2006, 19:12
Kommt ein Fehler?
Markus Kinzler
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#3

Re: TIniFile und DeleteKey

  Alt 26. Sep 2006, 19:14
Hallo Holger,

du erhältst beim Testen deines Codes eine Meldung der Form "Listenindex überschreitet das Maximum", richtig?
Schaue einmal in diesen diesen Thread hinein.

Gruß Hawkeye
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 31. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#4

Re: TIniFile und DeleteKey

  Alt 26. Sep 2006, 19:34
Hallo

Problem gelöst

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:
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;
DANKE an alle
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#5

Re: TIniFile und DeleteKey

  Alt 26. Sep 2006, 19:50
Zitat von newuser01:
Problem gelöst
noch nicht ganz:
  • Du erzeugst für jeden markierten Eintrag ein TIniFile-Objekt, gibst aber nach der Schleife nur das zuletzt erstellte Objekt frei.
  • Falls die Liste leer oder kein Eintrag markiert ist, versuchst du trotzdem ein TIni-Objekt freizugeben.
  • Du gehst immer noch vorwärts durch die Schleife und nicht rückwärts.
Ganz fertig bist du also noch nicht

Gruß Hawkeye
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 31. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#6

Re: TIniFile und DeleteKey

  Alt 26. Sep 2006, 20:50
Delphi-Quellcode:
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
so vielleicht ?
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#7

Re: TIniFile und DeleteKey

  Alt 26. Sep 2006, 21:11
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.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: TIniFile und DeleteKey

  Alt 26. Sep 2006, 21:17
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:
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;
Getippt und nicht getestet.

Gute Nacht

marabu
  Mit Zitat antworten Zitat
newuser01

Registriert seit: 31. Aug 2006
248 Beiträge
 
Delphi 7 Professional
 
#9

Re: TIniFile und DeleteKey

  Alt 26. Sep 2006, 22:43
Ich hab bis jetzt noch nicht so recht begriffen warum es besser ist die Schleife rückwärts laufen zu lassen es hat bei mir noch nicht so richtig klick gemacht 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;
Gruß: Holger

[Hobby-Programmierer]
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: TIniFile und DeleteKey

  Alt 27. Sep 2006, 07:12
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz