gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:08:48 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com