Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi:dll上的模式窗体到启动窗体_Delphi_Modal Dialog_Lost Focus_Stayontop - Fatal编程技术网

Delphi:dll上的模式窗体到启动窗体

Delphi:dll上的模式窗体到启动窗体,delphi,modal-dialog,lost-focus,stayontop,Delphi,Modal Dialog,Lost Focus,Stayontop,所以,我有一个虚拟键盘 它位于dll内部,基于StationTop模式表单。 它由一个函数调用,该函数返回带有键入文本的宽字符串。 这个虚拟键盘有它自己的TEdit,用户可以在其中书写,然后看到他在写什么 所需的行为是使窗体保持在顶部并保持焦点,直到按下Esc或Enter键 对这个键盘的一个调用发生在主窗体的OnShow事件中,因此在第一次调用键盘时它是不可见的 这一直发生到现在 我创建了一个splash表单,引导用户完成各种步骤,直到主表单实际加载为止:皮肤加载、插件加载、数据库初始化等等 一

所以,我有一个虚拟键盘

它位于dll内部,基于StationTop模式表单。 它由一个函数调用,该函数返回带有键入文本的宽字符串。 这个虚拟键盘有它自己的TEdit,用户可以在其中书写,然后看到他在写什么

所需的行为是使窗体保持在顶部并保持焦点,直到按下Esc或Enter键

对这个键盘的一个调用发生在主窗体的OnShow事件中,因此在第一次调用键盘时它是不可见的

这一直发生到现在

我创建了一个splash表单,引导用户完成各种步骤,直到主表单实际加载为止:皮肤加载、插件加载、数据库初始化等等

一旦DataModule OnCreate被执行,启动屏幕就会显示,并且在主窗体的OnActivate上关闭。 所以这个飞溅的形态不是静止状态-它不需要,因为它是在主形态出现的那一刻关闭的

中间的某个地方,键盘显示出来,用户可以输入一些所需的数据。 按照我的说法,键盘应该抓住焦点,因为它是一个模态窗口,但事实是,在我点击键盘窗体之前,splash窗体拥有焦点,这是我想要避免的

如果在键盘之前调用splash表单,没有模式,没有StayOnTop,有人能告诉我为什么它保持焦点,以及如何避免它(如果可能的话)

附言:
我确实在SO中发现了其他关于类似问题的问题,但结果却是相反的:希望StayOnTop的形式将重点放在主要形式上。那不是我需要的。

好吧,我解决了我的问题。一个简单的例子是

在调用键盘之前,我刚刚添加了Application.ProcessMessages


只要键盘可见,焦点就会一直指向键盘。

在键盘窗口的显示中调用SetForegroundWindow。键盘窗体的弹出父项是什么?@SertacAkyuz:我刚才做了,但没有更改。。。焦点仍然会转到背景中的splash表单,您希望成为该表单的弹出父级吗?为什么这在DLL中?@nuno-好的。我想如果没有测试用例,我真的猜不出发生了什么。这听起来不像解决方案。我同意我不知道为什么。。。我想,在创建键盘表单之后,一些挂起的消息将焦点放在了splash表单上,而ProcessMessages强制它在创建之前进行处理。但我真的不知道是什么信息在起作用。。。