4

我通常对 TEditCut,和的功能感到满意TEditCopy,除了它们不适用于任何非标准控件。TEditPasteTEditSelectAll

例如,它们可以在TEditorTMemo控件上正常工作,但不能在TEmbeddedWB- 使用它时,无论是否选择文本,标准操作总是被禁用,即使TEmbeddedWB有 和 之类的CopyToClipboard方法SelectAll

我怎样才能使标准动作起作用TEmbeddedWB?标准操作如何确定应该启用还是禁用它们(以及它们在什么情况下这样做——是否在OnUpdate事件中)?我可以扩展标准操作以添加对无法识别的组件的支持,还是需要编写它们的替换?

4

1 回答 1

6

默认的 Edit 操作不适用于TEmbeddedWB控件,因为该组件不是从TCustomEdit. TEditAction,它的TEditSelectAll后代,只知道如何处理TCustomEdits

使用操作的OnUpdateOnExecute事件来覆盖此行为。请注意,默认行为将被忽略,因此请手动实现。这是一个TEditSelectAll动作的例子。

procedure TForm1.EditSelectAll1Update(Sender: TObject);
begin
  EditSelectAll1.Enabled := (Screen.ActiveControl is TEmbeddedWB) or
    EditSelectAll1.HandlesTarget(ActiveControl)
end;

procedure TForm1.EditSelectAll1Execute(Sender: TObject);
begin
  if ActiveControl is TEmbeddedWB then
    TEmbeddedWB(Screen.ActiveControl).SelectAll
  else
    EditSelectAll1.ExecuteTarget(Screen.ActiveControl);
end;

或者使用 ActionList(或 ApplicationEvents 组件)的相同事件OnActionUpdateOnActionExecute集中此自定义行为:

procedure TForm1.ActionList1Update(Action: TBasicAction; var Handled: Boolean);
begin
  if Action is TEditAction then
  begin
    TCustomAction(Action).Enabled := (Screen.ActiveControl is TEmbeddedWB) or
      Action.HandlesTarget(Screen.ActiveControl);
    Handled := True;
  end;
end;

procedure TForm1.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
begin
  if (Action is TEditSelectAll) and (Screen.ActiveControl is TEmbeddedWB) then
  begin
    TEmbeddedWB(Screen.ActiveControl).SelectAll;
    Handled := True;
  end;
end;
于 2013-10-06T17:16:19.523 回答