【问题标题】:Use TAction for an "icon only" TButton将 TAction 用于“仅图标”TButton
【发布时间】:2012-12-11 08:35:39
【问题描述】:

我有一个用于菜单项和 TButton 的 TAction。我希望菜单项显示标签,而 TButton 显示 only 图标。但是,当一个Action被赋值时,Vcl会自动设置TButton的Caption属性,我无法摆脱它。

有什么想法吗?

【问题讨论】:

    标签: delphi c++builder taction


    【解决方案1】:

    在菜单项上,将ImageIndex 设置为-1。在按钮上,将Caption 设置为''。您必须在运行时执行此操作。

    这将破坏与这些单个属性的操作的关联。该操作仍将用于HintOnExecuteOnUpdate 等。

    【讨论】:

      【解决方案2】:

      您可以有两个单独的操作:一个用于菜单项,一个用于按钮。

      【讨论】:

      • 有可能,但忽略了作用原理。
      • @GolezTrol 我不这么认为。例如,它们可以为OnExecuteOnUpdate 事件共享相同的处理程序。
      • 是的,Button 和 MenuItem 也可以共享一个 OnClick 处理程序。动作的原则是定义一段代码,而不关心是哪个控件或哪些控件执行它们。您希望(以及其他)能够仅禁用该操作,而不必担心其他操作会做同样的事情。
      • 是的,并且与任何“行动原则”都没有冲突。如果两个或多个操作共享相同的OnExecuteOnUpdate 处理程序,您仍然不在乎哪个控件执行它们。您可以(除其他外)在共享的OnUpdate 处理程序中的一个地方仅禁用这些操作,而不必担心任何事情。
      • TOndrej 技术的一个细微变化是将两个动作分层。按照 TOndrej 对两项操作的建议进行 - 一项用于按钮,一项用于菜单项,但认为一项操作比另一项“更高”。不是直接共享事件处理程序,而是让较高操作的事件处理程序调用较低的事件处理程序。在直接意义上,结果是一样的。但它为您提供了更多程度的分离,提供了更便宜的可扩展性。
      【解决方案3】:

      一个更老套的解决方案可能是将 TAG 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 也有提示)。但总的来说,我认为这是最好的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      • 2022-08-16
      • 1970-01-01
      • 2016-04-22
      • 2012-11-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多