![]() |
Doppelte Einträge in Ini vermeiden
Hallo Wissende,
ich habe hier im Forum folgenden Code gefunden und sowiet abgewandelt, dass nicht mehr Dateien im Menü hinzugefügt werden, sondern Pfad. Aber das nur am Rand. Ich habe es leider noch nicht hinbekommen, dass die Pfade die hinzugefügt werden, NICHT doppelt eingetragen werden. Mein Versuch, dies mit ValueExists durchzuführen ist leider gescheitert. Hat jemand einen Tipp?
Delphi-Quellcode:
Danke Tom
procedure TMainForm.MyMenuItemClick(Sender: TObject);
var ini : TiniFile; s : String; begin ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'\Einstellungen.ini'); try s := ini.ReadString('History', IntToStr((Sender as TMenuItem).Tag), ''); // Schlüsselwert an Hand des Tags indentifizieren ed_path.Text:=s; //ShowMessage(s); // Und ausgeben finally ini.Free; end; end; procedure TMainForm.FillMenue; var ini : TIniFile; slKeyNumbers : TStringList; i : Integer; NewItem : TMenuItem; begin ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'\Einstellungen.ini'); try slKeyNumbers := TStringList.Create; try ini.ReadSectionValues('History', slKeyNumbers); // Sektionswerte holen if slKeyNumbers.Count > 0 then // wenn welche da sind Trennlinie erzeugen begin NewItem := TMenuItem.Create(Pfade1); try NewItem.Caption := '-'; Pfade1.Insert(Pfade1.Count, NewItem); for i := 0 to slKeyNumbers.Count-1 do // in einer Schleife alle Dateien hinzufügen (nur die Dateinamen) begin NewItem := TMenuItem.Create(Pfade1); // NewItem.Caption := '&'+IntToStr(i)+' '+ExtractFilename(ini.ReadString('History', IntToStr(i), '')); NewItem.Caption := '&'+IntToStr(i)+' '+ini.ReadString('History', IntToStr(i), ''); if NewItem.Caption = '' then continue; NewItem.Tag := i; // Menüeintrag eindeutig markieren mit der Tag-Eigenschaft NewItem.OnClick := MyMenuItemClick; // Menüeintag mit der Ereignissprozedur verbinden Pfade1.Insert(Pfade1.Count, NewItem); end; finally NewItem.Free; end; end; finally slKeyNumbers.Free; end; finally ini.Free; end; end; procedure TMainForm.Pfade1Click(Sender: TObject); var ini : TInifile; slKeyNumbers : TStringList; KeyNumber : Integer; begin ini := TIniFile.Create(ExtractFilePath(ParamStr(0))+'\Einstellungen.ini'); try slKeyNumbers := TStringList.Create; try ini.ReadSectionValues('History', slKeyNumbers); KeyNumber := slKeyNumbers.Count; { mein schneller Versuch die Anzahl zu begrenzen } if slKeyNumbers.Count = 9 then begin ini.DeleteKey('History', '0'); ini.WriteString('History', '0', ed_path.Text); end else {ende des versuches} {Dopplung ausschliessen} if ini.ValueExists('History',ed_path.Text)=True then begin ShowMessage(ed_path.Text+'vorhanden'); exit; end else ini.WriteString('History', IntToStr(KeyNumber), ed_path.Text); // Dateiname in Ini eintragen, der Key ist eine Ziffer finally slKeyNumbers.Free; // Stringliste freigeben end; finally ini.Free; // Ini-Objekt freigeben end; end; [edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit] |
Re: Doppelte Einträge in Ini vermeiden
Schau dir mal die "Duplicates" Eigenschaft von der TStringList an, das sollte dir weiterhelfen (hoff ich ma ;-) )
mfG mirage228 |
Re: Doppelte Einträge in Ini vermeiden
Hi Mirage,
ich habe in meiner Delphi-Hilfe gar nichts zum Thema Duplicates in Verbindung mit Stringlisten gefunden und hier im Forum nur ein Thema, welches mir leider überhaupt nicht weiterhelfen konnte, da das Thema dort nur perifär behandelt wurde. Hast Du noch einen Tipp? Ansonsnten muss ich wohl mal schauen, wie man in einer Listbox die Dopplung vermeidet. Ich habe da noch irgendwo eine function rumliegen. Vielleicht kann ich mir daraus was basteln. Es ist aber schon komisch, dass es so kompliziert ist, in einer Ini-Datei eine Dopplung zu vermeiden. Vielleicht stelle ich mich aber auch einfach nur an, wie der erste Mensch!? Ciao und Danke Tom |
Re: Doppelte Einträge in Ini vermeiden
Moin Tom,
ReadSectionValues liest die gesamten Werte enthaltenden Zeilen einer Section ein, so dass in der zu übergebenden Stringlist hinterher etwas in dieser Art steht: Eintrag1=Erster Wert Eintrag2=Zweiter Wert ... ValueExists prüft ob der angegebene Eintrag vorhanden ist, nicht der Wert der zu diesem gehört. Um im obigen Beispiel zu bleiben müsste es z.B. heissen
Delphi-Quellcode:
...ValueExists('Section','Eintrag1') ...
|
Re: Doppelte Einträge in Ini vermeiden
Hi Chris,
also ich verstehe nun, dass ReadSectionValue den Inhalt einer Section in eine Stringlist einlist. Da wo bei Deinem Beispiel Eintrag1 steht, steht bei mir nur die 1. Ich werde also mal schauen, ob ich es gebacken bekomme, in einer Schleife ala
Code:
Ich bin nun schon den 3. Tag mit diesem Thema beschäftigt.
MyStringlist := TStringList.Create;
ini.ReadSectionValue(('History', MyStringlist);) for i := 0 to MyStrinlist.Count -1 do begin if ini.ValueExists('History',inttostr(i)) = ed_path.text then showmessage('schon vorhanden!'); end; MyStringlist.Free; Ich hoffe, dass ich der Lösung näher gekommen bin. Danke Tom |
Re: Doppelte Einträge in Ini vermeiden
Natürlich funzt es nicht, da ValueExits eine Boolean-Story ist und wie Du schon schriebst, nur schaut, ob der Eintrag vorhanden ist, aber nicht nach dem Inhalt selbst schaut. langsam bröselt es mich an. Es bleibt mir wohl nur noch, die Stringliste zu zerfetzen und zu schauen, ob das was nach dem '=' kommt, eventuell mit dem, was ich nun eintragen will übereinstimmt. Und wenn das der Fall ist, muss ich abbrechen.
Warum ist das kompliziert? Verstehe ich hier was völlig falsch, oder raff ich es einfach nicht??? Tom |
Re: Doppelte Einträge in Ini vermeiden
Moin Tom,
Zitat:
Ich hab' das mal so gelöst, dass ich im Programm schon doppelte Werte unterbinde, die Section lösche (EraseSection) und komplett neu schreibe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:58 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