Delphi-PRAXiS

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 Focus on Close (MDI und PopupMode) (https://www.delphipraxis.net/217596-focus-close-mdi-und-popupmode.html)

himitsu 29. Jul 2025 15:28


Focus on Close (MDI und PopupMode)
 
Liste der Anhänge anzeigen (Anzahl: 1)
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)

Kas Ob. 29. Jul 2025 17:19

AW: Focus on Close (MDI und PopupMode)
 
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.

himitsu 29. Jul 2025 19:30

AW: Focus on Close (MDI und PopupMode)
 
Vielleicht hat ja jemand was Ähnliches und bereits eine "schöne" Lösung dafür.


So, auch in 12.3 ist der PopupMode-Fehler noch enthalten.

Zitat:

Zitat von Kas Ob. (Beitrag 1550617)
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. :freak:

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).

himitsu 30. Jul 2025 10:18

AW: Focus on Close (MDI und PopupMode)
 
Boar eh, was'n dat für'n Scheißdreck?

Im oberen Test, da will PopupMode NIE funktionieren
und jetzt ist es immer aktiv und ich bekomm es nichtmehr aus.

Ich hab jetzt eine einfache Testanwendung mit zwei Forms
* Forms automatisch erstellt (Standard)
* oder erst beim ButtonBlick erstellt
* mit (Self) und ohne Owner (nil), weil https://quality.embarcadero.com/brow...2pmexplicit%22

* PopupMode/PopupParent im ButtonClick gesetzt, oder nicht und dann nur noch ein Form29.Show (und eventuell noch ein TForm29.Create)
* FormStyle der MainForm auf fsMDIForm gesetzt, oder nicht

pmAutp = hängt immer an der ersten Form (MainForm)
pmExplizit = hängt ebenfalls an der Form (was es im anderen Test aber nie machte)
pmNone = hängt immernoch an der Form, aber sollte es eigentlich nicht.


VCL-Anwendunng erstellen, weitere VCL-Form erstellen (eventuell as AutoCreate deaktivieren) und dann
Delphi-Quellcode:
procedure TForm28.Button1Click(Sender: TObject);
begin
  //Form29 := TForm29.Create(Self);
  Form29.PopupMode := pmNone;
  //Form29.PopupParent := Self;
  Form29.Show;
end;

Und nun noch mit 3 Forms.
* pmAuto hängt an der MainForm
* pmExplicit kann auch an der zweiten Form hängen (also Dritte immer über der Zweiten und die über der Ersten/Main)
* pmNone wird weiterhin ignoriert und es hängt über der Main

neue VCL-Anwendung mit 2 weiteren VCL-Forms und AutoCreate:
Delphi-Quellcode:
procedure TForm28.FormShow(Sender: TObject);
begin
  Form29.Show;
end;

procedure TForm28.Button1Click(Sender: TObject);
begin
  //Form30 := TForm30.Create(Self);
  Form30.PopupMode := pmNone;
  //Form30.PopupParent := Form29;
  Form30.Show;
end;

himitsu 31. Jul 2025 12:50

AW: Focus on Close (MDI und PopupMode)
 
Liste der Anhänge anzeigen (Anzahl: 2)
So, Fazit ist leider, dass die Fokuskontrolle auch in Delphi 12 für MDI weiterhin defekt ist.

Wir nutzen fast immer WS_EX_APPWINDOW (eigene TaskButtons für Forms)
und da es in Delphi 12 nun ein Property dafür gibt, hatte ich es genutzt,
was nun dazu führte, dass sich D12 anders verhielt, als D11 und davor. (siehe Link "ShowInTaskBar")

Hab das Ganze nun in einer einfacheren Demo, bei der es egal sein sollte, welches Delphi.
(siehe Anhang unten ... also bei der ersten Demo das ShowInTaskBar:=True auskommentieren, für selbes Verhalten)


FocusControl https://embt.atlassian.net/servicede...tal/1/RSS-3888

CloseQuery https://embt.atlassian.net/servicede...tal/1/RSS-3881
ModalResult https://embt.atlassian.net/servicede...tal/1/RSS-3882
ShowInTaskBar https://embt.atlassian.net/servicede...tal/1/RSS-3884
PopupMode https://embt.atlassian.net/servicede...tal/1/RSS-3885

PopupMode :freak: https://embt.atlassian.net/servicede...tal/1/RSS-1871
ShowInTaskBar und ShowModal https://embt.atlassian.net/servicede...tal/1/RSS-3559
ShowInTaskBar und IDE-SplashScreen https://embt.atlassian.net/servicede...rtal/1/RSS-947


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