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/)
-   -   SystemMenu Problem (https://www.delphipraxis.net/162085-systemmenu-problem.html)

delphinub23 5. Aug 2011 11:53

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

DeddyH 5. Aug 2011 12:21

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;

skh 5. Aug 2011 12:24

AW: SystemMenu Problem
 
ich habe ca. 800 Ergebnisse bei folgender Google-Suche gefunden....

delphi systemmenü aktivieren

delphinub23 5. Aug 2011 14:25

AW: SystemMenu Problem
 
DeddyH, deine Lösung funktioniert. Dennoch verstehe deine Zeile nicht.


Delphi-Quellcode:
EnableMenuItem(AppMenu, SC_CLOSE, CloseFlags[FApplicationCanClose]);
EnableMenuItem kümmert sich wohl um alle möglichen Zustände allein, oder wie muss ich das verstehen? ^^


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

DeddyH 5. Aug 2011 14:29

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

delphinub23 5. Aug 2011 14:33

AW: SystemMenu Problem
 
Du hasst mich jetzt bestimmt^^, aber kannst du mir das einmal in einem Beispiel einer If-Verzweigung aufzeigen?

MfG,
dnub

DeddyH 5. Aug 2011 14:36

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;

delphinub23 5. Aug 2011 14:40

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 16:25 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