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/)
-   -   Alle Klicks auf Form abfangen (https://www.delphipraxis.net/188312-alle-klicks-auf-form-abfangen.html)

Schwedenbitter 18. Feb 2016 21:14


Alle Klicks auf Form abfangen
 
Hallo,

ich habe wegen diverser Anforderungen ein Popup-Menü als TForm ohne Rahmen etc. selbst gebastelt. So weit, so gut.
Jetzt grüble ich schon eine ganze Weile daran, wie ich das Verhalten eines Popup-Menü auf Klicks und Tastendrücke nachbauen kann. Ich könnte jetzt bei jedem einzelnen TLabel, TComboBox etc. auf OnClick reagieren. Das wird aber unübersichtlich. Jetzt habe ich probiert,
Delphi-Quellcode:
TForm.WindowProc
umzuleiten. Bei TLabel funktioniert folgender Code, der aber bei TMemo und TComboBox nichts anzeigt:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
   fOldWndProc:= self.WindowProc;
   self.WindowProc:= FormWndProc;
end;

procedure TForm1.FormWndProc(var Message: TMessage);
begin
   case Message.Msg of
      WM_LBUTTONDOWN,
      WM_RBUTTONDOWN   :
      begin
         Memo1.Lines.Append('Jetzt');
         Message.Result:= 0;
      end;
   end;
   fOldWndProc(Message);
end;
Ich bin auch etwas ideenlos bzgl. der Suche. Aber die Suchworte "delphi form parentclick" hat mir nichts gebracht. Hat jemand eine Idee?

jaenicke 18. Feb 2016 21:26

AW: Alles Klicks auf Form abfangen
 
Suchst du vielleicht OnExit deines Popup-Formulars?
Das wird ausgelöst, wenn dieses den Eingabefokus verliert, sprich du daneben klickst.

Schwedenbitter 18. Feb 2016 21:54

AW: Alle Klicks auf Form abfangen
 
Zitat:

Zitat von jaenicke (Beitrag 1330781)
Suchst du vielleicht OnExit deines Popup-Formulars?
Das wird ausgelöst, wenn dieses den Eingabefokus verliert, sprich du daneben klickst.

Hhm. Das hört sich interessant an. Danke für die Antwort. Das gäbe mir auch die Möglichkeit, dass sich das "Popup" selbst schließt, wenn man daneben klickt. Allerdings scheint es bei mir "XE5" nicht zu funktionieren. Klicke ich neben das Fenster, blinkt es bloß.
Auch wird das bei mir für TForm nicht im Objektinspektor angezeigt. Ich muss das dann von Hand eingeben und zuweisen.

Es ist aber auch nicht ganz das, was ich suche. Das Fenster soll auch geschlossen werden, wenn der Benutzer auf eines seiner Controls (5 TLabels, 2 TComboBoxes, 1 TSpeedButton) klickt. Jetzt kann ich TNotifyEvents anlegen oder alle 8 Events auf ein gemeinsames TNotifyEvent setzen. Das wollte ich aber nicht.
Denn es kommen perspektivisch weitere Elemente dazu. Und das Fenster soll auch schließen, wenn der Benutzer auf eine nicht belegte Stelle klickt.

jaenicke 19. Feb 2016 04:46

AW: Alle Klicks auf Form abfangen
 
Ein Popupfenster stelle ich mir nicht modal vor, das muss mit Show angezeigt sein. Ansonsten funktioniert das mit dem Danebenklicken natürlich nicht.

Habe ich die Eigenschaft gerade verwechselt? Hieß die OnLeave? Müsste ich nachschauen. Die muss jedenfalls im Objektinspektor sein wie das Gegenstück OnEnter.

Aber ganz verstehe ich das noch nicht... die Controls auf dem Popup soll man gar nicht nutzen können? Wenn man drauf klickt soll das Popupfenster verschwinden? Oder soll man diese per Tastatur anspringen und nutzen können?

Schwedenbitter 19. Feb 2016 12:48

AW: Alle Klicks auf Form abfangen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Erstmal danke für die Geduld!
Zitat:

Zitat von jaenicke (Beitrag 1330790)
Ein Popupfenster stelle ich mir nicht modal vor, das muss mit Show angezeigt sein. Ansonsten funktioniert das mit dem Danebenklicken natürlich nicht.

Wir bei mir auch "nur" mittels show angezeigt. Das Danebenklicken frage ich schon umständlich ab. Also hätte ich an
Delphi-Quellcode:
OnExit();
schon sehr Interesse! Denn dann hätte ich ein Event und gut wäre es.

Zitat:

Zitat von jaenicke (Beitrag 1330790)
Habe ich die Eigenschaft gerade verwechselt? Hieß die OnLeave? Müsste ich nachschauen. Die muss jedenfalls im Objektinspektor sein wie das Gegenstück OnEnter.

Nein, Du hast es richtig. Es gibt ein OnExit für die Ableitungen von TControl. Allerdings bekomme ich das nicht zum Funktionieren:
Delphi-Quellcode:
type
   TForm1 = class(TForm)
     SpeedButton1: TSpeedButton;
     ScrollBox1: TScrollBox;
     ComboBox1: TComboBox;
     procedure SpeedButton1Click(Sender: TObject);
     procedure ScrollBox1Exit(Sender: TObject);
   end;

var
   Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ScrollBox1Exit(Sender: TObject);
begin
   ScrollBox1.Visible:= False;   // Wird nicht ausgelöst :-(
end;

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
   ScrollBox1.Visible:= Not ScrollBox1.Visible;
end;
Zitat:

Zitat von jaenicke (Beitrag 1330790)
Aber ganz verstehe ich das noch nicht... die Controls auf dem Popup soll man gar nicht nutzen können? Wenn man drauf klickt soll das Popupfenster verschwinden? Oder soll man diese per Tastatur anspringen und nutzen können?

Habe mich vermutlich auch bloß blöd ausgedrückt:
Auch Popup-Menüs kann man dazu "missbrauchen", um neben den MenuItems auch Infos anzuzeigen; etwa in Enabled:= False Items. Ich mache den Aufwand auch bloß, weil ich es nicht schaffe, die Popup-Menüs vom Aussehen her dem neuen Klicki-Bunti-Groß-Aussehen der Windows-10-Apps anzugleichen und TComboBoxes einzufügen.
Ich habe mal 2 Bilder dazu angehängt. Es soll aussehen, wie das große Bild. Das kleine Bild zeigt den oben wiedergegebenen Code an. Weder ein Klick auf das Formular, noch den SpeedButton, noch den Windows-Desktop lösen OnExit aus...

jaenicke 19. Feb 2016 14:30

AW: Alle Klicks auf Form abfangen
 
Grad nachgeschaut, beim Formular ist es OnDeactivate.

HolgerX 19. Feb 2016 14:32

AW: Alle Klicks auf Form abfangen
 
Hmm..

Also, wenn dein Popup eine TForm-Ableitung ist, das Form mit 'Show' angezeigt wird und Du möchtest, dass dieses Formular 'geschlossen' wird Du neben dieses Formular in deine Anwendung clickst,
dann benutze doch das OnDeactivate-Event:
Delphi-Quellcode:
procedure TForm2.FormDeactivate(Sender: TObject);
begin
  Close;
end;

Das Gegenstück ist OnActivate

Nur ein Control mit einem Eingabefeld hat ein OnEnter und ein OnExit, da man 'hinein' und wieder 'hinaus' gehen kann.
Ein Formular selber hat kein Eingafeld, somit auch kein OnEnter/OnExit.
Das gleiche gilt für Scrollboxen, Panels, Buttons..

Wenn Du noch willst, dass die Popup-Form auch geschlossen wird, wenn deine Applikation den Focus verliert, dann musst du mit Application.HookMainWindow arbeiten.

Delphi-Quellcode:

function TForm1.AppHookFunc(var Message: TMessage): Boolean;
begin
  Result := False;
  if Message.Msg = CM_ACTIVATE then begin
// Hier alles was beim Aktivieren deiner Applikation
  end;
  if Message.Msg = CM_DEACTIVATE then begin
// Hier alles was beim DeAktivieren deiner Applikation
// Wie z.B. PopUp.Close;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.HookMainWindow(AppHookFunc);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Application.UnHookMainWindow(AppHookFunc);
end;


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