首先,我的目标不是将重点放在控件上,而是试图理解为什么表单在停用并重新激活后会有不同的外观。
Here是TCustomForm.SetFocusedControl函数的描述:
将焦点设置为表单上的控件。
使用 SetFocusedControl 对表单输入焦点进行控制。如果Control参数指定的Control已经处于接收焦点的过程中, SetFocusedControl 将返回false,否则返回true。
注意:返回值为true并不表示控件已成功接收输入焦点。如果控件无法获得焦点(例如,如果它不可见), SetFocusedControl 仍将返回true,表示已尝试。
我创建了一个简单的测试应用程序,以便重现观察到的行为:
procedure TForm1.Button1Click(Sender: TObject);
var
Res : Boolean;
begin
Res := Self.SetFocusedControl(Edit2);
if(Self.ActiveControl <> nil) then
begin
Memo1.Text :=
'ActiveControl is ' + Self.ActiveControl.Name + sLineBreak +
'SetFocusedControl result is ' + BoolToStr(Res, True);
end;
end;
以下是重现该行为的步骤:
1)首先,表单显示如下:
2)点击&#34; Button1&#34;后,我就能看到:
Memo1.Text报告Edit2是活动控件,但它没有典型的焦点外观(选择和光标)。
表单的标题不会变灰并点击它不会导致任何更改。
3)我已在表单外点击(在Windows任务栏上)。
表格的标题变得灰暗。
4)我已点击其标题重新激活该表单:
Edit2现在看起来像是有焦点。
有人可以解释表格 2 与 4 之间的差异吗?在这两种情况下,Edit2都是主动控件,我无法理解外观差异。
更多信息:
在Delphi 2007,Windows 10 Pro上进行测试。
答案 0 :(得分:5)
尽管文档说的是,Fatal error: Class 'App\Application' not found in C:\xampp\htdocs\admin\webroot\index.php on line 33
实际上并未将输入焦点设置为TForm.SetFocusedControl()
(未调用Win32 SetFocus()
函数)。 Edit2
在点击时会收到输入焦点,并在调用Button1
后保持焦点。这就是为什么SetFocusControl()
没有呈现为重点的原因。如果您想将输入焦点移至Edit2
,请拨打Edit2
而不是Edit2.SetFocus()
。
但是,调用Self.SetFocusedControl(Edit2)
会改变VCL的内部状态。它设置了表单的SetFocusedControl()
和ActiveControl
属性,并设置了全局FocusedControl
对象的Screen
,ActiveControl
,ActiveCustomForm
和{{1 proproies并重新排序其ActiveForm
和FocusedForm
属性的条目。
当表单停用然后重新激活时,VCL会将输入焦点设置为最后一个已知的“焦点”控件,现在为CustomForms
而不是Forms
。