![]() |
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 |
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. |
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 |
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. |
AW: Existenz eines Formulars steuern
Zitat:
|
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. |
AW: Existenz eines Formulars steuern
Könnte man nicht auch einfach alle Forms durchgehen und auf Active prüfen?
So mache ich es jedenfalls. |
AW: Existenz eines Formulars steuern
Screen.ActiveForm ? :stupdi:
Aber im OnButtonClick ist das ja bereits umgeschaltet. |
AW: Existenz eines Formulars steuern
Zitat:
|
AW: Existenz eines Formulars steuern
Warum nicht mit TForm.OnActivate/OnDeactivate steuern oder merken, welche Form den Fokus hatte?
|
AW: Existenz eines Formulars steuern
Zitat:
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) |
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. |
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 00:25 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