Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Existenz eines Formulars steuern (https://www.delphipraxis.net/192975-existenz-eines-formulars-steuern.html)

Mattze 7. Jun 2017 15:22

Existenz eines Formulars steuern
 
Hi,

entweder habe ich einen Knoten im Gehirn (Wahrscheinlich!) oder es geht wirklich nicht...

Ich habe 2 Formulare (F1 und F2).
Auf F1 liegt ein Toolbutton (TBtn, natürlich auf einer Toolbar).
Beim Click auf TBtn soll folgendes geschehen:
1. F2 existiert nicht.
Dann wird es erzeugt, angezeigt und aktiviert - kein Problem.
2. F2 existiert schon.
2a: F2 ist hinter F1 und deaktiviert.
Es wird nach vorne geholt und aktiviert. - kein Problem
2b: F2 ist vorne und aktiviert.
Dann soll es beim Click auf TBtn von F1 "beendet" werden (Zerstört, freigegeben... - wie immer man das
nennen will).
Das Freigeben selbst ist auch kein Problem.

Das Problem:
Wie unterscheide ich 2a und 2b? Die Z-Order (WM_Activate) wird schon vor dem TBtnClick geändert.
Mit Getforegroundwindow und Getnextwindow habe ich es auch nicht geschafft.

Geht sowas überhaupt?

(D7 pro)

Gruß
Mattze

ConnorMcLeod 7. Jun 2017 15:56

AW: Existenz eines Formulars steuern
 
Sobald man den TBtn clickt, ändert der Focus jedenfalls zu F1. So gesehen geht's nicht, weil man zu diesem Zeitpunkt nicht mehr weiß, welche Form den Focus vorher hatte.
D.h. vllt fällt Dir eine schlaue globale Variable ein, in der steht, welche Form in den Vordergrund geholt wurde - ausgenommen man clickt auf TBtn => dann soll sich diese Variable nicht ändern.
Ich ahne ein Wirrwarr von abgefangenen WindowsMessages ;-)

EDIT: die globale Variable könnte auch eine Art History-Liste sein, damit wäre mglw besser entscheidbar, ob TBtn gedrückt wurde.

Mattze 7. Jun 2017 16:10

AW: Existenz eines Formulars steuern
 
Hallo

und Danke für die schnelle Antwort.
Mit einer globalen Variable habe ich das auch mal probiert. (Es reicht eine public-Variable in F2, da F2 sowieso nur untersucht wird, wenn es existiert.)
Aber auch damit kriege ich es nicht hin.
Ich habe gedacht, dass ich das mit dem Handle aus WM_Activate - LParam kriege, aber nee...

Du hast wahrscheinlich recht, dass man da ein ziemliches Wirrwarr mit Windows-Messages anstellen muss.

Mal sehen...
Vielleicht fällt mir ja doch noch etwas ein.

Gruß
Mattze

himitsu 7. Jun 2017 16:14

AW: Existenz eines Formulars steuern
 
Garnicht.

Wenn du auf den Knopf drückst, muß die Form vorher den Fokus bekommen und das kannst du im Button-Click natürlich nicht unterscheiden, da dort die Form schon "lange" vor dem Klickevent den Fokus besitzt.


100% sicher lässt sich das einfach nicht lösen.

Vorschlag: im OnEnter der Form den Zeitpunkt (GetTickCount) merken und im OnClick des Buttons ist es 2b, bei einem kleinem zeitlichen Abstand.



OK, genauso wie beim TSpeedButton kann man auch eine Form so einstellen, dass sie beim Klicken nicht den Fokus bekommt,
was z.B. bei den virtuellen Tastaturen genutzt wird, aber dann bekommt deine Form1 garkeinen Fokus mehr.

ConnorMcLeod 7. Jun 2017 16:57

AW: Existenz eines Formulars steuern
 
Zitat:

Zitat von himitsu (Beitrag 1373752)
Vorschlag: im OnEnter der Form den Zeitpunkt (GetTickCount) merken und im OnClick des Buttons ist es 2b, bei einem kleinem zeitlichen Abstand.

Genau, deshalb würde ich die History machen, somit ist relativ klar, wer und in welchem zeitlichen Abstand den Focus vorher hatte. Kann ja ein kleiner Ringbuffer sein mit nur drei Einträgen oder so.

himitsu 7. Jun 2017 17:31

AW: Existenz eines Formulars steuern
 
Die History gibt es bereits.

Screen.Forms

Da sind alle VCL-Forms drin und die VCL schiebt die Fenster immer an Position 0, wenn sie den Fokus bekommen.
Also von 0 bis X hat man bereits alle Fenster, in der Reihenfolge ihrer letzten Aktivierung.

SneakyBagels 7. Jun 2017 17:34

AW: Existenz eines Formulars steuern
 
Könnte man nicht auch einfach alle Forms durchgehen und auf Active prüfen?
So mache ich es jedenfalls.

himitsu 7. Jun 2017 17:49

AW: Existenz eines Formulars steuern
 
Screen.ActiveForm ? :stupdi:

Aber im OnButtonClick ist das ja bereits umgeschaltet.

ConnorMcLeod 7. Jun 2017 18:08

AW: Existenz eines Formulars steuern
 
Zitat:

Zitat von himitsu (Beitrag 1373760)
die VCL schiebt die Fenster immer an Position 0, wenn sie den Fokus bekommen.

Eben, und genau diesen Automatismus können wir hier nicht gebrauchen ;-)

Sailor 7. Jun 2017 18:48

AW: Existenz eines Formulars steuern
 
Warum nicht mit TForm.OnActivate/OnDeactivate steuern oder merken, welche Form den Fokus hatte?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:56 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf