C++ Builder Snippets  


Menüpunkt "Schließen" des Fenster-Systemmenüs und die [X]-Schaltfläche in der Titelleiste deaktivieren:
 
Wenn sich die Anwendung (z.B. in bestimmten Ausführungsphasen) nicht durch den Anwender beenden lassen darf, kann es mit Hilfe des Ereignisses OnCloseQuery der Formulare recht einfach umgesetzt werden, indem das CanClose-Flag auf false gesetzt wird:
void __fastcall MyForm::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  // bgDontClose ist in dem Fall eine globale Variable, die
  // für den Zeitraum in dem das Programm nicht beendet werden
  // darf, auf true gesetzt wird:
  CanClose = !bgDontClose;
}
Allerdings weist diese Lösung einen Schönheitsehler auf: der Anwender sieht weiterhin die [X]-Schaltfläche in der Titelleiste des Fensters bzw. Menüpunkt "Schließen" im Systemmenü. Über die Standardeigenschaften der TForm lassen sich diese Steuerelemente nicht deaktivieren ohne das gesamte Systemmenü auszublenden.

Die Abhilfe schafft folgende Zeile Code mit zwei API-Aufrufen. Funktion GetSystemMenu() liefert das Handle des Systemmenüs des Fensters, das der Funktion EnableMenuItem() übergeben wird.

Folgende Zeile deaktiviert den Eintrag "Schliessen" im Systemmenü und die [X]- Schaltfläche in der Titelleiste:
EnableMenuItem(GetSystemMenu(MyForm->Handle,false),
  SC_CLOSE,MF_BYCOMMAND|MF_GRAYED);
Um die beiden Steuerelemente erneut zu aktivieren, muss dieser Routine der Wert MF_BYCOMMAND|MF_ENABLED als 3. Parameter übergeben werden:
EnableMenuItem(GetSystemMenu(MyForm->Handle,false),
  SC_CLOSE,MF_BYCOMMAND|MF_ENABLED);



© '99-2000 by S. Kreutzmann