![]() |
SystemMenu Problem
Hallo DPler,
ich möchte während einer Ladeprozedur das Schließen meines Formulares unterbinden. Im OnClose-Event des Formulars wird die CanClose Variable auf den korrekten Zustand gesetzt. Somit lässt sich die Form auch nicht schließen. Schön und gut, wenn da nicht folgendes Problem wäre: Das "X" Item im SystemMenu soll während des Ladens ausgegraut sein und sich danach wieder aktivieren. Das Ausgrauen funktioniert, nur das reaktivieren nicht. Warum?
Delphi-Quellcode:
procedure TFormMain.SuperFormCloseQuery(Sender: TObject;
var CanClose: Boolean); begin CanClose := FApplicationCanClose; end;
Delphi-Quellcode:
procedure TFormMain.ActionItemFileOpenExecute(Sender: TObject);
begin SetCanCloseApplication(FALSE); {HIER IST DER CODE DES LADEVORGANGS} {...} {...} SetCanCloseApplication(TRUE); end;
Delphi-Quellcode:
procedure TFormMain.SetCanCloseApplication(const AValue: Boolean);
var AppMenu: THandle; begin FApplicationCanClose := AValue; AppMenu := GetSystemMenu(Self.Handle, FALSE); if AppMenu <> 0 then begin if FApplicationCanClose then EnableMenuItem(AppMenu, SC_CLOSE, MF_BYCOMMAND) else DeleteMenu(AppMenu, SC_CLOSE, MF_BYCOMMAND); end; end; MfG, dnub |
AW: SystemMenu Problem
Wieso DeleteMenu? Versuch es einmal so (ungetestet):
Delphi-Quellcode:
procedure TFormMain.SetCanCloseApplication(const AValue: Boolean);
const CloseFlags: array[Boolean] of UINT = (MF_BYCOMMAND or MF_DISABLED, MF_BYCOMMAND or MF_ENABLED); var AppMenu: THandle; begin FApplicationCanClose := AValue; AppMenu := GetSystemMenu(Self.Handle, FALSE); if AppMenu <> 0 then EnableMenuItem(AppMenu, SC_CLOSE, CloseFlags[FApplicationCanClose]); end; |
AW: SystemMenu Problem
ich habe ca. 800 Ergebnisse bei folgender Google-Suche gefunden....
delphi systemmenü aktivieren |
AW: SystemMenu Problem
DeddyH, deine Lösung funktioniert. Dennoch verstehe deine Zeile nicht.
Delphi-Quellcode:
EnableMenuItem kümmert sich wohl um alle möglichen Zustände allein, oder wie muss ich das verstehen? ^^
EnableMenuItem(AppMenu, SC_CLOSE, CloseFlags[FApplicationCanClose]);
Könntest du mir diese Zeile mal erläutern? MfG, dnub // edit: Ok, die MSDN beschreibt ja, dass EnableMenuItem sich um die drei Zustände (aktiv., deak. und ausgrauen) selbst kümmern kann. Ich verstehe nur die Angabe der nEnable-Parameter nicht :X |
AW: SystemMenu Problem
Ich habe ja weiter oben ein konstantes Boolsches Array deklariert, das die jeweils korrekte Maske für FApplicationCanClose auf true/false beinhalten soll. In beiden Masken wird MF_BYCOMMAND mit einem Schalter für En- bzw. Disablen kombiniert. So, wenn nun die Zeile ausgeführt wird, wird EnableMenuItem mit der zu FApplicationCanClose passenden Maske (aus dem konstanten Array ermittelt) aufgerufen. Man kann das auch getrost mit einer If-Else-Verzweigung lösen, aber ich finde das so eleganter ;)
|
AW: SystemMenu Problem
Du hasst mich jetzt bestimmt^^, aber kannst du mir das einmal in einem Beispiel einer If-Verzweigung aufzeigen?
MfG, dnub |
AW: SystemMenu Problem
Kein Problem:
Delphi-Quellcode:
procedure TFormMain.SetCanCloseApplication(const AValue: Boolean);
var AppMenu: THandle; CloseFlags: UINT; begin FApplicationCanClose := AValue; CloseFlags := MF_BYCOMMAND; if FApplicationCanClose then CloseFlags := CloseFlags or MF_ENABLED else CloseFlags := CloseFlags or MF_DISABLED; AppMenu := GetSystemMenu(Self.Handle, FALSE); if AppMenu <> 0 then EnableMenuItem(AppMenu, SC_CLOSE, CloseFlags); end; |
AW: SystemMenu Problem
Also ich habs selbst probiert und so funktioniert es:
Delphi-Quellcode:
procedure TFormMain.SetCanCloseApplication(const AValue: Boolean);
//const // CloseFlags: array[Boolean] of UINT = (MF_BYCOMMAND or MF_DISABLED, // MF_BYCOMMAND or MF_ENABLED); var AppMenu: THandle; begin FApplicationCanClose := AValue; AppMenu := GetSystemMenu(Self.Handle, FALSE); if AppMenu <> 0 then if FApplicationCanClose then EnableMenuItem(AppMenu, SC_CLOSE, MF_BYCOMMAND or MF_ENABLED) //CloseFlags[FApplicationCanClose]); else EnableMenuItem(AppMenu, SC_CLOSE, MF_BYCOMMAND or MF_DISABLED); end; Aber deine If-Lösung sieht schöner aus. ich danke dir wiedermal für deine Hilfe! MfG, dnub |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 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