Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi MDI-Children nicht über Strg-F4 schliessen lassen (https://www.delphipraxis.net/88424-mdi-children-nicht-ueber-strg-f4-schliessen-lassen.html)

DelphiKlaus 15. Mär 2007 07:52


MDI-Children nicht über Strg-F4 schliessen lassen
 
Hallo,

ich habe ein unangenehmes Problem mit einer MDI-Anwendung: aus einigen der MDI-Children meiner Anwendung können modale Dialoge aufgeschaltet werden. Während eines modalen Dialogs ist bekanntlich eine weitere Bedienung der Anwendung nicht möglich. Zuerst muss dieser Dialog beendet werden, bevor ich wieder Menü- oder sonstige Bedienungen machen kann.

Dachte ich bisher. Aber jetzt habe ich festgestellt, das das garnicht so generell stimmt. Es ist, auch wenn ein modaler Dialog aufgeschaltet ist, möglich, mit Strg+F4 ein MDI-Child zu schliessen oder mit Strg+F6 zu einem anderen MDI-Child zu wechseln. Insbesondere stört mich das Schliessen. Wenn dasjenige MDI-Child geschlossen wird, aus dem der modale Dialog aufgeschaltet wurde, fehlt dem plötzlich sein Parent und es kommt natürlich zu entsprechenden Fehlermeldungen. Ich habe jetzt versucht, die Einträge "Schliessen Strg+F4" und "Nächstes Strg+F6" mit nachfolgendem Code, den ich in die FormCreate-Methode des modalen Dialogs eingebaut habe, testweise für das erste MDI-Child zu disablen:

Delphi-Quellcode:
  { Handle des Systemmenüs beschaffen }
  Menu := GetSystemMenu (FormMain.MDIChildren [1].Handle,
                         False);

  { Schliessen des Fensters (Strg+F4) verhindern }
  MenuItemClosePreviousState := EnableMenuItemWord (Menu,
                                                    sc_Close,
                                                    mf_ByCommand or mf_Grayed or mf_Disabled);

  { Weiterschalten (Strg+F6) verhindern }
  MenuItemNextWindowPreviousState := EnableMenuItemWord (Menu,
                                                         sc_NextWindow,
                                                         mf_ByCommand or mf_Grayed or mf_Disabled);
EnableMenuItemWord entspricht EnableMenuItem, hat aber als Funktionstyp Word und nicht BOOL wie in Delphi6. Damit bekomme ich den vorherigen Status offenbar auch richtig zurückgeliefert, so wie er in der Hilfe beschrieben ist.

In der FormClose-Methode werden die Einträge wieder enabled.

Das scheint auch zu funktionieren, denn wenn ich jetzt aus dem aufgeschalteten MDI-Child einen modalen Dialog aufschalte, wird das X rechts in der Caption-Leiste disabled und wenn ich den Dialog ganz normal schliesse, wird es wieder bedienbar. Aber trotzdem kommt Strg-F4 immer noch durch. Dabei verschwinden der modale Dialog und das MDI-Child und die Anwendung ist nicht bedienbar, als ob der Dialog noch da wäre.

Hat jemand vielleicht eine Lösung des Problems? Ich möchte Strg+F4 und Strg+F6 abschalten, wenn ein modaler Dialog aufgeschaltet ist.

Vielen Dank schonmal

Klaus

dfried 15. Mär 2007 07:57

Re: MDI-Children nicht über Strg-F4 schliessen lassen
 
Das Problem kann ich absolut nicht nachvollziehen, wenn ich aus einem MDI-Child ein Fenster Modal öffne (mit Form.ShowModal), dann kann ich so oft ich will STRG+F4 drücken ohne dass was passiert...

Kannst du mal deinen Aufruf des Modalen Fensters hier posten, vielleicht liegt es ja da dran.

DelphiKlaus 15. Mär 2007 08:36

Re: MDI-Children nicht über Strg-F4 schliessen lassen
 
Das Formular wird nach folgendem Muster erzeugt:

Delphi-Quellcode:
  FormModal := TFormModal.Create (Self);

  if FormModal.ShowFormular (....) = mrOk then
    begin

    end;

  FormModal.Release;
ShowFormular ist eine Public-Methode, in der die übergebenen Parameter, die ich oben weggelassen habe, weil sie nur für den Inhalt des Dialogs relevant sind, ausgewertet werden und anschliessend ShowModal aufgerufen wird.


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