2014-10-04 73 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

相關問題