Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi MenuItems hinzufügen und mit OnClick ausrüsten (https://www.delphipraxis.net/25250-menuitems-hinzufuegen-und-mit-onclick-ausruesten.html)

daniel8520 3. Jul 2004 14:36


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?

bttb930 3. Jul 2004 14:47

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.

bttb930 3. Jul 2004 14:49

Re: MenuItems hinzufügen und mit OnClick ausrüsten
 
sorry, OnClick natürlich

daniel8520 3. Jul 2004 14:49

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?

Luckie 3. Jul 2004 14:50

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;

Andreas L. 3. Jul 2004 14:53

Re: MenuItems hinzufügen und mit OnClick ausrüsten
 
Diese Frage gabs schon mal: http://www.delphipraxis.net/internal...844&highlight=

Greetz

EDIT: Mist zu spät :-)

bttb930 3. Jul 2004 14:59

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.

Luckie 3. Jul 2004 15:01

Re: MenuItems hinzufügen und mit OnClick ausrüsten
 
Und wie soll das ganze dynamisch funktionieren?

Moony 27. Mär 2006 15:36

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:
  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;
Wie man im Code sieht weise ich dem neu erstellten Item ein bestimmtes OnClick-Ereignis zu. Das bezieht sich auf den folgenden Menupunkt.
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:
  myLang := (Sender as TMenuItem).Caption;
  if myLang = 'German' then
  ...
Das funktioniert wunderbar und ich kann den Sender bzw. den Menüpunkt abfragen welcher gerade das Onlick-Ereignis ausgeführt hat.
Hoffe das hilft dir weiter.

Gruß, Moony


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 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