Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Problem mit dynamischem PopUp Menu (https://www.delphipraxis.net/78750-problem-mit-dynamischem-popup-menu.html)

Grolle 10. Okt 2006 16:45


Problem mit dynamischem PopUp Menu
 
Hallo,
ich erstelle aus einem Treeview ein PopUpMenÜ:
Delphi-Quellcode:
  if not Assigned(Node) then
    begin
      Temp := AdvTreeComboBox1.Treeview.Items[0];
      while Assigned(Temp) do
        begin
          Item := TMenuItem.Create(Self);
          Item.Caption := Temp.Text;
          Item.OnClick := MenuItemClick;
          PopupMenu1.Items.Add(Item);
          if Temp.Count > 0 then AddMenu(Temp, Item);
          Temp := Temp.GetNextSibling;
        end;
    end
  else
    begin
      Temp := Node.GetFirstChild;
      while Assigned(Temp) do
        begin
          Item := TMenuItem.Create(Self);
          Item.Caption := Temp.Text;
          Item.OnClick := MenuItemClick;
          Menu.Add(Item);
          if Temp.Count > 0 then AddMenu(Temp, Item);
          Temp := Temp.GetNextSibling;
        end;
    end;

und:

procedure TForm1.MenuItemClick(sender : TObject);
var
s : string;
begin
  with Sender as TMenuItem do
    begin
      s := caption;
    end;
    ShowMessage(s);
end;
Leider klappt das OnClick-Ereignis im Menü nicht so wie es soll. Schon im der oberen Ebene
wird die Mesage beim MouseOver angezeigt?!?
Viele Grüße...

Grolle 12. Okt 2006 11:39

Re: Problem mit dynamischem PopUp Menu
 
Niemand eine Ahnung? :|

marabu 12. Okt 2006 17:02

Re: Problem mit dynamischem PopUp Menu
 
Hallo Stefan,

du solltest den menu items, welche als Untermenü fungieren, nicht den gleichen OnClick() event handler zuordnen, wie den items auf der untersten Ebene. Zumindest solltest du im event handler unterscheiden:

Delphi-Quellcode:
procedure TForm1.MenuItemClick(Sender: TObject);
var
  s: String;
begin
  with Sender as TMenuItem do
    if Count = 0 then
      ShowMessage(Caption);
end;
Hintergrund ist, dass deine submenu items beim Überfahren mit der Maus automatisch das event OnClick() auslösen.

Grüße vom marabu

Grolle 12. Okt 2006 19:01

Re: Problem mit dynamischem PopUp Menu
 
Hallo,
danke für deine Antwort. Leider komme ich jetzt nicht an die Caption von der obersten Ebene.
Gibt es da eine bessere Lösung?
Viele Grüße...

marabu 12. Okt 2006 19:11

Re: Problem mit dynamischem PopUp Menu
 
Du kannst die Items in einem Menü durchaus auch als Baum begreifen. Insofern gibt es routing items (inner nodes) und action items (leaf nodes). Wenn du ein action item anklickst, hast du über die Parent-Eigenschaft die Möglichkeit alle übergeordneten Captions zu ermitteln. Ist das nicht wunderbar? Wenn dich das nicht glücklich macht, dann beschreibe mal, wann du wozu den top level node benötigst.

Grüße

Grolle 12. Okt 2006 19:27

Re: Problem mit dynamischem PopUp Menu
 
Hi,
ich möchte mit den Einträgen meine Datenbank filtern.
Der Treeview ist:
Firma A - Abteilung A
- Abteilung B
- Abteilung C
Firma B - Abteilung A
- Abteilung B
- Abteilung C
.....
Ich brauch also z. B.: |Firma A| oder |Firma A - Abteilung B|.
Durch den String filtere ich die Datenbank. In der alten Programmversion hatte ich
nur eine ebene, was natürlich einfacher war :roll:
Viele Grüße...

marabu 12. Okt 2006 19:47

Re: Problem mit dynamischem PopUp Menu
 
Für deinen Anwendungsfall könnte ich mir einen zusätzlichen Total-Selektor vorstellen:

Code:
A-Firma >> [b]Alle[/b]
[color=#cccccc]B-Firma[/color]   -----------
[color=#cccccc]C-Firma[/color]   A-Abteilung
           B-Abteilung
Wenn dein Datenmodell stimmig ist, dann harmoniert dieser Ansatz ausgezeichnet mit diesem.

Gute Nacht

Grolle 12. Okt 2006 19:54

Re: Problem mit dynamischem PopUp Menu
 
Ich kann dir nicht ganz folgen... :?

marabu 12. Okt 2006 20:05

Re: Problem mit dynamischem PopUp Menu
 
Hallo Stefan,

nochmal mit anderen Worten: wenn deine Daten vollständig normalisiert sind, dann hast du sowieso nur Referenzen auf die Abteilung und in einer gesonderten Tabelle ORGEINHEITEN (bei rekursivem Ansatz, ansonsten zwei Tabellen FIRMEN und ABTEILUNGEN) die Beziehung von Abteilung zu Firma. Damit alle Befehle nur auf der Blatt-Ebene des Menübaums ausgeführt werden, nimmst du zusätzlich zu den Abteilungen einer Firma einfach noch das Item "Alle" mit auf und selektierst entsprechend.

Besser so?

Grolle 12. Okt 2006 20:14

Re: Problem mit dynamischem PopUp Menu
 
Jetzt hats geklingelt :stupid:.


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