2014-10-04 34 views
0

我有一个使用Embarcadero XE 6创建的Windows控制台应用程序(实际上已从Borland C++ Builder5项目转换而来)。它有一个带有几个按钮和编辑控件的单一窗体。所有这些控件都设置了TabStop = True和适当的TabOrder。但是,在显示窗体时,在运行时按下Tab键不会执行任何操作(当光标/焦点位于编辑控件中时它只会产生声音,并且在按钮聚焦时不会执行任何操作)。使用单个VCL表单的控制台应用程序中的Tab顺序

我已经阅读过文档,除非窗体的Parent被设置,否则Tab顺序将不起作用。但是,这是唯一的VCL表单(其他窗口是控制台和GLUT窗口),所以没有VCL父AFAIK。我试图设置

Parent=Application->MainForm; 

在窗体的构造函数中,但Application->MainForm也是NULL。有任何想法吗?

+0

你有消息循环吗? – 2014-10-04 20:57:53

+0

我没有自己的自定义消息循环。我以下面的方式创建表单:MyForm = new TMyForm(Application); MyForm->显示();就是这样。我还有处理OK和Cancel按钮的功能,可以处理我需要的一切。 – dolphin 2014-10-04 21:05:54

+0

你从哪里得到** Borland ** XE6的副本? Borland在几年前卖掉了Delphi,现在已经不存在了。如果您拥有** Borland ** XE6的副本,那么可能会有足够的资金让您不必再编写代码。 :-) – 2014-10-04 21:20:36

回答

0

你的问题是你没有消息循环。这是因为控制台应用程序预计不会有窗口,并且默认情况下不带有消息循环。

你可以通过调用运行一个消息循环:

Application->Run(); 

然而,这将可能是由正常停止应用程序的控制台部分。你的主线程如何同步服务于控制台,并且异步GUI消息同时循环?

我怀疑你需要更认真地重新考虑你的应用程序设计。


关于你的更新,看起来你有一个消息循环,但它是GLUT框架的消息循环。 VCL框架需要消息循环来处理对话消息,如TAB键按下。

运行VCL消息循环代替GLUT消息循环会给出更好的结果是合理的。但它很可能会破坏应用程序的GLUT部分。

试图从单个消息循环中运行两个不兼容的GUI框架很难找到正确的。这里可能没有快速修复。你需要深入挖掘。也许最好放弃VCL并坚持一个GUI框架。

+0

这是一个GLUT应用程序(更新了我的问题),当某些事件发生时它应该打开VCL表单(并且它确实如此,除了从选项卡以外,一切正常)。悬停在控件上时,甚至会出现工具提示。我添加了Application-> Run();在MyForm-> Show()之后;但它没有改变任何东西...... – dolphin 2014-10-04 21:55:17

+0

是的。这是一个主要细节。听起来好像你确实有一个控制台应用程序。听起来就像你在侧面有一个控制台窗口的大量GUI应用程序。可能通过AllocConsole。但是你的glut消息循环并不知道vcl。 – 2014-10-04 22:29:45

+0

这是一个“控制台应用程序”项目,其入口点是main(int,char **)。的确,glut消息循环不会调用vcl的消息处理。奇怪的是,包括工具提示在内的其他一切工作! [我确认了正常的vcl应用程序中的相同表单正确处理选项卡。] – dolphin 2014-10-05 02:17:38

相关问题