AGB  ·  Datenschutz  ·  Impressum  







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

Doppelte Einträge in Ini vermeiden

Ein Thema von torud · begonnen am 13. Jul 2003 · letzter Beitrag vom 14. Jul 2003
Antwort Antwort
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#1

Doppelte Einträge in Ini vermeiden

  Alt 13. Jul 2003, 17:49
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]
Danke
Tom
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Doppelte Einträge in Ini vermeiden

  Alt 13. Jul 2003, 19:12
Schau dir mal die "Duplicates" Eigenschaft von der TStringList an, das sollte dir weiterhelfen (hoff ich ma )


mfG
mirage228
David F.
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Doppelte Einträge in Ini vermeiden

  Alt 14. Jul 2003, 07:24
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
Danke
Tom
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Doppelte Einträge in Ini vermeiden

  Alt 14. Jul 2003, 08:46
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

...ValueExists('Section','Eintrag1') ...
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#5

Re: Doppelte Einträge in Ini vermeiden

  Alt 14. Jul 2003, 09:34
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
Danke
Tom
  Mit Zitat antworten Zitat
torud

Registriert seit: 26. Jul 2002
Ort: Sachsen
1.198 Beiträge
 
Delphi XE5 Professional
 
#6

Re: Doppelte Einträge in Ini vermeiden

  Alt 14. Jul 2003, 09:38
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
Danke
Tom
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Doppelte Einträge in Ini vermeiden

  Alt 14. Jul 2003, 11:23
Moin Tom,

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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Antwort Antwort


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 23:48 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