Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi MainMenu - Doppelte Einträge verhindern (https://www.delphipraxis.net/83581-mainmenu-doppelte-eintraege-verhindern.html)

Blackheart 4. Jan 2007 20:13


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;

TonyR 4. Jan 2007 20:21

Re: MainMenu - Doppelte Einträge verhindern
 
Hast du die Frage niocht eigentlich schon gefunden bzw. selbst beantwortet???
Kapier ich jetz nicht... :stupid:

Matze 4. Jan 2007 20:25

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.

Blackheart 4. Jan 2007 20:37

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.

TonyR 4. Jan 2007 20:51

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.

Blackheart 5. Jan 2007 12:37

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.

shmia 5. Jan 2007 12:49

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 21:53 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