【发布时间】:2016-07-09 04:11:31
【问题描述】:
我有一些表格可以帮助我搜索产品或客户。当我打开这些表单时,我希望输入用于搜索的 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 也不会获得焦点。
有什么想法吗?
【问题讨论】:
-
使编辑控件具有
TabOrder或0,这就是您需要做的所有事情。 -
我无法让它工作...确保 TEdit 的 TabOrder 属性及其所有父容器都有 TabOrder := 0。
-
我无法理解该评论。你似乎在自言自语。
-
编辑控件的 TabOrder = 0,行为仍然相同。
-
为我工作。你的程序有什么不同。你没有显示程序。只是几块碎片。这确实是调试的关键,而你真正的问题是你还没有学会调试。而不是理解你的问题,你只是一次又一次地攻击,而没有获得正确的理解。因此,请创建minimal reproducible example 来重现该问题。然后我预测您将能够自己解决问题。