我有一些表单可以帮助我搜索产品或客户。当我打开这些表格时,我想要输入的TEdit控件进行搜索以进行聚焦。我一直在使用Timer,但是我一直在寻找一种更合法的方式来做这件事,因为如果在窗体不可见的情况下告诉控件被聚焦,这有时会导致错误。
我尝试使用在我的表单的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;
奇怪的是,如果取消注释showmessage和postmessage,TEdit会正确获得焦点。如果我没有,表单会打开,但即使Screen.ActiveControl.Name告诉我我想要的控件具有焦点,TEdit也不会聚焦。
有什么想法吗?
答案 0 :(得分:1)
使用Form.ActiveControl(不是Screen.ActiveControl)属性将焦点设置为控件,但在OnShow中使用它,而不是在OnCreate等中使用它是正确的。:
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
ActiveControl = Edit1;
}
如果它不起作用,可能是因为手动干扰窗口消息处理程序,消息队列。
答案 1 :(得分:-1)
windowsmessage技术正在运行,并且要聚焦的控件的TabOrder确实必须为零。
我遇到的问题是我的控件停靠在DevExpress Bar中。这些条的工作方式使得无法关注停靠在DevExpress Bar中的非DevExpress控件。