Eine Abfrage nach Auswählen des Untermenus ist möglich, aber eigentlich zu umständlich.
Es gibt meines Wissenstandes nach keine einfache Schnell-Lösung für diese Aufgabe. Wenn ich z.B. in einer Datenbank-Anwendung gewisse Menüpunkte unzugänglich machen möchte, nachdem (oder bevor) der Anwender eine Tabelle in den Edit-Modus versetzt, dann muß ich dafür eine Procedure erstellen, die ich gewöhnlich ...SchreibenErlaubt bzw. ...SchreibenVerboten nenne. Und weil ich meist mit einer TActionList arbeite, manipuliere ich nicht die Menü-Einträge direkt, sondern die der Aktionsliste:
Delphi-Quellcode:
PROCEDURE TFormMain.Projekt_SchreibenErlaubt;
BEGIN
AL_Projekt_Neu.Enabled := FALSE;
//AktionsListen-Eintrag ProjektNeu deaktivieren
AL_Projekt_Delete.Enabled := FALSE;
//AktionsListen-Eintrag ProjektDelete deaktivieren
AL_Projekt_Edit.Enabled := FALSE;
//AktionsListen-Eintrag ProjektEdit deaktivieren
AL_Projekt_Post.Enabled := TRUE;
//AktionsListen-Eintrag ProjektPost aktivieren
AL_Projekt_Cancel.Enabled := TRUE;
//AktionsListen-Eintrag ProjektCancel aktivieren
DBEd_ProjektTitel.
ReadOnly := FALSE;
//DB-Edit Titel auf Read & Write setzen
END;
PROCEDURE TFormMain.Projekt_SchreibenVerboten;
BEGIN
AL_Projekt_Neu.Enabled := TRUE;
//AktionsListen-Eintrag ProjektNeu aktivieren
AL_Projekt_Delete.Enabled := TRUE;
//AktionsListen-Eintrag ProjektDelete aktivieren
AL_Projekt_Edit.Enabled := TRUE;
//AktionsListen-Eintrag ProjektEdit aktivieren
AL_Projekt_Post.Enabled := FALSE;
//AktionsListen-Eintrag ProjektPost deaktivieren
AL_Projekt_Cancel.Enabled := FALSE;
//AktionsListen-Eintrag ProjektCancel deaktivieren
DBEd_ProjektTitel.
ReadOnly := TRUE;
//DB-Edit Titel auf ReadOnly setzen
END;
Aufgerufen wird das dann, wenn der Anwender z.B. einen Eintrag ändern will bzw. wenn er die Änderung abgeschlossen hat:
Delphi-Quellcode:
procedure TFormMain.AL_Projekt_EditExecute(Sender: TObject);
begin
Projekt_SchreibenErlaubt;
DatMod.Dset_Projekte.Edit;
end;
procedure TFormMain.AL_Projekt_PostExecute(Sender: TObject);
begin
DatMod.Dset_Projekte.Post;
Projekt_SchreibenVerboten;
end;
// oder
procedure TFormMain.AL_Projekt_CancelExecute(Sender: TObject);
begin
DatMod.Dset_Projekte.Cancel;
Projekt_SchreibenVerboten;
end;
Willst du jedoch einen kompletten Menüpunkt deaktivieren, genügt ein
Menüpunkt.Enabled := FALSE;
, was natürlich auch für Untermenüpunkte gilt. Am besten, wie bereits empfohlen, machst du das in speziellen Proceduren, so daß du für verschiedene Fälle genau die richtigen Einträge ein- und ausschaltest.