Delphi-PRAXiS

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?

himitsu 7. Jun 2017 20:09

AW: Existenz eines Formulars steuern
 
Zitat:

Zitat von ConnorMcLeod (Beitrag 1373767)
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 ;-)

Beim ButtonClick ist die eigene Form jetzt aktiv und die Form auf Index 1 war vor uns aktiv.

Das gilt nur nicht, wenn die vorherige Form freigegeben (aus der Liste gelöscht) und dadurch unsere Form aktiv wurde, aber in diesem Fall hatte wohl auch niemand von der anderen Form aus versucht den Knopf zu drücken. (außer du gibst in dem Knopf diese Form frei, aber das ist hier auch egal, da der Knopf gerade gedrückt wird, der eine nicht mehr aktive Form freigeben würde, was ja niemanden interessiert)

Jasocul 8. Jun 2017 06:10

AW: Existenz eines Formulars steuern
 
Nutze doch das OnActivate von F1.
Wird es ausgelöst, muss F2 aktiv gewesen sein.
Wird es nicht ausgelöst, muss F1 schon aktiv gewesen sein.

Wenn man dort einen Schalter setzt, weiß man, wie man beim Klick auf den Button reagieren muss. Oder habe ich jetzt irgendwas übersehen?

Achtung:
OnActivate wird auch beim ersten Aufruf der Form ausgelöst.

Mattze 9. Jun 2017 15:29

AW: Existenz eines Formulars steuern
 
Hallo,

vielen Dank für Eure Antworten.
Ich habe das erstmal zurückgestellt. Besser: Als "unnötige", rein kosmetische Sache eingestuft und nicht weiter verfolgt.
Wobei die Auswertung von OnActivate bei F1 und F2 vielleicht wirklich ein gutes Ergebnis bringen.
Es ist allerdings nicht sooo einfach.
Wenn ein anderes Programm nämlich gerade aktiv ist, kann man das so, wie Jasocul schreibt, nicht machen. Da muss noch mehr dazu, um anderes auszuschließen und wirklich nur F2 zu kriegen...

Schaun mer mal...

Gruß
Mattze


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