![]() |
MenuItems hinzufügen und mit OnClick ausrüsten
Hallo Leute,
ich hab ein relativ großes Problem: Ich hab eine StringList. Nun würde ich ganz gern jeden einzelnen String in dieser Liste als MenuItem in mein MainMenu hinzufügen, und auch noch für jedes einzelne MenuItem eine EIGENE OnClick Prozedur festlegen. Habt ihr mein Problem verstanden? Kann mir bitte jemand helfen? |
Re: MenuItems hinzufügen und mit OnClick ausrüsten
OnCreate ist soweit ich weiß auch nur eine Eigenschaft, d.h. Du kannst OnCreate eine Funktion zuweisen. Die muß dann natürlich die gewünschten Parameter haben. Vielleicht schick ich gleich mal ein Beispiel.
|
Re: MenuItems hinzufügen und mit OnClick ausrüsten
sorry, OnClick natürlich
|
Re: MenuItems hinzufügen und mit OnClick ausrüsten
Wär echt nett. Aber kann mir auch jemand dabei helfen, die Strings aus einer StringList als TMenuItem hinzuzufügen?
|
Re: MenuItems hinzufügen und mit OnClick ausrüsten
Steht zwar schon tausend und einmal in der DP aber für dich noch mal hier:
Delphi-Quellcode:
type
TForm1 = class(TForm) MainMenu1: TMainMenu; mnuFile: TMenuItem; Button1: TButton; procedure Button1Click(Sender: TObject); procedure MyMenuItemClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.MyMenuItemClick(Sender: TObject); begin case (Sender as TMenuItem).Tag of 0: ShowMessage('Foo'); 1: ShowMessage('bar'); 2: ShowMessage('Foobar'); end; end; procedure TForm1.Button1Click(Sender: TObject); var i: Integer; sl: TStringList; NewItem: TMenuItem; begin sl := TStringList.Create; try for i := 0 to 9 do sl.Add('Eintrag: '+IntToStr(i)); for i := 0 to sl.Count-1 do begin NewItem := TMenuItem.Create(MainMenu1); NewItem.Caption := sl.Strings[i]; NewItem.Tag := i; NewItem.OnClick := MyMenuItemClick; mnuFile.Add(NewItem); // Der Hauptmenüpunkt vom TMainmenu heißt "mnuFile" end; finally FreeAndNil(sl); end; end; |
Re: MenuItems hinzufügen und mit OnClick ausrüsten
Diese Frage gabs schon mal:
![]() Greetz EDIT: Mist zu spät :-) |
Re: MenuItems hinzufügen und mit OnClick ausrüsten
Und wenn Du's nicht mit dem Tag-Feld machen willst, weil das bei vielen Funktionen zu Mammut-OnClick-Funktionen führt, geht's auch so (Form mit MainMenu und in MainMenu ein Hauptmenü Test und ein Untermenu Test1):
Delphi-Quellcode:
type
TForm1 = class(TForm) MainMenu1: TMainMenu; Test1: TMenuItem; Test11: TMenuItem; procedure Test11Click(Sender: TObject); private { Private-Deklarationen } MenuItemStrings: TStringList; procedure Test21Click(Sender: TObject); procedure Test31Click(Sender: TObject); public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Test11Click(Sender: TObject); var mi: TMenuItem; i: Integer; begin ShowMessage('Test1'); MenuItemStrings := TStringList.Create; MenuItemStrings.Add('Item 1'); MenuItemStrings.Add('Item 2'); for i := 0 to MenuItemStrings.Count - 1 do begin mi := TMenuItem.Create(self); mi.Caption := MenuItemStrings[i]; if i = 0 then mi.OnClick := Test21Click else mi.OnClick := Test31Click; Test1.Add(mi); end; end; procedure TForm1.Test21Click(Sender: TObject); begin ShowMessage('Test21'); end; procedure TForm1.Test31Click(Sender: TObject); begin ShowMessage('Test31'); end; end. |
Re: MenuItems hinzufügen und mit OnClick ausrüsten
Und wie soll das ganze dynamisch funktionieren?
|
Re: MenuItems hinzufügen und mit OnClick ausrüsten
Hallo, hatte auch mal so eine Funktion brauchen müssen und habe das folgendermaßen gelöst.
Ich erstelle aus einer Liste alle Menüeinträge an eine bestimmte Position:
Delphi-Quellcode:
Wie man im Code sieht weise ich dem neu erstellten Item ein bestimmtes OnClick-Ereignis zu. Das bezieht sich auf den folgenden Menupunkt.
s := TStringList.Create;
ico := TIcon.Create; try ini.ReadSections(s); for i := 0 to s.Count - 1 do begin MItem := TMenuItem.Create(nil); MItem.Caption := s.Strings[i]; MItem.Name := MItem.Caption; ico.LoadFromFile(myIcon); MItem.ImageIndex := ImageList.AddIcon(ico); anz := MainMenu1.Items.Items[1].Items[0].Count; MainMenu1.Items.Items[1].Items[0].Insert(anz, MItem); MainMenu1.Items.Items[1].Items[0].Items[0].OnClick := MenuItem.OnClick; end; // for i:=0... finally s.Free; ico.Free; end; Im Menü habe ich einen Eintrag erstellt, auf invisible gesetzt und dort ein OnClick-Ereignis erstellt, in dem ich dann unterschiedliche Funktionen ausführe, die der einzelne Menüpunkt ausführen soll. Dort überprüfe ich nach der Caption des Eintrags welche Funktion ausgeführt werden soll.
Delphi-Quellcode:
Das funktioniert wunderbar und ich kann den Sender bzw. den Menüpunkt abfragen welcher gerade das Onlick-Ereignis ausgeführt hat.
myLang := (Sender as TMenuItem).Caption;
if myLang = 'German' then ... Hoffe das hilft dir weiter. Gruß, Moony |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:20 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