Autor Beitrag
Blackheart666
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Fr 05.01.07 17:19 
Hallo Leute
Ich erstelle Menu Einträge zur Laufzeit und möchte doppelte Löschen.
Mit der Stringlist klappt das ohne Probleme, aber leider nicht mit den Menu Einträgen.
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 wie man
das lösen kann oder eventuell auch anders angeht.
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
var
  Form1: TForm1;
  SL:TStringList;
  Ini: TIniFile;
  NewItem:TMenuItem;
implementation

{$R *.dfm}

Procedure TForm1.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);
         Label1.Caption:=IntToStr(j);
         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;


Zuletzt bearbeitet von Blackheart666 am Sa 06.01.07 18:03, insgesamt 1-mal bearbeitet
Regan
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Fr 05.01.07 18:36 
Also ich habe es so gelöst:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
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}

function Doppelt(var SL:TStringList;FileName:String):Boolean; //Überprüfen auf doppelte Items SL ist immer SL und FileName ist immer OpenDialog1.Filename
var
i:Integer;
a:String;
begin
result:=false; // Auf 'doppelter Eintrag nicht vorhanden' stellen
For i:=0 to SL.Count-1 do    // überprüfen, ob OpenDialog1.FileName schon in SL
begin
if SL.Strings[i]=FileName then
begin // Wenn ja
result:=true; // Doppelt auf true
exit;
end;
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
  if Doppelt(SL,OpenDialog1.FileName)=false then
    begin
    //Was passieren soll wenn nicht doppelt
    SL.Text:=Trim(SL.Text); //leere Zeilen entfernen
    SL.Add(OpenDialog1.FileName); //Einträge hinzufügen
    NewItem := TMenuItem.Create(Self);
    NewItem.Caption := Sl.Strings[SL.Count-1];
    Datei.Add(NewItem);
    NewItem.OnClick:=DynamikMenuItemClick;//Menueinträge erzeugen
    end
    else
    begin
    // Was passieren soll wenn doppelt
    sleep(1);
    end;
  end
  else //Falls mehr als 10 Einträge
begin
  if Doppelt(SL,OpenDialog1.FileName)=false then
  begin
  // Was passieren soll wenn nicht doppelt
  SL.Text:=Trim(SL.Text); //leere Zeilen entfernen
  SL.Add(OpenDialog1.FileName); //Einträge hinzufügen
  NewItem := TMenuItem.Create(Self);
  NewItem.Caption := Sl.Strings[SL.Count-1];
  Datei.Add(NewItem);
  NewItem.OnClick:=DynamikMenuItemClick;//Menueinträge erzeugen
  Datei.Delete(4); //Ersten Eintrag im MainMenu löschen
  SL.Delete(0); //Ersten Eintrag im SL löschen
  end
    else
    begin
    // Was passieren soll wenn doppelt
    sleep(1);
    end;
end;
  Memo1.Text:=SL.Text; //Probe
  Caption:=Inttostr(Datei.Count); //Probe
end;


end.

Ich hoffe das ist das, was du wolltest. Ich würde den OpenDialog übrigens noch so kofigurieren, dass die Datei auch existieren muss.
Blackheart666 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Fr 05.01.07 19:10 
Danke Regan das klappt Super, Ich hab da schon drei Tage dran rumgewerkelt.
So ist das als ewiger Hobbyprogrammierer.
Vielen Dank für die Mühe, hier wird man geholfen.

Blackheart666
Andidreas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows XP Pro
BDS 2006
BeitragVerfasst: Fr 05.01.07 19:11 
Warum erst eintragen?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
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
  if SL.IndexOf(OpenDialog1.FileName) = -1 then // Wenn noch nicht vorhanden, dann eintragen
    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 -> Eintragen ja/nein wie oben
  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;
Blackheart666 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2195

XP
D3Prof, D6Pers.
BeitragVerfasst: Fr 05.01.07 19:34 
user profile iconAndidreas hat folgendes geschrieben:
Warum erst eintragen?



Wie meinst Du das jetzt.

Edit: Sorry hatte nicht gleich drauf geachtet, habs mal ausprobiert wenn beim laden schon dateien im Menu sind schreibt er sie auch doppelt.
Aber trotzdem dank für deine Mühe.

Blackheart666


Zuletzt bearbeitet von Blackheart666 am Fr 05.01.07 19:59, insgesamt 1-mal bearbeitet
Andidreas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 114

Windows XP Pro
BDS 2006
BeitragVerfasst: Fr 05.01.07 19:42 
Ich hoffe Du hast Dir das Stück Code angesehen. Der ausgewählte Eintrag, wird so nur dann übernommen, wenn er noch nicht vorhanden ist. Siehe Zeile 8. Spart etliche Zeilen Code.