2012-02-08 206 views
5

我目前正在嘗試開發一個基於Firemonkey的項目。我使用的是Firemonkey的UI功能,因爲該項目由許多較小的應用程序組成,每個應用程序都有一個3D方面。我目前只使用FMX框架開發/部署到Windows,但可能會在以後進行跨平臺。Firemonkey - 消息處理

通過在後臺構建VCL Windows應用程序以執行非常具體的操作,然後構建FMX前端,我已經瞭解了大部分我遇到的問題。但是,這僅適用於僅執行應用程序以執行其設計要執行的操作的應用程序,因此可以使用參數執行應用程序。在其中一個應用程序中,我需要使用消息(或類似的東西)。例如,在我的FMX應用程序中,如果單擊「button1」,我希望它向後臺VCL應用程序發送消息以執行「action1」,而不是使用參數執行它。

一個很好的例子可以是使用VCL TMediaPlayer在後臺應用,與前端FMX應用被用於顯示信息,並提供的播放,暫停等控制,使得它基本上成爲FMX具有VCL能力的UI。

我迄今無法找到如何使用的消息是Firemonkey處理(例如,在VCL,他們會用「SendMessage函數」或「PostMessage的」或類似的東西做)什麼,或者通過當地的幫助文件,或通過廣泛的谷歌搜索。我發現的一切都與電子郵件有關(大概是因爲我的大多數搜索條件中的「消息」一詞)。

Can anyone point me in the right direction on how messages would be handled with Firemonkey/FMX?

問候, 斯科特·普里查德

+2

你知道你可以在同一個應用程序中使用VCL和FMX,不是嗎?那麼,它確實需要一些額外的工作,但它在技術上是可行的,並且有第三方庫和文章向您展示如何去做。因此,如果您只需從FMX UI事件處理程序調用您的VCL按鈕的Click()方法(或者更好地,在您自己的函數中隔離您的共享代碼,那麼VCL和FMX都可以在需要時調用)。 – 2012-02-08 01:24:56

回答

4

我的理解是,Firemonkey不是基於傳統的Windows,所以發送窗口消息Firemonkey控制通常不是一個選項。雖然有些控件確實使用了窗口(最明顯的是TCommonCustomForm),所以您可以使用FMX.Platform.Win單元中的FmxHandleToHWND()函數在需要時從TFmxHandle中提取HWND。我不知道如何在FMX控件中接收和自定義處理窗口消息,如果甚至可能的話。

Windows下的Firemonkey可以訪問Win32 API,因此不應該阻止您將窗口消息發送到其他窗口控件,例如VCL UI。在您的uses子句中包含Winapi.Windows單元以訪問Win32 API函數,就像在VCL應用程序中一樣。

UPDATE:因爲FireMonkey不會公開對發送到窗體窗口的消息的訪問,所以您必須手動子窗口才能在FireMonkey看到消息之前接收消息。您可以重寫Form的CreateHandle()方法,首先調用inherited方法創建窗口,然後使用FmxHandleToHWND()獲取您可以繼承的HWND。確保在覆蓋DestroyHandle()方法以刪除子類,然後再調用inherited來釋放HWND

3

目前,FireMonkey沒有可用於發送和發佈消息的消息處理程序。

有可能使用像FireMonkey這樣的偵聽器在內部工作,但沒有任何記錄。

所以,相反,這裏是我做了什麼:

我創建了自己定製的「消息」類。我創建類的實例並將它們添加到我需要的任何線程的線程安全列表中。在主線程中,我有一個計時器來檢查列表並處理「消息」。