Delphi:TRadioButton的TabStop问题

Delphi:TRadioButton的TabStop问题,delphi,focus,radio-button,selection,Delphi,Focus,Radio Button,Selection,当TRadioButton的TabStop=True时,它的行为非常奇怪 若你们想用Tab键在表单上的多个单选按钮之间切换焦点,那个么在每个应用程序会话中你们只能切换一次。制表是单向的,永远不会返回到第一个单选按钮。此外,当焦点在单选按钮上移动时,它们会自动“选中” 在不创建自己的组件的情况下,是否可以修复此行为 我想要标准的单选按钮 循环切换焦点 防止单选按钮在焦点进入时进行检查(我希望我的用户使用空格键进行检查) 您可以将代码放入OnEnter事件中,以防止复选框被选中。 不过,您需要以某种

当TRadioButton的TabStop=True时,它的行为非常奇怪

若你们想用Tab键在表单上的多个单选按钮之间切换焦点,那个么在每个应用程序会话中你们只能切换一次。制表是单向的,永远不会返回到第一个单选按钮。此外,当焦点在单选按钮上移动时,它们会自动“选中”

在不创建自己的组件的情况下,是否可以修复此行为

我想要标准的单选按钮

  • 循环切换焦点
  • 防止单选按钮在焦点进入时进行检查(我希望我的用户使用空格键进行检查)

  • 您可以将代码放入
    OnEnter
    事件中,以防止复选框被选中。
    不过,您需要以某种方式存储以前选择的
    单选按钮

    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;
    
    var
    SelectedRadioButton:TRadioButton;
    //所有单选按钮共享的事件
    程序TForm1.RadioButton1Enter(发送方:TObject);
    开始
    如果发件人选择了RadioButton,则开始
    SelectedRadioButton.Checked:=true;
    结束;
    结束;
    过程TFrameOrder.RadioButton1Click(发送者:ToObject);
    开始
    SelectedRadioButton:=(发送方为TRadioButton);
    结束;
    程序TFrameOrder.RadioButton1KeyPress(发送方:ToObject;变量键:Char);
    变量
    MyRadioButton:TRadioButton;
    开始
    MyRadioButton:=(发送方为TRadioButton);
    如果输入[#32,#13],则开始
    MyRadioButton.Checked:=真;
    RadioButton1Click(我的RadioButton);
    结束;{if}
    结束;
    

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

    我发现了一个关于这个问题的解决方案。正如我所看到的,我需要创建自己的控件来解决它

    我知道您正在使用现有代码,这是一个现实世界中的约束,在这些论坛中经常被忽略

    我觉得复选框更适合你。您可以在OnChecked事件中强制执行通常期望的单选按钮的排他性。这将解决您的选项卡/焦点和选择/取消选择问题


    收到焦点后不会自动选中复选框,用户可以使用空格键选中/取消选中复选框。

    谢谢,Johan。我尝试过这个解决方案,但问题比看起来更严重。如果你真的想在所有相关单选按钮之间切换,你只需要这样做。不过,单选按钮通常不是这样工作的。您可以将选项卡插入单选按钮组,然后使用箭头键(或加速器字符)选择要选中的单选按钮。只有选中的按钮才应该是制表位。@Rob,我理解标准情况,但我需要解决一个有点不寻常的任务,当单选按钮不在单个组中,而是在不同控件的部分中时。所以我想完全控制选择和检查。我选择这个答案是因为使用复选框是我所看到的问题的最简单的解决方案。然而,我需要的正是单选按钮,我将创建一个具有修改的列表行为的组件。