显示窗体后的焦点控制



我有一些表格可以帮助我搜索产品或客户。当我打开这些窗体时,我希望我键入的用于搜索的 TEdit 控件能够获得焦点。我一直在使用计时器,但我一直在寻找一种更合法的方式来做到这一点,因为如果当表单尚不可见时告诉控件聚焦时,这有时会导致错误。

我尝试使用在表单的OnShow事件结束时调用的Windows消息AfterShow。它不像ActiveControl或SetFocus的其他更简单的解决方案那样工作。窗口消息代码是这样的。

const WM_AFTER_SHOW = WM_USER + 444;
  private
    procedure WmAfterShow(var Msg: TMessage); message WM_AFTER_SHOW;
procedure Tproducts_edit_form.WmAfterShow(var Msg: TMessage);
begin
self.ActiveControl:= search_txt;
//showmessage(Screen.ActiveControl.Name);
//PostMessage(search_txt.Handle, WM_SETFOCUS, 0, 0);
end;

奇怪的是,如果取消注释显示消息和帖子消息,TEdit 将正确获得焦点。如果我不这样做,窗体将打开,但 TEdit 没有焦点,即使 Screen.ActiveControl.Name 告诉我我想要的控件具有焦点。

有什么想法吗?

使用

Form.ActiveControl(不是 Screen.ActiveControl)属性将焦点设置在控件上是正确的,但在 OnShow 中使用它,而不是在 OnCreate 等中使用它:

//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
    ActiveControl = Edit1;
}

如果它不起作用,可能是因为手动干扰窗口消息处理程序,消息队列。

Windowsmessage 技术正在工作,并且要聚焦的控件的 TabOrder 确实必须为零。

我遇到的问题是躺在DevExpress栏中,我的控件已停靠。这些栏的工作方式使得无法聚焦停靠在 DevExpress 栏中的非 DevExpress 控件。

最新更新