ZOrder einer Form abfragen

Rund um die LCL und andere Komponenten
Antworten
Martin V
Beiträge: 142
Registriert: Sa 30. Jan 2010, 19:35
OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
CPU-Target: xxBit

ZOrder einer Form abfragen

Beitrag von Martin V »

Ich kann eine Form mit "BringToFront" nach oben (on top) bekommen und mit "SendToBack" nach unten. Bei Windows heißen diese Eigenschaften "HWND_TOP" und "HWND_BOTTOM". Gibt es eine Property, wo man den Zustand abfragen kann?

Der Grund meiner Frage:
Wenn eine Form den Focus hat (HasFocus = true), heißt das nicht automatisch, dass es auch oben liegt. Denn es gibt die Property "Form.StayOnTop". Wenn man diese Property bei einer anderen Form gesetzt hat, dann liegt die andere Form über der betrachteten Form, trotzdem hat die Form darunter den Focus.

Ich weiß, dass ich das "zu Fuß" herausbekommen kann und ich weiß wie man das mit Windows APIs macht. Bei der "zu Fuß" Methode kann man über Application.Forms[] schauen, ob eine Form eine StayOnTop oder eine SystemStayOnTop Property hat. Wenn es keine solche Form gibt, dann bedeutet HasFocus, dass das Windows auch oben ist, andernfalls nicht.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: ZOrder einer Form abfragen

Beitrag von Winni »

Hi!

Die Variable Screen enthält eine Unmenge von Infos, u.a. auch über die ZOrder:

Code: Alles auswählen

    property CustomFormZOrderCount: Integer read GetCustomFormZOrderCount;
    property CustomFormsZOrdered[Index: Integer]: TCustomForm
                               read GetCustomFormsZOrdered; // lower index means on top
Damit müsstest Du auch ohne OS-Helferlein auskommen .

Winni

Martin V
Beiträge: 142
Registriert: Sa 30. Jan 2010, 19:35
OS, Lazarus, FPC: Linux64, Wiindows32, MacOS, Lazarus 1.8.2
CPU-Target: xxBit

Re: ZOrder einer Form abfragen

Beitrag von Martin V »

OK, danke. Damit das Fenster selbst erfrägt, ob es innerhalb der Applikation zuoberst liegt, verwendet man also folgenden Vergleich:

Code: Alles auswählen

if Screen.CustomFormsZOrdered[0] = self then
   {ich bin das oberste Fenster}
Allerdings könnte dann immer noch ein Fenster eines anderen Programms drüber liegen. Wenn man zusätzlich den Focus abfrägt, dann wäre man schon relativ sicher, aber ganz sicher immer noch nicht.

Gäbe es auch eine Möglichkeit, nachzufragen, ob das Fenster komplett auf dem Bildschirm sichtbar ist und auch nicht ein Fenster von einem anderen Programm darüber liegt?

Ich habe für mein Programm eine Grafik-Beschleunigungsroutine eingebaut, die nur dann zum Einsatz kommen darf, wenn wirklich kein Fenster darüber liegt, weil sonst das fremde Fenster mitscrollt und neu gezeichnet wird.

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: ZOrder einer Form abfragen

Beitrag von Winni »

Hi!

TScreen hat auch noch

Code: Alles auswählen

property OnActiveFormChange: TNotifyEvent read FOnActiveFormChange
                                              write FOnActiveFormChange;
Mir ist allerdings nicht klar, ob die Reichweite für den gesamten Desktop gilt, oder nur für die eigene App.

Und falls immer noch ein fremdes Fenster scrollt, kannst Du das ja immer noch als Software-Gadget anbieten. Ist sowieso zu wenig Humor in der Software. Als ein Virus nix anderes tat, als die Y-Achse im Display zu flippen: alles auf dem Kopf....

Winni

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: ZOrder einer Form abfragen

Beitrag von sstvmaster »

Winni hat geschrieben:
Sa 16. Mai 2020, 01:51
Mir ist allerdings nicht klar, ob die Reichweite für den gesamten Desktop gilt...
Laut: http://docs.embarcadero.com/products/ra ... hange.html schon.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Antworten