Einzelnen Beitrag anzeigen

mm1256

Registriert seit: 10. Feb 2014
Ort: Wackersdorf, Bayern
640 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: Actions verwenden - Pre- und Post-Action

  Alt 6. Jul 2015, 13:42
@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.
Gruss Otto
Wenn du mit Gott reden willst, dann bete.
Wenn du ihn treffen willst, schreib bei Tempo 220 eine SMS
  Mit Zitat antworten Zitat