2014-03-02 34 views
-1

所以,我有这个虚拟键盘模式窗体...德尔福:上一个dll到飞溅形式

这是一个DLL内,并基于StayOnTop模态形式。 它被一个函数调用,它返回带有输入文本的WideString。 这个虚拟键盘有它自己的TEdit,用户在这里写和看到他在写什么。

所需的行为是让它们KB表格保持顶部,并带有焦点,直到按Esc或Enter键。

对此键盘的调用之一发生在主窗体的OnShow事件中,所以在第一次调用键盘时它不可见。

这一直发生到现在。

我创建了一个飞溅的形式通过正在发生,直到主要形式实际加载的瞬间的各个步骤,引导用户:皮肤加载,插件的加载,初始化数据库的启动画面显示为等

DataModule OnCreate即将执行,并在主窗体的OnActivate上关闭。 所以这个飞溅形式不是StayOnTop - 它不需要,因为它是在主窗体出现的瞬间关闭。

在中间的某个地方,键盘显示出来,所以用户可以输入一些所需的数据。

由我的帐户,键盘应该抓住焦点,因为它是一个模式窗口,但事实是,飞溅形式有焦点,直到我点击键盘形式,这是我想要避免。

如果飞溅形式在键盘之前调用,没有Modal,没有StayOnTop,有人可以告诉我为什么它保持焦点,以及如何尽可能避免它。

PS: 我确实在SO上发现了其他类似问题的问题,但事实却恰恰相反:希望StayOnTop表单能够将重点放在主要问题上。这不是我需要的。

+1

在键盘窗口的OnShow中调用SetForegroundWindow。 –

+1

键盘形式的弹出父项是什么? –

+0

@SertacAkyuz:我只是做了,但没有变化... 焦点仍然在后台飞溅的形式 – nunopicado

回答

0

嗯,我解决了我的问题。而且它是一个简单的...

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

只要可见,焦点现在转到键盘上。

+0

这听起来不像解决方案。 –

+0

我同意我不知道真正的原因为什么......我认为一些悬而未决的消息是在键盘窗体创建之后将注意力集中在splash形式,并且ProcessMessages强制它在之前处理。 但我真的不知道什么消息可以做到这一点... – nunopicado