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 Dialog (TForm) soll PopUp-Menu nachahmen (https://www.delphipraxis.net/119807-dialog-tform-soll-popup-menu-nachahmen.html)

Andreas Leix 1. Sep 2008 09:16


Dialog (TForm) soll PopUp-Menu nachahmen
 
Hallo Leute !
Ich möchte ein erweitertes Rechtsklick-Menü implemetieren. Normalerwesie würde ich ein TPopUpMenu nehmen.
Die gestalterischen Möglichkeiten die ich darin habe, reichen aber nicht aus. Jetzt verwende ich ein "normales"
Formular und rufe es mit ShowModal auf. Das ganze funtkioniert gut (und bietet auch alle Möglichkeiten die ich brauche).
Nur eine Funktionalität eines PopUp-Menüs habe ich bis jetzt nicht hingekriegt: ein Popup-Fenster wird automatisch geschlossen, wenn der User außerhalb klickt.

Wie kann ich einem auf TForm basierenden Dialog beibringen, dass er geschlossen wird, wenn man ausserhalb klickt ??

Hat jemand eine Idee ?


Gruß Andreas

alias5000 1. Sep 2008 09:44

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Wenn deine Form den Fokus verliert, kannst du sie wieder schließen.
Das müsste das Verhalten nachahmen.

Gruß
alias5000

Sherlock 1. Sep 2008 10:11

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Verliert ein modales Fenster den Fokus, wenn man in die dazugehörige Applikation klickt? Für mich sieht das eher nicht so aus... Aber probieren geht über studieren ;)

Sherlock

alias5000 1. Sep 2008 10:34

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Naja, eigentlich wärs ja garnicht mal nötig, das Fenster modal zu machen ;)

Andreas Leix 1. Sep 2008 11:04

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Erstmal Danke für euer Engagement.

Ich muß den Dialog aus verschiedensten Gründen schon modal machen.
Der Rechtsklick ist u.U. in eine größere Ablaufsteuerung eingebunden.


Wie kann ein modales Fenster den Fokus verlieren ?

Wo kann ich denn überhaupt das Klick-Ereigniss abgreifen ?
Es scheint so, dass weder das Hauptprogramm das Klick-Ereigniss bekommt,
noch der Dialog, wenn man ausserhalb des Modalen Dialogs klickt.

Kann man evtl dem Dialog bei CreateParams noch irgendwelche Parameter geben ?
Oder gibt´s ´ne API Funktion mit der man ein Fenster als Popup startet?

Jelly 1. Sep 2008 11:29

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Hast du schon mal drüber nachgedacht, ein Frame zu nutzen anstatt eines Forms?

Andreas Leix 1. Sep 2008 12:41

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
hm.. Frame statt TForm ?
OK, aber wie dann weiter ?
Frame auf einem PopUp-Menu plazieren ? Geht das ? Wie ?

Jelly 1. Sep 2008 13:29

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Du kannst das Frame auf dem Form plazieren, und über die Visible Eigenschaft ein- und ausblenden. Beim Verschieben des Forms verschiebt sich somit das Frame automatisch mit. Und über Click Ereignisse des Forms kannst du so auch das Frame wieder ausblenden, wenn du möchtest.

Andreas Leix 1. Sep 2008 16:02

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Der Witz ist aber, dass mein erweitertes PopUp-Menü - sei es nun durch ein Form oder einen Frame realisiert -
modal angezeigt werden muss. Hat ein Frame überhaupt eine ShowModal-Routine?
Wenn ja, dann denke ich läuft das message handling gleich wie beim Formular, oder ?
Ich denke mit Frames kommt man da auch nicht weiter.

Gruß Andreas

Namenloser 1. Sep 2008 17:44

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
IMO widerspricht es sich, ein Form modal anzuzeigen, aber bei einem Klick außerhalb wieder zu schließen. Der Sinn von ShowModal ist ja, dass ich den Rest des Programms in der Zeit nicht benutzen kann.

Jelly 1. Sep 2008 19:20

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Zitat:

Zitat von Andreas Leix
Der Witz ist aber, dass mein erweitertes PopUp-Menü - sei es nun durch ein Form oder einen Frame realisiert -
modal angezeigt werden muss.

Wo ist denn da der Witz. Du blendest das Frame ein bzw. aus. Ins Frame kannst du legen was du willst. Analoges erreichst du wenn du deine Controls in ein Panel packst, nur dass ein Frame halt objektorientierter ist.


Zitat:

Zitat von Andreas Leix
Hat ein Frame überhaupt eine ShowModal-Routine?

Das hab ich nie gesagt, sondern nur, dass du das Frame über die Visible Eigenschaft beliebig ein- und ausblenden kannst.

Andreas Leix 2. Sep 2008 07:27

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Die Geschichte mit ein/ausblenden ist schon ok.
Ich will wie gesagt ein Popup-Menü simulieren, in dem anderere Items drin sind, als nur typische Menü-Punkte.
Bei einem PopUp-Menü ist es ja so, dass sobald es aufpoppt, man sonst nichts vom Programm bedienen kann,
ausser eben Punkte aus dem Popup-Menü anzuklicken. In diesem Sinne ist es ein modales Fenster und auch genau das
was ich brauche.
Eine Besonderheit hat ein Popup aber: Klickt man irgendwo ausserhalb, dann geht es zu.

Um zu erreichen, dass man während mein Pseudo-Popup sichtbar ist, nichts anderes im Programm
anklicken kann, zeige ich es mit ShowModal an. Damit erreiche ich genau das Gewünschte.

Jetzt fehlt mir nur diese eine Besonderheit eines Popups: Ausserhalb klick --> Popup geht zu.


Gruß Andreas

DeddyH 2. Sep 2008 07:34

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Und wenn Du auf WM_KILLFOCUS reagierst?

[edit] Geht aber nicht bei modalen Fenstern. [/edit]

SirThornberry 2. Sep 2008 07:38

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Wie bereits gesagt solltest du es schließen wenn dein Menü den Focus verliert. Dies passiert zum Beispiel wenn jemand ein anderes Programm auswählt etc.
Wenn du dich für ShowModal entscheidest hast du dich ja bewusst dafür entschieden das der Rest deiner Formulare nicht bedienbar ist, entsprechend können diese natürlich auch nicht den Focus bekommen.
Ich wüsste übrigens keinen Grund warum ein Popupmenü Modal angezeigt werden muss. Das ist auch nicht bei TPopupMenü so.

Ich finde deine Aussage widerspricht sich einfach ein wenig. Du willst das dein Menü zu geht wenn du eines deiner anderen Forms auswählst, willst aber nicht das man diese auswählen kann (deswegen nimmst du ja ShowModal)

In wie weit ein Frame hier helfen soll ist mir nicht klar. Ob ich nun die Dinge direkt auf dem Formular plaziere oder auf einem Frame welcher dann auf dem Formular plaziert hat den gleichen Effekt bezüglich Anzeige und Verhalten.

teebee 2. Sep 2008 07:47

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Zitat:

Zitat von Andreas Leix
Bei einem PopUp-Menü ist es ja so, dass sobald es aufpoppt, man sonst nichts vom Programm bedienen kann,
ausser eben Punkte aus dem Popup-Menü anzuklicken.

Dieses Verhalten kann ich nicht nachvollziehen. Ein Programm bleibt immer normal bedienbar, auch wenn ein PopUp offen ist. Bei einem Klick auf ein anderes Control verschwindet das PopUp und das Control reagiert auf den Klick. Von daher sehe ich auch keine Notwendigkeit für ein modales Fenster.
Welche Anwendung verhält sich denn so wie von Dir beschrieben?

alzaimar 2. Sep 2008 07:48

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Ich würde das einfach über den WindowsStyle 'WS_POPUP' regeln:

DeddyH 2. Sep 2008 07:49

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Ich persönlich würde mich auch "bedanken", wenn ein PopupMenu modal wäre. Versehentlich die rechte Maustaste geklickt und man müsste einen Funktion des Menüs ausführen, auch wenn man das gar nicht will.

Jelly 2. Sep 2008 08:21

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Zitat:

Zitat von Andreas Leix
Bei einem PopUp-Menü ist es ja so, dass sobald es aufpoppt, man sonst nichts vom Programm bedienen kann, ausser eben Punkte aus dem Popup-Menü anzuklicken.

Das stimmt so nicht. Wenn ich ein normales Popup Menu geöffnet habe, und klicke dann z.B. auch eine Checkbox auf der Form, dann wird dieser Click schon registriert: Die Checkbox ist gesetzt, erhält den Fokus und das Popupmenu schliesst... daran ist nur wirklich nix modal.


Zitat:

Zitat von SirThornberry
In wie weit ein Frame hier helfen soll ist mir nicht klar. Ob ich nun die Dinge direkt auf dem Formular plaziere oder auf einem Frame welcher dann auf dem Formular plaziert hat den gleichen Effekt bezüglich Anzeige und Verhalten.

Das stimmt. Ich nannte ja auch bereits noch ein Panel als Alternative, das ein- und ausgeblendet wird. Frames verhalten sich in dem Sinne ja gleich. Finde nur der objektorientierte Ansatz etwas besser, z.B. wenn das Menü an einer anderen Programmstelle auch eingeblendet werden soll. Ist aber Geschmackssache.

alias5000 2. Sep 2008 10:58

Re: Dialog (TForm) soll PopUp-Menu nachahmen
 
Zusammenfassung:
Fenster nicht modal machen und wenns den Fokus verliert, schließen. Oder?

Gruß
alias5000


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:50 Uhr.

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