AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Focus on Close (MDI und PopupMode)

Ein Thema von himitsu · begonnen am 29. Jul 2025 · letzter Beitrag vom 29. Jul 2025
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.538 Beiträge
 
Delphi 12 Athens
 
#1

Focus on Close (MDI und PopupMode)

  Alt Gestern, 15:28
Moin Moin,

wir haben in Delphi 11 ein kleines Problem. (leider hat D12 dafür andere Bugs)

Wir öffnen von einem MDI-Fenster aus ein weiteres nicht-modales freies Fenster,
wenn das geschlossen wird, sollte der Fokus eigentlich wieder beim MDI landen (dem letzten aktiven Fenster, davor),

aber er wandert stattdessen zum externen Fenster.



In Delphi 12 funktioniert es (scheinbar),

aber vermutlich auch nur, weil zusätzlich/zufällig im Delphi 12 der PopupMode/PopupParent komplett im Arsch ist (garnicht funktioniert).
Bzw. ich hoffe es funktioniert, weil Emba bezüglich MDI viel repariert hat. (aber vermutlich geht es nur, weil PopupMode defekt ist ... wäre blöd, wenn wir den PopupMode-Fehler behoben bekommen)



PopupMode = explizit auf MainForm

also eigentlich sollten die externen Fenster immer über der MainForm liegen ... aber nee, mit Delphi 12 verschwinden die hinter der Main.
Außerdem wird die Main nicht mit in den Vordergrund geholt (vor andere Programme), wenn man ein anderes/freies Fenster aktiviert/focusiert.


im Anhang:
* MDICloseTest11.* ist das Delphi 11-Projekt/Kompilat
* MDICloseTest12.* ist das Delphi 12-Projekt/Kompilat

* [MDI] erzeugt ein MDI-Fenster (eingedockt)
* [Form] erzeugt eine normale Form (ausgedockt)
* [Modal] erzeugt eine normale modale Form
* [F2Test], [⋯] und [F2]-Taste im Edit öffnen eine kleine Form, welche ins Edit schreiben möchte, wenn [OK]
* [ESC]-Taste, [X] oder die Buttons schließen die kleine Form wieder



Test:
* [Form]
* [MDI]
* [F2Test], [⋯] oder [F2]-Taste im Edit
* [Cancel] oder [X] ... oder auch [OK]

der Fokus sollte nun eigentlich wieder beim MDI liegen (bei Delphi 11 nicht der Fall)

Bemerkt wird auch, dass beim EnumThreadWindows (also die Reihefolge für Micorosoft)
die Form1 und MainForm andersrum liegen (ja, Windows kennt global die MDI nicht und "aktiv" ist statt der MDI-Form immer die MainForm)

Außerdem lässt sich in Delphi 10 das freie Fenster hinder die MainForm schieben, obwohl es immer drüber liegen sollte (wegen zugewiesen PopupMode).
Bzw. liegt eine andere Anwendung über der MainForm und es wird ein freies Fenster aktiviert, dann bleibt die Main versteckt. (in Delphi 11 und davor kommt sie mit hoch)



Delphi 12.2 (29.0.53571.9782)
Angehängte Dateien
Dateityp: 7z MDICloseTest.7z (1,14 MB, 2x aufgerufen)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (Gestern um 15:37 Uhr)
  Mit Zitat antworten Zitat
Kas Ob.

Registriert seit: 3. Sep 2023
456 Beiträge
 
#2

AW: Focus on Close (MDI und PopupMode)

  Alt Gestern, 17:19
Hi,

I don't use MDI much (only in past projects or not mine), so my knowledge is very little, as for you example, few inline var and the compiler complained about the part marked with "// Covered Window" so i commented that part and it did compile and ran fine on XE8 without problem, yet the observed behavior is correct not like your test11.

Anyway, i do recognize the pattern of this discrepancy from different places like tabs in pages, and i think the problem is Z-Order handling and has little to do with VCL itself, in fact i think the more you try to fix it the more corrupt and unpredictable it will become, so you have to put your own mechanism to manage Z-Order for windows, created then closed, in other words you have to manage the focus on close manually.

Things to watch for as example, browsers behave different when you form one page open lets say three tabs then switch to the middle one then close it, which one will be the main now, Chrome and FireFox behaved differently over many versions and updates.

Anyway, i want you to read https://learn.microsoft.com/en-us/wi...atures#z-order and specially give extra attention to this phrase "for windows of the same type", i for myself not sure i do understand what "same type" means, because it meant different things in different places, in other words i don't think it means what you expect.

Mixing MDI with non-MDI will shuffle Z-Order and make things harder to track, some will return focus to its parent, some will return to its "same type"!!

Hope that help somehow.
Kas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.538 Beiträge
 
Delphi 12 Athens
 
#3

AW: Focus on Close (MDI und PopupMode)

  Alt Gestern, 19:30
So, auch in 12.3 ist der PopupMode-Fehler noch enthalten.

and it did compile and ran fine on XE8 without problem
Das sorgt eh nur dafür, dass Fenster minimiert werden, wenn sie ein sich öffnendes MDI verdecken würden.

Nun ja, alte Programme lassen sich nicht so leicht umbauen.
Ich hatte vor einer Weile mal ausprobiert, ob sich irgendeine Variante für Docking nutzen ließe, aber leider gab es überall Dinge, welche für unsere Anwendung zu inkompatibel waren, also vom Verhalten her.
http://fnse.de/DockingDemos.7z

Ja, ich denke auch, dass auf Windows-Seite die Z-Order ein Problem ist.
Die MainForm ist ja immer unten, die MDI sind immer da drin, also kommen sie immer zuletzt,
außer jetzt, wo in Delphi12 der PopupMode nicht funktioniert.

Es gibt im Delphi und Windows halt nur diese zwei Fenster-Listen, auf welche wir uns beziehen könnten,
aber wenn sie hier keine passende Reihenfolge bieten, dann müsste das entweder repariert werden (Screen.Forms) oder wir brauchen eine eigene Liste (würde ich aber gern vermeiden, also dass hier überhaupt eigener Code dafür nötig wäre).

Eigentlich sollte in Delphi die Liste der Screen.Forms die richtige Aktivierungs-Reihenfolge enthalten, dachte ich,
aber leider ist auch diese Fenster-Liste nicht brauchbar.
(aktuell sieht es so aus, als wenn ich mir eine LastActiveForms-Liste selbst aufbauen)

Wir haben an vielen Stellen im Programm eben Codes, welche den Fokus zwischen Fenstern steuert.
Einen Großteil hatten wir inzwischen ausgebaut und dachten nun Weiteres entfernen zu können.
Da stammte vieles noch aus Delphi 7 und Delphi XE ... insgesamt gibt es auch Teile, die gehen noch auf TurboPascal zurück.
Delphi/Embarcadero hatte auch öfters eigene solcher Stellen in der VCL etwas umgebaut, so dass es schon mehrmals zu Konflikten kam,
weswegen wir eben gern viel, "eigentlich" unnötigen, Code entfernen würden, wenn die VCL das selbst ordentlich hinbekommt.

Auf einen zeitnahen oder überhaupt auf einen Bugfix durch Embarcadero setze ich nicht mehr. Zu oft haben die enttäuscht, selbst wenn man ihnen die Lösung gibt,
so dass wir schon mehrmals viele Wochen an Arbeit investieren mußte, obwohl Emba das Problem mit 2 Zeilen Code (zwei Variablen auf 0 setzen) hätten lösen können (bei der Form-Vererbung).
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (Gestern um 19:33 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:48 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