Delphi :TRadiobutton的TabStop问题

dkqlctbz  于 2022-11-04  发布在  其他
关注(0)|答案(4)|浏览(171)

当TRadioButton的TabStop=True时,它的行为非常奇怪。
如果你想使用Tab键在一个表单上的多个单选按钮之间切换焦点,你只能在每个应用程序会话中切换一次。制表是单向的,永远不会返回到第一个单选按钮。而且,当焦点在单选按钮之间移动时,它们会自动变为“选中”。
是否可以在不创建自己的组件的情况下修复此行为?
我希望标准单选按钮
1.循环切换焦点
1.当焦点进入单选按钮时,阻止选中该按钮(我希望用户使用空格键选中它们)

xoefb8l8

xoefb8l81#

我知道您正在使用现有代码,这是一个真实的世界中的约束,在这些论坛中经常被忽视。
听起来复选框更适合您。您可以在OnChecked事件中强制RadioButton的排它性。这应该可以解决您的Tab键/焦点和选择/取消选择问题。
复选框不会在获得焦点时自动选中,用户可以使用空格键选中/取消选中它们。

ecfsfe2w

ecfsfe2w2#

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

cx6n0qe3

cx6n0qe33#

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

35g0bw71

35g0bw714#

默认情况下,只有一个RadioButon具有属性TabStop = True;所有单选按钮都被视为一个控件当单选按钮具有焦点时,可以使用向上箭头和向下箭头在单选按钮之间切换
现在,当用户选择一个选项时,他们可以按Tab键切换到另一个控件(不改变收音机选项)。

相关问题