【问题标题】:Making sure at least 1 item in a TPopup menu is always selected确保始终选择 TPopup 菜单中的至少一项
【发布时间】:2012-07-27 04:24:57
【问题描述】:

我有 TPopup 菜单,其中包含 3 项设置,具有以下属性。

AutoCheck = True
RadioItem = True

对于第一个菜单项,我也将Checked 属性设置为True,因此菜单至少选择了一项,并且最初显示。这一切都很好,但是如果我单击当前选择的项目,检查(点)就会消失,我想这样做,以便始终选择弹出窗口中的至少 1 个项目。我该怎么做呢?

【问题讨论】:

    标签: delphi popup radio-group


    【解决方案1】:

    组中的项目也应该具有相同的非零GroupIndex。这与RadioItem 一起应该使项目表现得像一个广播组。

    但是,AutoCheck 似乎不尊重 GroupIndexRadioItem 属性,因为当您单击当前选中的项目时,它会清除检查。 (可以说,这可能被认为是 VCL 中的一个错误。)

    这里有一个解决方法:

    AutoCheck 设置为False,为所有项目分配相同的非零GroupIndex 和一个通用的OnClick 处理程序来检查单击的项目,如下所示:

    procedure TForm1.ItemClick(Sender: TObject);
    begin
      (Sender as TMenuItem).Checked := True;
    end;
    

    或者使用Actions,这似乎可以按预期工作。

    【讨论】:

    • 谢谢,经过一番折腾,我能够使用您发布的两种方法使其工作。我同意这似乎确实是 VCL 中的一个错误,并且是一个长期存在的错误,因为我使用的是 Delphi7,而您可能使用了比这更新的东西,并且“错误”仍然存在于您的版本中。再次感谢您的帮助,非常感谢。
    • 谢谢。我正在使用当前版本的 XE2,它的行为仍然如上文所述。
    【解决方案2】:

    您可以为所有单选组菜单项设置以下 OnClick 处理程序:

    procedure TForm1.MenuItemClickHandler(Sender: TObject);
        begin
            if Sender is TMenuItem then
            begin
                if not (Sender as TMenuItem).Checked then (Sender as TMenuItem).Checked:=True;
            end;
        end;
    

    【讨论】:

    • 谢谢,我刚刚使用了@TOndrej 建议的 actionlist 方法,现在效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2010-11-13
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多