当TRadioButton的TabStop = True时,它表现得非常奇怪。
如果您尝试使用Tab键在表单上的许多单选按钮之间切换焦点,则每个应用程序会话只会执行一次。制表是单向的,永远不会返回到第一个单选按钮。此外,当焦点在单选按钮上移动时,它们会自动“检查”。
可以在不创建自己的组件的情况下修复此行为吗?
我想要标准单选按钮
答案 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的排他性。这应该可以解决您的标签/焦点和选择/取消选择问题。
收到焦点后,将不会自动检查复选框,您的用户可以使用空格键检查/取消选中它们。