Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - [VisualCLX] Popupmenu visible?
Niels_ - Mo 07.02.05 19:03
Titel: Popupmenu visible?
Ich habe ein Popupmenu und möchte nun herausfinden, ob der Benutzer überhaupt einen Eintrag ausgewählt hat oder ob das Popupmenu noch offen ist.
Ich kann zwar jedes Item abfragen, aber das bringt ja nichts, da ich immernoch nicht weiß, ob das Popupmenu noch visible ist oder nicht. Nur weil er auf kein Item geklickt hat, heißt das ja nicht, dass es nicht mehr offen ist (könnte aber durch Klick irgendwo anders auf die Form).
Würde dann etweder per Timer abfragen, ob das Popupmenu noch visible ist, oder (besser natürlich) abfangen können, wenn das Popupmenu geschlossen wird, ohne dass eine Auswahl getroffen wurde
Leider gibt es kein
Delphi-Quelltext
1:
| if popupmenu.visible then... |
oder
Delphi-Quelltext
1:
| if popupmenu.clickedout then |
Hat jemand Ideen??
Thx
Sprint - Mo 07.02.05 19:17
Windows sendet dazu die Nachricht WM_EXITMENULOOP. Bei TMainMenu kannst du die ohne weiters abfangen, weil dort die Nachricht an
die Form geschickt wird. Bei TPopupMenu's musst du das Fensterhandle von TPopupList subclassen. Das kannst du zum Beispiel so machen...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TForm1 = class(TForm) ... private OldPopupListWndProc: TFNWndProc; NewPopupListWndProc: TFNWndProc; procedure PopupListWndProc(var Message: TMessage); ... end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
|
procedure TForm1.FormCreate(Sender: TObject); begin NewPopupListWndProc := MakeObjectInstance(PopupListWndProc); OldPopupListWndProc := TFNWndProc(GetWindowLong(PopupList.Window, GWL_WNDPROC)); SetWindowLong(PopupList.Window, GWL_WNDPROC, Longint(NewPopupListWndProc)); end;
procedure TForm1.FormDestroy(Sender: TObject); begin SetWindowLong(PopupList.Window, GWL_WNDPROC, Longint(OldPopupListWndProc)); end;
procedure TForm1.PopupListWndProc(var Message: TMessage); begin with Message do begin case Msg of WM_ENTERMENULOOP:; WM_EXITMENULOOP:; end; Result := DefWindowProc(PopupList.Window, Msg, WParam, LParam); end; end;
|
Das ist aber eine Notlösung. Ich glaube bei Torry gibt es auf Popup Menus mit einem OnClose Event.
retnyg - Mo 07.02.05 19:22
oder einfach beim auswählen eines eintrags immer einen boolean (zb Usercliked) auf true setzen. an dem siehste dann im source obs angeklickt wurde.
Niels_ - Mo 07.02.05 19:30
@ retnyg
Das hab ich auch geschrieben, nur möchte ich in einem Timer (der synchron läuft) abfragen, ob das Popupmenu offen ist oder nicht. Da hilft mir das nicht weiter, danke trotzdem.
@ Sprint
Scheint zu funzen! Aber wieso ist das nur eine Notlösung?
:shock: Ich nehme zurück, dass es geht mit der Windowsabfrage... Ähm. Nun gehen die Clicks auf das Popupmenu nicht mehr! :roll:
:oops:
Und bei Torry finde ich nur eine compo für Delphi5, wobei ich D7 haben... Ist leider eine installationsfile, soll heißen dass ich die unit/kompo garnicht sehen kann... So ein schitt!
Jemand Lösungsvorschläge?!
Moderiert von
raziel: Beiträge zusammengefasst
Moderiert von
raziel: Erneut Beiträge zusammengefasst. Der "Moderiert von ..." Hinweis ist doch wirklich nicht zu übersehen!
Ups! Sorry Raziel! Hatte direkt hintereinander reingeschrieben
Hab bei Torry doch das entsprechende gefunden...
Danke für eure hilfe!
Sprint - Mo 07.02.05 23:43
Niels_ hat folgendes geschrieben: |
Ich nehme zurück, dass es geht mit der Windowsabfrage... Ähm. Nun gehen die Clicks auf das Popupmenu nicht mehr! |
Falsche WinAPI Funktion benutzt. Muss natürlich CallWindowProc sein und nicht DefWindowProc.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TForm1 = class(TForm) ... private OldPopupListWndProc: TFNWndProc; NewPopupListWndProc: TFNWndProc; procedure PopupListWndProc(var Message: TMessage); ... end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
|
procedure TForm1.FormCreate(Sender: TObject); begin NewPopupListWndProc := MakeObjectInstance(PopupListWndProc); OldPopupListWndProc := TFNWndProc(GetWindowLong(PopupList.Window, GWL_WNDPROC)); SetWindowLong(PopupList.Window, GWL_WNDPROC, Longint(NewPopupListWndProc)); end;
procedure TForm1.FormDestroy(Sender: TObject); begin SetWindowLong(PopupList.Window, GWL_WNDPROC, Longint(OldPopupListWndProc)); FreeObjectInstance(NewPopupListWndProc); end;
procedure TForm1.PopupListWndProc(var Message: TMessage); begin with Message do begin case Msg of WM_ENTERMENULOOP:; WM_EXITMENULOOP:; end; Result := CallWindowProc(OldPopupListWndProc, PopupList.Window, Msg, WParam, LParam); end; end;
|
Niels_ - Di 08.02.05 18:34
@ Sprint
GEIL! Einfach nur GEIL! Vielen Dank! Weil die andere Komponente von Torry war lizenziert. Kam immer so ein toller infoschirm, dass man sich doch bitte registrieren sollte (für schlappe 24doller!!!)... So ist das jetzt absolut geil, many thx!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!