Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Popupmenu während der Laufzeit verändern


Atreyu - Mo 26.11.07 20:23
Titel: Popupmenu während der Laufzeit verändern
Ich möchte mein Popupmenü in der Laufzeit editieren, zB neue Menüs dazu oder wegmachen. Ich hab bisher noch nichts gefunden und kann es nur in der Umgebung von Derlphi verändern, geht das irgendwie?


Gausi - Mo 26.11.07 20:34

Klar geht das. z.B. so:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
var newItem: TMenuItem;
begin
  newItem := TMenuItem.Create(self);
  newItem.Caption := 'Neues Item';
  newItem.OnClick := Button1Click;
  PopupMenu1.Items.Add(newItem);
end;


Atreyu - Mo 26.11.07 20:40

OH DANKE! Jetzt kann ich mein langersehntes neues Feature einbauen!


Atreyu - Mo 26.11.07 22:30

Oh, sorry, aber wenn cih etwas in einem Submenu added will?

Weil deine Funktion added mir das direkt ins popup, aber das muss in ein Submenü.

edit:


Quelltext
1:
MenuSkins.Add(newItem);                    


MenuSkins ist mein Submenu. So klappts, BIS auf die Tatsache, dass das erste item leer bleibt.

Also die Items werden in einer Schleife hinzugefügt, ich kriege die auch schön in eine Liste, nur leider fehlt die Caption im ersten Item des Submenüs.

Was fehlt?

und: Er springt ja beim Klick auf jedes der Items in eine procedure. Nur wie kriege ich in der procedure raus, welches Item jetzt das Event ausgelöst hat?


Tilman - Mo 26.11.07 22:40

meinst du so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
var newItem: TMenuItem;
begin
  newItem := TMenuItem.Create(self);
  newItem.Caption := 'Neues Item';
  newItem.OnClick := Button1Click;
  PopupMenu1.Items[0].Add(newItem);  // Wobei 0 der index des submenüs ist
end;

?

// Edit: zeig mal deine Schleife. Vielleicht hast du nicht berücksichtigt das die zählung bei 0 beginnt?


Atreyu - Mo 26.11.07 22:59

Beginnt bei 0, ja, spüielt aber keine Rolle, da ich ja Add nehme.

Ich habe jetzt Item[0] sowieso anderweitig belegt, ist also ander gelöst.

Nur kann ich (wie editiert oben) nicht ermittelt, auf welches Item der User geklickt hat. Wie kann ich das machen?
Ich lasse alle Items zu einer Funktion mit parameter Sender: TObject springen, aber dort muss ich ja wissen, welches Menuitem es genau war.


Tilman - Mo 26.11.07 23:12

Ich hab das immer so gemacht dass ich tag entsprechend gesetzt habe.
Also in der Schleife z.B.


Delphi-Quelltext
1:
MenuItem.tag := i;                    


Und später kannst du dann in der Behandlungsroutine, im Beispiel war das ja Button1Click, so vorgehen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
var
  index: Integer;
begin
  index := (sender as TMenuItem).tag;
  case index of
    0: ;  // erstes item
    1: ;  // zweites item
    2: ;  // drittes item
  end;
end;


natürlich kannst du auch caption abfragen oder so.


Atreyu - Mo 26.11.07 23:19

Ahhh, dankedankedanke!

Genau, was ich suche. Auf das "as" wäre ich nie gekommen!

edit: Kann es sein, dass er Strings verändert, wenn er sie aus ner INI liest? Auf einmal haben Buchstaben ein "_" drunter...


Agawain - Mi 28.11.07 11:00

hi

Nein, setz die Eigenschaft Autohotkeys des Menüeintrags auf maManual, deafault ist maAutomatic

Gruß

Aga


Atreyu - Mi 28.11.07 11:32

Danke dir, aber ich habe das Problem in diesem Thread forgeführt, da es hier nicht reinpasste.

http://www.delphi-forum.de/topic_iniReadString+liefert+seltsame+Strings_78606.html