![]() |
MainMenu - Doppelte Einträge verhindern
Hallo Leute
Ich erzeuge dynamisch MainMenu Einträge und würde gern doppelte Einträge gern löschen. Wie krieg ich nun raus ob ein bestimmter string schon vorhanden ist. Hab schon im forum indexof gefunden aber irgendwie komm Ich damit nicht zurecht.
Delphi-Quellcode:
NewItem := TMenuItem.Create(Self);
NewItem.Caption := OpenDialog1.FileName; Datei.Add(NewItem); NewItem.OnClick:=DynamikMenuItemClick; Caption:=Inttostr(datei.Count); for i:=0 to Datei.Count-1 do begin If {MainMenuString} = {String} then Datei.Delete(i); end; |
Re: MainMenu - Doppelte Einträge verhindern
Hast du die Frage niocht eigentlich schon gefunden bzw. selbst beantwortet???
Kapier ich jetz nicht... :stupid: |
Re: MainMenu - Doppelte Einträge verhindern
Nur als Anmerkung: An deiner Stelle würde ich erst gar nicht doppelte Einträge dem MainMenu hinzufügen, das ist sicher performanter als diese einzutragen und anschließend wieder herauszupicken. Die Dateinamen würde ich auch intern verwalten um nicht immer auf die Komponenten zugreifen zu müssen. Das geht beispielsweise mit einer TStringList. Da kannst du auch leicht und schneller die Einträge durchgehen und überprüfen.
|
Re: MainMenu - Doppelte Einträge verhindern
Erstmal dank für die Antworten
Das mit der Stringlist wäre natürlich auch noch ne Lösung. Und ist vieleicht einfacher zu handhaben, aber der Aufwand wird wohl der selbe sein Stringlist erzeugen - Doppelte Strings löschen - MainMenu Einträge erstellen. |
Re: MainMenu - Doppelte Einträge verhindern
Hat die TStringList nicht ein Property mit dem man keine doppelten Einträge zulässt?
Ahhh... gefunden: duplicates => das kann man auf duperror setzen und schon gibt es bei .add einen Fehler wenn ein Eintrag schon vorhanden ist :wink: Die Eigenschaft Duplicates legt fest, ob zu einer sortierten Liste String-Duplikate hinzugefügt werden können. Delphi-Syntax: property Duplicates: TDuplicates; C++ Syntax: __property TDuplicates Duplicates = {read=FDuplicates, write=FDuplicates, nodefault}; Beschreibung Mit Duplicates können Sie festlegen, welche Aktion ausgeführt werden soll, wenn ein String mehrfach zu einer sortierten Liste hinzugefügt wird. Die Eigenschaft CaseSensitive steuert, ob zwei Strings, die sich nur hinsichtlich der Groß-/Kleinschreibung unterscheiden, als identisch angesehen werden. Duplicates kann einen der folgenden Werte erhalten: Wert Bedeutung dupIgnore Das Einfügen von Duplikaten in die Liste wird ignoriert. dupError Der Versuch, der sortierten Liste ein String-Duplikat hinzuzufügen, führt zu einer EStringListError-Exception. dupAccept Duplikate sind in der sortierten Liste zulässig. Setzen Sie Duplicates, bevor Sie der Liste Strings hinzufügen. Wenn Sie Duplicates auf dupIgnore oder dupError setzen, hat das keine Auswirkungen auf doppelte Strings, die bereits in der Liste enthalten sind. Hinweis: Duplicates hat keinerlei Auswirkungen, wenn die Liste nicht sortiert ist. |
Re: MainMenu - Doppelte Einträge verhindern
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute
Bin immer noch am werkeln. Das mit der StringList klappt mittlerweile, nur mit den Menu Einträgen krieg Ich nicht gebacken. Ich stell mal den Quelltext rein und packe das Prog als Anhang. Vieleicht guckt sich's mal einer an, und könnte Mir vieleicht noch Tips geben.
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus, Inifiles; type TForm1 = class(TForm) MainMenu1: TMainMenu; Datei: TMenuItem; Hallo: TMenuItem; Ballo: TMenuItem; Button1: TButton; Label1: TLabel; N1: TMenuItem; OpenDialog1: TOpenDialog; Memo1: TMemo; procedure Button1Click(Sender: TObject); procedure DynamikMenuItemClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); private public { Public-Deklarationen } end; var Form1: TForm1; SL:TStringList; Ini: TIniFile; implementation {$R *.dfm} Procedure DoubleItems; //Doppelte Items aus SL entfernen var i,j:Integer; begin i := 0; while i <= SL.Count-1 do begin for j := i+1 to SL.Count-1 do begin if SL.Strings[i] = SL.Strings[j] then begin dec(i); SL.Delete(j); break; end; end; inc(i); end; end; procedure TForm1.DynamikMenuItemClick(Sender: TObject); begin Caption:=TMenuItem(Sender).Caption; end; procedure TForm1.FormCreate(Sender: TObject); var Ini: TIniFile; SC,i,j:Integer; NewItem : TMenuItem; begin Sl:=TstringList.Create; Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Einstellung.ini'); SC:=Ini.ReadInteger('Count','SC',0); for i:=0 to SC-1 do SL.Add(Ini.ReadString('MM','MainMenu'+IntToStr(i),'')); //Gespeicherte Einträge laden Memo1.Text:=SL.Text; //Probe for j := 0 to SL.Count-1 do //Entsprechende MainMenu Einträge erzeugen begin NewItem := TMenuItem.Create(Self); NewItem.Caption := SL[j]; Datei.Add(NewItem); NewItem.OnClick:=DynamikMenuItemClick; end; end; procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); var i:Integer; begin Ini := TIniFile.Create(ExtractFilePath(ParamStr(0)) + 'Einstellung.ini'); //Einträge speichern for i:=0 to SL.Count-1 do begin Ini.WriteString('MM','MainMenu'+IntToStr(i),SL.Strings[i]); Ini.WriteInteger('Count','SC',SL.Count); end; Ini.Free; Sl.Free; end; procedure TForm1.Button1Click(Sender: TObject); var NewItem: TMenuItem; begin if (OpenDialog1.Execute) and (Datei.Count <13) then //Auf 10 Einträge begrenzen (3 Feste) begin SL.Text:=Trim(SL.Text); //leere Zeilen entfernen SL.Add(OpenDialog1.FileName); //Einträge hinzufügen DoubleItems; //Doppelte entfernen NewItem := TMenuItem.Create(Self); NewItem.Caption := Sl.Strings[SL.Count-1]; Datei.Add(NewItem); NewItem.OnClick:=DynamikMenuItemClick;//Menueinträge erzeugen end else //Falls mehr als 10 Einträge begin SL.Add(OpenDialog1.FileName); DoubleItems; //Doppelte entfernen NewItem := TMenuItem.Create(Self); NewItem.Caption := Sl.Strings[SL.Count-1]; Datei.Add(NewItem); NewItem.OnClick:=DynamikMenuItemClick; Datei.Delete(4); //Ersten Eintrag im MainMenu löschen SL.Delete(0); //Ersten Eintrag im SL löschen end; Memo1.Text:=SL.Text; //Probe Caption:=Inttostr(Datei.Count); //Probe end; end. |
Re: MainMenu - Doppelte Einträge verhindern
Wenn du alle dynamisch angelegte MenuItems parallel in einer TComponentList speicherst,
dann kannst du später alle löschen:
Delphi-Quellcode:
FDynMenuItems : TComponentList;
... // Löschen while FDynMenuItems.Count > 0 do FDynMenuItems.Items[0].Free; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:01 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