@SirRufo: Das haut leider nicht hin, denn "OnUpdate" wird bereits gefeuert, wenn das Menü gezeichnet wird.
TActionList.OnExecute wäre als Pre-Event geeignet, die infrage kommenden Actions zu disablen, aber das ist mir auch zu umständlich zu implementieren. Aber, ich glaub ich hab die Lösung. Der Grundgedanke ist, in der Action die erforderlichen Actions zu disablen, und nach Ausführung der Action diese wieder zu enablen.
Code-Auszug:
Delphi-Quellcode:
type
TActionArray = array of TAction;
TActions = class(TDataModule)
MyActionList: TActionList;
acImport: TAction;
acExport: TAction;
. . .
public
{ Public-Deklarationen }
procedure Actions_Disable(aActionsToDisable: TActionArray);
procedure Actions_Enable;
end;
implementation
procedure TActions.Actions_Disable(aActionsToDisable: TActionArray);
var
i, Lst: integer;
begin
for i := 0 to Pred(Actions.MyActionList.ActionCount) do begin
for Lst := Low(aActionsToDisable) to High(aActionsToDisable) do begin
if Actions.MyActionList.Actions[i] = aActionsToDisable[Lst] then begin
if Actions.MyActionList.Actions[i].Enabled then begin // Actions die bereits disabled sind ausschließen
Actions.MyActionList.Actions[i].Tag := 1; // Flag setzen, dass die Action disabled wurde
Actions.MyActionList.Actions[i].Enabled := false;
end;
end;
end;
end;
end;
procedure TActions.Actions_Enable;
var
i: integer;
begin
for i := 0 to Pred(Actions.MyActionList.ActionCount) do begin
if Actions.MyActionList.Actions[i].Tag > 0 then begin
Actions.MyActionList.Tag := 0;
Actions.MyActionList.Actions[i].Enabled := true;
end;
end;
end;
procedure TActions.acImportExecute(Sender: TObject);
begin
Actions_Disable([acImport,acExport]);
try
// Export durchführen
finally
Actions_Enable;
end;
end;
Ein bischen Q&D aber so funktioniert's erst mal. Verbesserungsvorschläge sind gerne willkommen.