Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Doppelte Einträge in Ini vermeiden (https://www.delphipraxis.net/6513-doppelte-eintraege-ini-vermeiden.html)

torud 13. Jul 2003 17:49


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:
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;
Danke Tom

[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]

mirage228 13. Jul 2003 19:12

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

torud 14. Jul 2003 07:24

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

Christian Seehase 14. Jul 2003 08:46

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') ...

torud 14. Jul 2003 09:34

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:
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 bin nun schon den 3. Tag mit diesem Thema beschäftigt.
Ich hoffe, dass ich der Lösung näher gekommen bin.

Danke Tom

torud 14. Jul 2003 09:38

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

Christian Seehase 14. Jul 2003 11:23

Re: Doppelte Einträge in Ini vermeiden
 
Moin Tom,

Zitat:

Zitat von torud
Warum ist das kompliziert?

vermutlich weil MS nicht auf die Idee gekommen ist, dass jemand das mit den INIs machen will, was Du vorhast.

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 14:10 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