delphi - 当表单再次显示时,单选按钮保存最后选中的而不是所需的按钮

标签 delphi radio-button

我有一些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/

相关文章:

delphi - 如何构造对象而不分配其内存?

c++ - C++程序调用Delphi DLL函数时崩溃

delphi - 有没有办法在编译时声明对方法的 const 引用?

ruby-on-rails - 在数组而不是对象上使用 collection_radio_buttons 的 Rails 表单

java - 在java中使用带有sql的单选按钮对Jtable行进行排序

android - 在android中列出多个单选按钮

php - 如何增加变量并在一系列页面上记录单选按钮的值?

perl - 如何使用 WWW::Mechanize 检查单选框?

将 C 声明转换为 Delphi XE2

delphi - 异常处理后我应该释放/销毁异常吗?