调用TCustomForm.SetFocusedControl函数

时间:2016-10-19 13:24:59

标签: delphi

首先,我的目标不是将重点放在控件上,而是试图理解为什么表单在停用并重新激活后会有不同的外观。

Here是TCustomForm.SetFocusedControl函数的描述:

  

将焦点设置为表单上的控件。

     

使用 SetFocusedControl 对表单输入焦点进行控制。如果Control参数指定的Control已经处于接收焦点的过程中, SetFocusedControl 将返回false,否则返回true。

     

注意:返回值为true并不表示控件已成功接收输入焦点。如果控件无法获得焦点(例如,如果它不可见), SetFocusedControl 仍将返回true,表示已尝试。

我创建了一个简单的测试应用程序,以便重现观察到的行为:

enter image description here

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)首先,表单显示如下:

enter image description here

2)点击&#34; Button1&#34;后,我就能看到:

enter image description here

Memo1.Text报告Edit2是活动控件,但它没有典型的焦点外观(选择和光标)。

表单的标题不会变灰并点击它不会导致任何更改。

3)我已在表单外点击(在Windows任务栏上)。

enter image description here

表格的标题变得灰暗。

4)我已点击其标题重新激活该表单:

enter image description here

Edit2现在看起来像是有焦点。

有人可以解释表格 2 4 之间的差异吗?在这两种情况下,Edit2都是主动控件,我无法理解外观差异。

更多信息:

在Delphi 2007,Windows 10 Pro上进行测试。

1 个答案:

答案 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对象的ScreenActiveControlActiveCustomForm和{{1 proproies并重新排序其ActiveFormFocusedForm属性的条目。

当表单停用然后重新激活时,VCL会将输入焦点设置为最后一个已知的“焦点”控件,现在为CustomForms而不是Forms