procedure TEditAction.UpdateTarget(Target: TObject); begin if (Self is TEditCut) then Enabled := (GetControl(Target).SelLength > 0) and not GetControl(Target).ReadOnly else if (Self is TEditCopy) then Enabled := (GetControl(Target).SelLength > 0); end;
TEditCopy = class(TEditAction) public procedure ExecuteTarget(Target: TObject); override; end;
TEditAction = class(TAction) private FControl: TCustomEdit; procedure SetControl(Value: TCustomEdit); protected function GetControl(Target: TObject): TCustomEdit; virtual; procedure Notification(AComponent: TComponent; Operation: TOperation); override; public destructor Destroy; override; function HandlesTarget(Target: TObject): Boolean; override; procedure UpdateTarget(Target: TObject); override; property Control: TCustomEdit read FControl write SetControl; end;
TEditPaste = class(TEditAction) public procedure UpdateTarget(Target: TObject); override; procedure ExecuteTarget(Target: TObject); override; end; TEditSelectAll = class(TEditAction) public procedure ExecuteTarget(Target: TObject); override; procedure UpdateTarget(Target: TObject); override; end;
执行命令
procedure TEditSelectAll.ExecuteTarget(Target: TObject); begin GetControl(Target).SelectAll; end;
更新控件状态 procedure TEditSelectAll.UpdateTarget(Target: TObject); begin Enabled := Length(GetControl(Target).Text) > 0; end;
UpdateTarget不断的在调用
function TEditAction.GetControl(Target: TObject): TCustomEdit; begin { We could hard cast Target as a TCustomEdit since HandlesTarget "should" be called before ExecuteTarget and UpdateTarget, however, we're being safe. } Result := Target as TCustomEdit; end;