使用TAction为“仅图标”的TButton。

5

我有一个TAction,既用于菜单项又用于TButton。我希望菜单项显示标签,而TButton仅显示图标。然而,当指定一个Action时,Vcl会自动设置TButton的Caption属性,我无法去掉它。

有什么建议吗?

3个回答

6
在菜单项上,将ImageIndex设置为-1。在按钮上,将Caption设置为''。您必须在运行时执行此操作。
这将仅破坏与这些个别属性的动作关联。该动作仍将用于HintOnExecuteOnUpdate等。

4
您可以拥有两个不同的操作:一个用于菜单项,另一个用于按钮。

3
这是一种可能性,但它忽略了行动原则。 - GolezTrol
1
@GolezTrol 我不这么认为。例如,它们可以共享相同的 OnExecuteOnUpdate 事件处理程序。 - Ondrej Kelle
2
是的,一个按钮和一个菜单项也可以共享一个OnClick处理程序。行动原则是定义一段代码,而不必关心哪个控件或控件执行它们。您希望(在其他事项中)能够禁用仅该操作,而不必担心其他操作执行相同的操作。 - GolezTrol
1
是的,并且没有与任何“操作原则”冲突。如果两个或更多操作共享相同的OnExecuteOnUpdate处理程序,您仍然不需要关心哪个控件执行它们。您可以(在其他情况下)在共享的OnUpdate处理程序中仅禁用这些操作,并且无需担心任何事情。 - Ondrej Kelle
2
TOndrej的技巧有一个小变化,就是将两个操作分层。按照TOndrej的建议,为按钮和菜单项分别创建两个操作,但要考虑其中一个操作比另一个操作“更高级”。不要直接共享事件处理程序,而是让更高级别的操作的事件处理程序调用较低级别的操作。从直接的角度来看,结果是相同的。但它给你多了一层分离,提供了更便宜的可扩展性。 - Sean B. Durkin
显示剩余4条评论

3
一种更加“hacky”的解决方案是将标签22设置为例如下面的示例中的``。
type

  TButton=Class(Vcl.StdCtrls.TButton)
         procedure SetText(var Message:TWMSETTEXT); message WM_SETTEXT;
  End;

  TForm4 = class(TForm)

    ActionList1: TActionList;
    ImageList1: TImageList;
    Action1: TAction;
    BitBtn1: TBitBtn;
    Button1: TButton;
    Button2: TButton;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

{ TMyButton }

procedure TButton.SetText(var Message:TWMSETTEXT);
begin

  if Tag<>22 then   inherited else Message.Result := 1;
end;

我不确定我会使用这种hacky方法,但我喜欢让按钮处理文本属性的原则。更清晰的替代方法是使用某种TIconButton,仅显示图像并将Text属性用作提示(或根本不使用,因为Action也有提示)。但总的来说,我认为这是最好的解决方案。 - GolezTrol

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