AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SystemMenu Problem

Ein Thema von delphinub23 · begonnen am 5. Aug 2011 · letzter Beitrag vom 5. Aug 2011
Antwort Antwort
delphinub23

Registriert seit: 27. Okt 2010
Ort: Chemnitz
110 Beiträge
 
Delphi XE3 Professional
 
#1

SystemMenu Problem

  Alt 5. Aug 2011, 12:53
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.620 Beiträge
 
Delphi 12 Athens
 
#2

AW: SystemMenu Problem

  Alt 5. Aug 2011, 13:21
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von skh
skh

Registriert seit: 17. Aug 2005
Ort: Saarland
28 Beiträge
 
Delphi 7 Professional
 
#3

AW: SystemMenu Problem

  Alt 5. Aug 2011, 13:24
ich habe ca. 800 Ergebnisse bei folgender Google-Suche gefunden....

delphi systemmenü aktivieren
Karl-Heinz
  Mit Zitat antworten Zitat
delphinub23

Registriert seit: 27. Okt 2010
Ort: Chemnitz
110 Beiträge
 
Delphi XE3 Professional
 
#4

AW: SystemMenu Problem

  Alt 5. Aug 2011, 15:25
DeddyH, deine Lösung funktioniert. Dennoch verstehe deine Zeile nicht.


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

Geändert von delphinub23 ( 5. Aug 2011 um 15:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.620 Beiträge
 
Delphi 12 Athens
 
#5

AW: SystemMenu Problem

  Alt 5. Aug 2011, 15:29
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
delphinub23

Registriert seit: 27. Okt 2010
Ort: Chemnitz
110 Beiträge
 
Delphi XE3 Professional
 
#6

AW: SystemMenu Problem

  Alt 5. Aug 2011, 15:33
Du hasst mich jetzt bestimmt^^, aber kannst du mir das einmal in einem Beispiel einer If-Verzweigung aufzeigen?

MfG,
dnub
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.620 Beiträge
 
Delphi 12 Athens
 
#7

AW: SystemMenu Problem

  Alt 5. Aug 2011, 15:36
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
delphinub23

Registriert seit: 27. Okt 2010
Ort: Chemnitz
110 Beiträge
 
Delphi XE3 Professional
 
#8

AW: SystemMenu Problem

  Alt 5. Aug 2011, 15:40
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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