(Erl) MainMenu1 zur Laufzeit erstellen und darauf zugreifen

Für allgemeine Fragen zur Programmierung, welche nicht! direkt mit Lazarus zu tun haben.
Antworten
Hercules
Beiträge: 104
Registriert: Mi 2. Jun 2010, 17:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

(Erl) MainMenu1 zur Laufzeit erstellen und darauf zugreifen

Beitrag von Hercules »

Hallo an Alle und einen schönen Guten Tag erst mal. :D

Ich möchte zur Laufzeit ein MainMenu1 erstellen,
dazu habe ich auf einer Form ein TMainmenu1 platziert.

Im FormCreate habe ich zur Laufzeit dann zwei Menü-Punkte
mit jeweils drei Untermenü-Punkten erstellt.

Mein Problem ist:

Wenn ich einen Click auf ein solches Untermenü mache,
dann tut sich nichts. Mir ist auch klar, warum sich nichts tut,
denn wie und wo kann ich bei Menü-Punkten, die zur Laufzeit
erstellt wurden, ein OnClick-Ereignis einfügen ?

Ich habe es schon wie ein Weltmeister bei Google versucht,
aber gebracht hat es nicht viel. Ich habe da gerade mal
lernen können, wie man es erstellen kann.

Bitte, was muss ich denn da noch machen ?
Weiß vielleicht jemand, was ich da vergessen habe?

Der Source-Code:

Code: Alles auswählen

unit Unit1;
{$mode objfpc}{$H+}
interface
uses
  Classes, SysUtils, Forms, Graphics, Menus;
type
  { TForm1 }
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    procedure FormCreate(Sender: TObject);
    Procedure NeuesMenu;
    Procedure UnterMenu;
  private
    { private declarations }
  public
    { public declarations }
  end;
var
  Form1: TForm1;
  A : Integer;
  B : Integer;
  C : Integer;
  MenuText : String;
  UnterMenuText : String;
  NeuesItem: TMenuItem;
  UnterItem: TMenuItem;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
MenuText := 'Menü';
UnterMenuText := 'Untermenü';
A := 0;
B := 0;
NeuesMenu;                   // Hinzufügen erstes Menü
UnterMenu;                   // Hinzufügen von drei Untermenüs zum ersten Menü
NeuesMenu;                   // Hinzufügen zweites Menü
UnterMenu;                   // Hinzufügen von drei Untermenüs zum zweiten Menü
end;
// Prozedur zum erstellen von Menü-Punkten
Procedure TForm1.NeuesMenu;
Begin
 A := A + 1;
 NeuesItem := TMenuItem.Create(mainmenu1) ;
 NeuesItem.Caption := MenuText + ' ' + IntToStr(A);
 Mainmenu1.Items.Add(NeuesItem);
end;
// Prozedur zum erstellen von drei Untermenüpunkten
Procedure TForm1.UnterMenu;
Begin
  B := B + 1;
  UnterItem := TMenuItem.Create(mainmenu1);
  UnterItem.Caption := UnterMenuText + ' ' + IntToStr(B);
  NeuesItem.Add(UnterItem);
  B := B + 1;
  UnterItem := TMenuItem.Create(mainmenu1);
  UnterItem.Caption := UnterMenuText + ' ' + IntToStr(B);
  NeuesItem.Add(UnterItem);
  B := B + 1;
  UnterItem := TMenuItem.Create(mainmenu1);
  UnterItem.Caption := UnterMenuText + ' ' + IntToStr(B);
  NeuesItem.Add(UnterItem);
end;
end.


Im Anhang habe ich mal eine GIF-Datei eingefügt, damit man sehen
kann, wie die Wirkung ist, wenn ich die Menüs anklicke.

Mit freundlichen Grüßen,
Hercules.
Dateianhänge
Beispiel.gif
Zuletzt geändert von Hercules am Do 25. Jun 2015, 19:59, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: MainMenu1 zur Laufzeit erstellen und darauf zugreifen

Beitrag von theo »

Hercules hat geschrieben:denn wie und wo kann ich bei Menü-Punkten, die zur Laufzeit
erstellt wurden, ein OnClick-Ereignis einfügen ?


Im Code, wie alles andere auch.

Code: Alles auswählen

...
MenuItem1.OnClick:=@MenuItem1Click;
...
procedure TForm1.MenuItem1Click(Sender: TObject);
begin
  //
end

Hercules
Beiträge: 104
Registriert: Mi 2. Jun 2010, 17:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: MainMenu1 zur Laufzeit erstellen und darauf zugreifen

Beitrag von Hercules »

Hallo Theo,
vielen Dank für Deine schnelle Antwort.
Dein Tipp hat mich schon ein gutes Stück weiter gebracht.
Jetzt kommt das Programm nach einem Click in
der neuen Prozedur auch an. Dabei ist es allerdings
unerheblich, welchen Menü-Punkt ich anclicke.
Ich muss jetzt nur noch herausfinden, welches Item
ich angeclickt habe. Da bin ich noch nicht ganz durch......

Vielen Dank, Hercules.

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: MainMenu1 zur Laufzeit erstellen und darauf zugreifen

Beitrag von baumina »

Den TMenuItem der geklickt wurde findest du im Sender, z.B. TMenuItem(Sender).Caption .
.

Hercules
Beiträge: 104
Registriert: Mi 2. Jun 2010, 17:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: MainMenu1 zur Laufzeit erstellen und darauf zugreifen

Beitrag von Hercules »

Hallo baumina,
danke für die Antwort, aber was muss ich denn als (Sender)
eintragen? Ich glaub, ich steh auf dem Schlauch.....
Hercules.

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: MainMenu1 zur Laufzeit erstellen und darauf zugreifen

Beitrag von baumina »

Um das Beispiel von oben nochmal zu nennen, die Variable Sender wird dir in der Procedure zur Verfügung gestellt.

Code: Alles auswählen

...
MenuItem1.OnClick:=@MenuItem1Click;
...
procedure TForm1.MenuItem1Click(Sender: TObject);
begin
  showmessage('Geklickt wurde: ' + TMenuItem(Sender).Caption);
end;
 
.

Hercules
Beiträge: 104
Registriert: Mi 2. Jun 2010, 17:56
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: MainMenu1 zur Laufzeit erstellen und darauf zugreifen

Beitrag von Hercules »

Hallo baumina, hallo Theo,
jetzt hab' ich das verstanden und es funktioniert.
Vielen Dank nochmal an Euch beide.
Hercules.

Antworten