Delphi-PRAXiS
Seite 1 von 2  1 2      

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/)
-   -   Delphi [gelöst] Fensterreihenfolge (https://www.delphipraxis.net/151496-%5Bgeloest%5D-fensterreihenfolge.html)

Schwedenbitter 20. Mai 2010 09:54


[gelöst] Fensterreihenfolge
 
Hallo,

ich habe ein Programm, dessen Hauptfenster beim Start nicht angezeigt wird. Es gibt lediglich ein Symbol im Tray. Ich benutze hierzu Application.ShowMainForm:=False; in der dpr. Es gibt mehrere Fenster, die jeweils separat benutzbar sein sollen und daher mit Show aufgerufen werden.
Wenn ich dann eines der Fenster anzeige, erscheint auch in der Taskleiste ein Eintrag, der beim Schließen aber wieder verschwindet. Zusätzlich gibt es beim Taskleisteneintrag natürlich ein System-Popup-Menü, in dem u.a. der Eintrag "Schließen" enthalten ist. Das ist so auch i.O. Allerdings teilen sich alle Fenster stets nur einen solchen Eintrag in der Taskleiste (Gruppieren ist ausgeschaltet).

Ablauf:
  • Programm startet nur im Tray ohne Fenster
  • Benutzer öffnet Fenster und es erscheint ein Eintrag in der Taskbar
  • Benutzer öffnet weiteres Fenster und es bleibt bei einem Eintrag in der Taskbar
  • Benutzer macht Rechtsklick auf Taskbar und klickt auf "Schließen"
  • mein Programm ruft das Ereignis OnFormCloseQuery mit der entsprechenden Procedure auf
Mein Ziel:
Ich möchte gern, dass immer nur das letzte Fenster (in meinem Beispiel das zweite) geschlossen wird, welches geöffnet wurde. Wie bekomme ich das raus?

Ich habe mehr als 2 Fenster. Öffne ich also Fenster 1, 2, 3, 4, n, dann sollen die in der Reihenfolge n, 4, 3, 2, 1 geschlossen werden. Ich hoffe, ich konnte mein Problem verständlich machen.

Idee:
Ich nehme eine Liste oder ein Array, in dem ich für jedes geöffnete Fenster einen Eintrag mache und dann beim Schließen jeweils die Liste durchgehe. Ich halte das aber für sehr aufwendig und möchte daher eben auch gern wissen, ob jemand eine bessere Idee oder das vielleicht sogar schon einmal gemacht hat.

Gruß & Dank, Alex

DeddyH 20. Mai 2010 09:57

Re: Fensterreihenfolge
 
Ich an Deiner Stelle würde auch einfach eine Liste hernehmen, wo die Fensterhandles eingetragen werden. Das ist IMHO überhaupt nicht umständlich, da letztes Fenster -> letzter Listeneintrag. Das sollten nur ein paar Zeilen Code sein.

Schwedenbitter 20. Mai 2010 10:05

Re: Fensterreihenfolge
 
Hallo und Danke DeddyH,

"umständlich" ist vielleicht etwas über das Ziel hinausgeschossen.
Mir ist nur nicht bekannt, ob es vielleicht schon eine solche Liste von Windows gibt und ich mit einer API-Function oder dergleichen einfach das Handle des obersten Fensters meines Programmes bekomme und das Fenster schließe. Dann brauche ich noch nicht einmal eine Liste.

Deshalb eben auch meine Frage. Wenn es so etwas nicht gibt, mache ich es über die Liste. Bei der Größe des Projektes kommt es darauf auch nicht mehr an.

Gruß, Alex

DeddyH 20. Mai 2010 10:07

Re: Fensterreihenfolge
 
Moment, willst Du die Fenster nun anhand ihrer Erstellungsreihenfolge schließen oder anhand ihrer Z-Order? Für Letzteres gibt es evtl. eine Möglichkeit, aber da müsste ich erst recherchieren.

Schwedenbitter 20. Mai 2010 10:13

Re: Fensterreihenfolge
 
Entschuldigung - hab mich vermutlich unklar ausgedrückt.

Die Fenster werden beim Programmstart alle erstellt, sind nur nicht sichtbar und bleiben bis zum Programmende unverändert; von Benutzereingaben abgesehen. Mich interessiert daher im Grunde die Reihenfolge, in denen Visible:=True; (Show macht glaube ich genau das) gesetzt wird. Wenn das die Z-Order ist, dann wäre es das, was ich brauche.
Falls unter Erstellungsreihenfolge verstanden wird, wann das Create des Fenster aufgerufen wird, dann kann ich die ja selbst in der dpr oder im sonstigen Code festlegen. Damit hätte ich ja auch kein Problem.

DeddyH 20. Mai 2010 10:16

Re: Fensterreihenfolge
 
Vielleicht habe ich mich auch nicht klar ausgedrückt. Mir geht es darum: sollen die Fenster in der Reihenfolge geschlossen werden, in der sie (zeitlich) angezeigt werden oder in der, in der sie übereinander liegen? Ich kann ja mehrere Fenster öffnen und zwischen diesen hin- und herwechseln, das aktuell im Vordergrund liegende hat dann die höchste Z-Order.

Schwedenbitter 20. Mai 2010 10:24

Re: Fensterreihenfolge
 
Zitat:

Zitat von DeddyH
Sollen die Fenster in der Reihenfolge geschlossen werden, in der sie (zeitlich) angezeigt werden oder in der, in der sie übereinander liegen?

Gute Frage! Über diese 3. Variante hatte ich mir - ehrlich gesagt - noch keine Gedanken gemacht :oops: . Wie wäre es denn bei MDI. Ich vermute mal, dass - wenn es eine Z-Order gibt - sie überlicher Weise in dieser Reihenfolge geschlossen werden. Der Benutzer hat wohl auch eher dieses oberste Fenster im Blick, wenn er auf Schließen klickt und nicht die anderen...

DeddyH 20. Mai 2010 10:33

Re: Fensterreihenfolge
 
Hmm... da dürftest Du vermutlich am Ehesten mit MSDN-Library durchsuchenGetWindow zum Ziel kommen. Welches Fenster und welchen Parameter man da aber nun am Günstigsten angibt müsste ich auch erst ausprobieren.

Schwedenbitter 20. Mai 2010 10:39

Re: Fensterreihenfolge
 
Danke für den Tip!

Ich habe mal die Forensuche mit "Z-Order" bemüht und MSDN-Library durchsuchenGetTopWindow schien mir am passendstens. Ich werde mal beides an einem separaten Programm probieren.

Schwedenbitter 20. Mai 2010 11:28

Re: Fensterreihenfolge
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bekomme es einfach nicht hin :wall:

Ich habe ein Test-Programm geschrieben, das ich als Anhang beigefügt habe. Es hinterlässt ggf. Speicherlecks, reicht zur Anschauung aber aus.
Mein Problem ist auch, dass mein Hauptprogramm auch ein Fenster hat, das aber wie die anderen Fenster gleichrangig behandelt wird. Es soll auch "geschlossen" werden wie die anderen Fenster, ohne dass das Programm beendet wird. Ich muss also bei der Prüfung auch dessen Handle, Z-Order usw. prüfen.

Danke für Eure Hinweise, Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 Uhr.
Seite 1 von 2  1 2      

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