gpt4 book ai didi

delphi - 当再次显示表单时,单选按钮保存上次检查而不是所需的检查

转载 作者:行者123 更新时间:2023-12-03 18:44:28 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在获取焦点的按钮上绘制一个焦点矩形。
对于单选按钮和自动单选按钮,父窗口为
发送了BN_CLICKED通知代码。


BN_CLICK通知(WM_COMMAND消息)将单选按钮的状态设置为选中。

使用键盘导航单选按钮时,可以找到此行为的基本原理。当您在其中一个单选按钮上按下向上/向下箭头时,将选中下一个接收焦点的单选按钮。

此行为仅适用于单选按钮,例如,尝试与另一个控件(例如复选框)相同,当其具有焦点时其状态不会改变。您会看到一切正常

正如kobik所建议的那样,一种快速简便的解决方案是在显示Form2之前将ActiveControl设置为nil。

Form2.ActiveControl := nil;


或根据文档:

Form2.ActiveControl := Form2.RadioButton2;


或者您可以按以下方式存储并重新创建表单:

从Project-> Options-> Forms中的AutoCreated Forms中删除Form2,并在ButtonClick事件中手动创建Form2

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/59506489/

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