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/)
-   -   MDI-Minimized-Problem (https://www.delphipraxis.net/210229-mdi-minimized-problem.html)

Incocnito 21. Mär 2022 15:30

MDI-Minimized-Problem
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin zusammen,

ich habe hier in der Firma das Problem, das das Hauptmenü auf mal nach rechts springt.
Nach gefühlten 9 Jahrhunderten Forschung habe ich es nun relativ weit eingrenzen können.

Es passiert, wenn
A) für das Hauptmenü die Eigenschaft "OwnerDraw" gesetzt ist
B) das Hauptfenster ein MDI-Fenster ist
C) ein MDI-Child-Fenster im Status Maximized (ohne BorderIcon "biMinimized") erzeugt wird
und dann
D) (im MDI-Fenster per Buttonclick) die Caption eines Menüeintrags im Hauptfenster geändert wird.

Genutzt wird Delphi 10.4 Update 2 (mit diversen Tools).

Kann mal jemand Testen, ob das jemand ebenfalls nachstelen kann?

Ich habe die zusammengestauchte Version des Programms mal mit angehangen. Damit konnte ich das nachstellen.
(Dazu im Hauptfenster auf "Hier starten" klicken und anschließend auf den Test-Button.)

Falls jetzt jemanden auffällt "das kann so ja auch gar nicht gehen, das Programm macht genau was es soll",
wäre ich für jeden Hinweis dankbar. Ein MDI-Fenster maximiert starten finde ich generell wohl für sinnvoll und das Aktualisieren der Captions der Menüeinträge ist auch wohl notwendig ("do not change some alten Quelltext" sag ich mal).

Note: Im Original wird OnMesureItem übrigens gesetzt und verwendet, war aber für den Test irrelevant.

Vielen Dank schonmal für die Zeit!

Mit freundlichem Gruß
Incocnito

jaenicke 21. Mär 2022 16:23

AW: MDI-Minimized-Problem
 
Das Problem ist, dass dabei das Neuerstellen der Menüs aufgerufen wird. Und das geht dann maximiert offenbar schief.

Man kann das spezielle Problem patchen indem man die Methode TMenuItem.MenuChanged aus Vcl.Menus auf eine eigene Methode umleitet und dort die Originalmethode mit False als Parameter aufruft. Die Frage ist, was das für Folgen hat, wenn man das Neuerstellen der Menüs deaktiviert.

Das Problem ist, dass MDI als Technik seit fast 30 Jahren nicht mehr empfohlen und seit 20 Jahren als veraltet markiert ist und es von Microsoft keine Bugfixes oder Unterstützung dafür mehr gibt. Unter Windows 10 haben die Probleme noch einmal deutlich zugenommen.

Abseits der Umleitung virtueller Methoden gibt es nur die Billigvariante, die dir sicher auch schon eingefallen ist:
Delphi-Quellcode:
    WindowState := wsNormal;
    FItem.Caption := 'Neuer Text';
    WindowState := wsMaximized;
Allgemein macht es natürlich Sinn ein Ticket bei Embarcadero aufzumachen. Ich würde allerdings aufgrund des Warnhinweises in der Doku vermuten, dass du damit wenig erreichen wirst:
Zitat:

The Per Monitor V2 (and many of the other High-DPI features in Windows) have no support for the MDI child windows model. Microsoft has stopped addressing bugs reported for MDI, and we recommend migrating to a different multi-windows model (multiple floating windows, docked panes, tabbed windows, etc.)
Quelle

Persönlich kann ich nur dazu raten MDI so schnell wie möglich zu entfernen bevor es noch massivere Probleme damit gibt oder Microsoft es am Ende wirklich ganz entfernt...

Incocnito 22. Mär 2022 07:52

AW: MDI-Minimized-Problem
 
Moin!

Äh, oha ... ich habe das mal weiter gegeben, dass MDI nicht mehr genutzt werden sollte.
Das könnte wohl etwas Zeit für eine Umstellung des kompletten Programms bedeuten.

Tatsächlich kam das im Programm dadurch zu stande, dass Fenster A maximiert war und Fenster B beim Schließen den Text des Hauptmenüs geändert hat. Da wird das mit
Delphi-Quellcode:
    WindowState := wsNormal;
    FItem.Caption := 'Neuer Text';
    WindowState := wsMaximized;
eeeetwas umständlich 😂

Ja, auf jeden Fall vielen lieben Dank für den Hinweis. Ich meine, ist ja schon eine etwas schwierig zu produzierende Problematik "kommt beim Kunden ab und zu vor" und dann danach suchen "was haben die denn jetzt gemacht?" und "was davon war jetzt schuld daran?" 😂 Kennen ja alle hier.

Mit freundlichem Gruß
Incocnito


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:04 Uhr.

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