如何让标准操作(如TEditCopy)识别其他控件(如TEmbeddedWB)?

4

我对TEditCutTEditCopyTEditPasteTEditSelectAll的功能基本满意,但它们不能在非标准控件上工作。

例如,它们可能在TEditTMemo控件上正常工作,但在TEmbeddedWB上不行 - 即使选择了文本,标准操作始终被禁用,尽管TEmbeddedWB有像CopyToClipboardSelectAll这样的方法。

如何让标准操作与TEmbeddedWB一起工作?标准操作如何确定它们应该启用还是禁用(以及它们在哪个事件中执行 - 是在OnUpdate事件中吗)?我可以扩展标准操作以支持未识别的组件,还是需要编写它们的替代品?

1个回答

6
默认的编辑操作无法在一个TEmbeddedWB控件上使用,因为该组件并不是从TCustomEdit下降。 TEditAction只知道如何处理TCustomEdits,而TEditSelectAll就是从它下降的。
使用动作的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;

谢谢,这正是我需要处理这个问题的东西。 - Coder12345

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接