Delphi:TRadioButton的TabStop问题

时间:2011-05-17 13:47:33

标签: delphi focus radio-button selection

当TRadioButton的TabStop = True时,它表现得非常奇怪。

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

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

我想要标准单选按钮

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

3 个答案:

答案 0 :(得分:1)

您可以将代码放入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组件可能更清楚,因为这会使你的常规代码变得混乱。

答案 1 :(得分:1)

我找到了关于此问题的interesting article of Craig Stuntz。我可以看到,我需要创建自己的控件来解决它。

答案 2 :(得分:1)

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

听起来像复选框更适合你。您可以在OnChecked事件中强制执行通常期望的RadioButtons的排他性。这应该可以解决您的标签/焦点和选择/取消选择问题。

收到焦点后,将不会自动检查复选框,您的用户可以使用空格键检查/取消选中它们。