我有一些TRadioButton
开启Form2
并调用Form2
来自Form1
使用此代码:
procedure TForm1.btnCallForm2Click(Sender:TObject);
begin
Form2.RadioButton2.Checked:= true;
Form2.ShowModal;
end;
如果用户点击btnCallForm2
, Form2
将显示,然后用户单击 RadioButton3
并关闭表单,然后通过单击 btnCallForm2
重新打开它再次。
现在Form2
再次显示但 RadioButton3
被检查而不是 RadioButton2
.
问:这是什么行为,是一个错误吗?如何设置勾选我想要的RadioButton
而不是用户上一轮选择的内容?
最佳答案
这不是一个错误。出现这种“奇怪”行为的原因是,如果 Form2 没有被销毁,那么下次它变得可见时(例如 ShowModal
),它会记住哪个控件具有焦点。
在您的情况下,最后一个焦点控件是RadioButton3(因为您单击它来更改“选中”状态)。因此,即使您将“选中”状态更改回 RadioButton2,下次激活表单时焦点也会恢复到 RadioButton3。要恢复焦点,会向控件发送 WM_SETFOCUS
。阅读 documentation 的其余部分对于按钮控件的默认消息处理:
WM_SETFOCUS Draws a focus rectangle on the button getting the focus. For radio buttons and automatic radio buttons, the parent window is sent a BN_CLICKED notification code.
此 BN_CLICK
通知(WM_COMMAND
消息)将单选按钮的状态设置为选中。
在使用键盘导航单选按钮时可以找到此行为背后的基本原理。当您在其中一个单选按钮上按向上/向下箭头时,将选中下一个接收焦点的单选按钮。
此行为仅适用于单选按钮,例如,对另一个控件(例如复选框)尝试相同的操作,当它具有焦点时,其状态不会改变。您将看到一切都按预期运行
正如 kobik 所建议的,一个快速且简单的解决方案是在显示 Form2 之前将 ActiveControl 设置为 nil
Form2.ActiveControl := nil;
或者根据文档:
Form2.ActiveControl := Form2.RadioButton2;
或者您可以销毁并重新创建表单,如下所示:
从项目->选项->表单中的自动创建表单中删除Form2,并在ButtonClick事件中手动创建它
procedure TForm1.btnCallForm2Click(Sender:TObject)
begin
Form2 := TForm2.Create(nil);
try
Form2.RadioButton2.Checked:= true;
Form2.ShowModal;
finally
FreeAndNil(Form2);
end;
end;
关于delphi - 当表单再次显示时,单选按钮保存最后选中的而不是所需的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59177529/