procedure TEditAction.UpdateTarget(Target: TObject);
begin
if (Self is TEditCut) then
Enabled := (GetControl(Target).SelLength > ) and not GetControl(Target).ReadOnly
else if (Self is TEditCopy) then
Enabled := (GetControl(Target).SelLength > );
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) > ;
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;