【问题标题】:Delphi: TabStop problems of TRadioButtonDelphi:TRAdioButton 的 TabStop 问题
【发布时间】:2011-05-18 13:42:21
【问题描述】:

当 TRAdioButton 的 TabStop=True 时,它​​的行为很奇怪。

如果您尝试使用 Tab 键在表单上的多个单选按钮之间切换焦点,则每个应用会话只能执行 1 次。制表是单向的,永远不会返回到第一个单选按钮。此外,当焦点在单选按钮上移动时,它们会自动“选中”。

可以在不创建我自己的组件的情况下修复此行为吗?

我想要标准单选按钮

  1. 循环切换焦点
  2. 防止单选按钮检查焦点何时进入(我希望我的用户使用空格键检查它们)

【问题讨论】:

    标签: delphi focus radio-button selection


    【解决方案1】:

    我了解到您正在使用现有代码,这是现实世界的限制,在这些论坛中经常被忽视。

    在我看来,复选框更适合您。您可以在 OnChecked 事件中强制执行通常预期的 RadioButtons 的排他性。这应该可以解决您的选项卡/焦点和选择/取消选择问题。

    复选框不会在获得焦点后自动选中,您的用户可以使用空格键选中/取消选中它们。

    【讨论】:

    • 我选择这个答案是因为使用复选框是我看到的最简单的问题解决方案。但是,我确实需要单选按钮,并且我将创建一个修改了制表行为的组件。
    【解决方案2】:

    您可以在OnEnter 事件中添加代码,以防止复选框被选中。
    不过,您需要以某种方式存储先前选择的RadioButton

    var
      SelectedRadioButton: TRadioButton;
    
    //event shared by all radiobuttons
    procedure TForm1.RadioButton1Enter(Sender: TObject);
    begin
      if Sender <> SelectedRadioButton then begin
        SelectedRadioButton.Checked:= true;
      end;
    end;
    
    procedure TFrameOrder.RadioButton1Click(Sender: TObject);
    begin
      SelectedRadioButton:= (Sender as TRadioButton);
    end;
    
    procedure TFrameOrder.RadioButton1KeyPress(Sender: TObject; var Key: Char);
    var
      MyRadioButton: TRadioButton;
    begin
      MyRadioButton:= (Sender as TRadioButton);
      if Key in [#32,#13] then begin 
        MyRadioButton.Checked:= true;
        RadioButton1Click(MyRadioButton);
      end; {if}
    end;
    

    创建一个新的 TMyRadioButton 组件可能更清楚,因为这会使您的常规代码混乱。

    【讨论】:

    • 谢谢,约翰。我尝试了这个解决方案,但问题比看起来更深。
    【解决方案3】:

    我找到了一个关于这个问题的interesting article of Craig Stuntz。如我所见,我需要创建自己的控件来解决它。

    【讨论】:

    • 如果您真的希望能够在 所有 相关单选按钮之间切换,您只需要这样做。不过,这通常不是单选按钮的工作方式。您进入单选按钮的,然后使用箭头键(或加速字符)选择应选中的按钮。只有选中的那个应该是一个制表位。
    • @Rob,我了解标准情况,但我需要解决一些不常见的任务,即单选按钮不在单个组中,而是在不同控件的部分中。所以我想完全控制选择和检查。
    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多