Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   TButtonEdit, buttons und dropdown menu - wie Aufrufer finden? (https://www.delphipraxis.net/213630-tbuttonedit-buttons-und-dropdown-menu-wie-aufrufer-finden.html)

softtouch 29. Aug 2023 18:43

TButtonEdit, buttons und dropdown menu - wie Aufrufer finden?
 
Ich habe mehrere TButtonEdit controls, alle haben linken und rechten button sichtbar.
Die linken buttons haben alle das gleiche TPopupmenu als dropdown menu zugewiesen bekommen.
Wenn ich nun einen Menu Eintrag auswähle, wie weiss ich dann, welches TButtonEdit control das Popup menu angezeigt hat, damit ich im richtigen edit Feld Änderungen vornehmen kann?
Die property TPopupMenu.PopupCompopnent scheint nur bei normalen popup menus zu funktionieren, bei einem Dropdown menu ist es immer nil.

himitsu 29. Aug 2023 19:37

AW: TButtonEdit, buttons und dropdown menu - wie Aufrufer finden?
 
Normal via Delphi-Referenz durchsuchenTPopupMenu.PopupComponent


falls hier der Button und nicht das ButtonEdit übergeben wird. :stupid:

softtouch 29. Aug 2023 19:41

AW: TButtonEdit, buttons und dropdown menu - wie Aufrufer finden?
 
Zitat:

Zitat von himitsu (Beitrag 1526234)
Normal via Delphi-Referenz durchsuchenTPopupMenu.PopupComponent


falls hier der Button und nicht das ButtonEdit übergeben wird :stupid:

Wenn ich das popupmenu in die dropdownmenu property eintrage, klappt das nicht, da ist popupcomponent immer nil.

himitsu 29. Aug 2023 19:44

AW: TButtonEdit, buttons und dropdown menu - wie Aufrufer finden?
 
Der Aufrufer muß das übergeben, also der Button des ButtonEdit.

* Manche vergessen es zu setzen :wall:
* und Andere achten nicht richtig drauf, was sie übergeben, bei solchen kombinierten Komponenten.

jaenicke 29. Aug 2023 19:49

AW: TButtonEdit, buttons und dropdown menu - wie Aufrufer finden?
 
Der Quelltext sieht so aus:
Delphi-Quellcode:
    WM_LBUTTONDOWN:
      if FButton.FDropDownMenu <> nil then
      begin
        if not (csDesigning in Parent.ComponentState) then
        begin
          LPoint := ClientToScreen(Point(0, FButton.EditControl.Height));
          FButton.FDropDownMenu.Popup(LPoint.X, LPoint.Y);
        end;
      end
Heißt:
Du hast keinerlei Information, welcher Button dahintersteckt. Das Menü wird einfach nur an Punkt X/Y aufgemacht.

Einziger Weg:
Nachschauen, welcher Button an der Popupstelle liegt. Schön ist das nicht.

Warum klonst du nicht einfach das Menü beim Start des Programms und gibst jedem Button eine eigene Kopie? Dann packst du eine ID in die Eigenschaft Tag (oder nennst das Menü in Name wie den Button plus einen kleinen Zusatz) und kannst die Menüs (und damit die Buttons dazu) so voneinander unterscheiden.

softtouch 29. Aug 2023 19:49

AW: TButtonEdit, buttons und dropdown menu - wie Aufrufer finden?
 
Zitat:

Zitat von himitsu (Beitrag 1526236)
Der Aufrufer muß das übergeben, also der Button des ButtonEdit.

* Manche vergessen es zu setzen :wall:
* und Andere achten nicht richtig drauf, was sie übergeben, bei solchen kombinierten Komponenten.

popupcomponent ist definitiv NIL.
popupcomponent ist nur gesetzt, wenn ich das menu in der popupmenu property eintrage, jedoch NIl wenn ich es in der dropdownmenu property eintrage.

softtouch 29. Aug 2023 19:50

AW: TButtonEdit, buttons und dropdown menu - wie Aufrufer finden?
 
Zitat:

Zitat von jaenicke (Beitrag 1526237)
Der Quelltext sieht so aus:
Delphi-Quellcode:
    WM_LBUTTONDOWN:
      if FButton.FDropDownMenu <> nil then
      begin
        if not (csDesigning in Parent.ComponentState) then
        begin
          LPoint := ClientToScreen(Point(0, FButton.EditControl.Height));
          FButton.FDropDownMenu.Popup(LPoint.X, LPoint.Y);
        end;
      end
Heißt:
Du hast keinerlei Information, welcher Button dahintersteckt. Das Menü wird einfach nur an Punkt X/Y aufgemacht.

Einziger Weg:
Nachschauen, welcher Button an der Popupstelle liegt. Schön ist das nicht.

Warum klonst du nicht einfach das Menü beim Start des Programms und gibst jedem Button eine eigene Kopie? Dann packst du eine ID in die Eigenschaft Tag (oder nennst das Menü in Name wie den Button plus einen kleinen Zusatz) und kannst die Menüs (und damit die Buttons dazu) so voneinander unterscheiden.

Ja, das scheint wohl die einzigste Möglichkeit zu sein.

himitsu 29. Aug 2023 20:03

AW: TButtonEdit, buttons und dropdown menu - wie Aufrufer finden?
 
Zwei Popupmenüs (die Items kann man ja kopieren lassen)

oder das Popup selber aufrufen. (anstatt es dem Button zuzuweisen)
Delphi-Quellcode:
procedure TForm4.ButtonedEdit1LeftButtonClick(Sender: TObject);
var
  P: TPoint;
begin
  P := ButtonedEdit1.ClientToScreen(Point(8, 8)); // P := Screen.CursorÄhhhhhhhh; .., OK oder GetCursorPos(P);
  PopupMenu1.PopupComponent := TComponent(1); // ein Dummy-Objektzeiger, außer du hast ein richtiges Objekt dafür
  PopupMenu1.Popup(P.X, P.Y);
end;

himitsu 29. Aug 2023 20:15

AW: TButtonEdit, buttons und dropdown menu - wie Aufrufer finden?
 
Wisst ihr, was daran auch noch schlimm ist, wenn jemand das garnicht zuweist?

Sie hätten wenigstewns NIL zuweisen müssen, denn
Delphi-Quellcode:
procedure TForm4.PopupMenu1Popup(Sender: TObject);
begin
  if Assigned(PopupMenu1.PopupComponent) then
    ShowMessage(PopupMenu1.PopupComponent.ClassName + ' ' + PopupMenu1.PopupComponent.Name)
  else
    ShowMessage('nil');
end;
und nun häng das Popup an diese Buttons und an diese oder eine andere Komponente.

* auf Button linksklicken = nil
* auf die Komponente oder Button rechtsklicken = Komponentenname
* nochmal auf Button linksklicken = NICHT nil :freak:


[add]
Vor allem gibt es Referenzen, welche man verwenden kann, denn .LeftButton und .RightButton werden rausgegeben.

softtouch 29. Aug 2023 20:25

AW: TButtonEdit, buttons und dropdown menu - wie Aufrufer finden?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe es wie vorgeschlagen manuell gemacht und es klappt nun.
Zum Testen wird der Menu Text in das buttonededit control eingefügt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr.
Seite 1 von 2  1 2      

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