2011-04-27 60 views
2

將具有完整功能的窗體放入dll中是不錯的主意。 主應用程序將調用返回表單對象的dll函數。dll中的Delphi窗體

回答

7

Delphi中接受的方法是使用包而不是DLL。

包本質上是DLL,但具有Delphi特定功能,允許VCL對象跨包邊界使用。

試圖用DLL來做到這一點將導致軟件包處理的各種問題。軟件包的一個缺點是所有模塊必須使用相同版本的Delphi進行編譯。但是,如果你想跨模塊邊界共享對象,那麼如果你使用DLL,你將面臨同樣的限制。

德爾福的文檔有packages的廣泛報道。儘管如此,我還是補充說,如果你可以把所有的代碼放到一個單獨的模塊(.exe或.dll)中,那麼它確實使生活變得簡單得多。

+0

我寧願說Delphi文檔沒有關於包的有用信息。 – kludg 2011-04-27 14:29:40

+3

我對軟件包的看法是:這是一個很酷的想法,因爲它可以消除許多通過DLL共享代碼所涉及的典型內存管理問題。然而,在實施過程中,發現所有「好東西」都要求包和應用程序之間的耦合過於緊密。例如。有時將新功能轉換爲包需要重新組合應用程序。我相信太多的錢都被倒入了包裝洞中,沒有人想承認這是一個壞主意。 – 2011-04-28 17:43:20

+0

PS:我完全同意單模塊方法,除非有重要的需要另外填寫。 – 2011-04-28 17:47:19

2

David Heffernan所說的一切+1。

從戰略上講,如果您正在實施插件系統,您實際上只需要需要來實現外部文件中的表單(或其他功能)。

如果你打算允許用任何語言編寫插件,那麼DLL是唯一的選擇。

如果你的插件系統將被限制在具有相同版本的Delphi的開發者(同一個團隊或許?),那麼就去BPL吧。從我的角度來看,Delphi軟件包的另一個缺點是需要在應用程序中部署VCL BPL,而這些應用程序總是比單個編譯模塊更高。

另一方面,如果您要編寫模塊化系統,您仍然可以通過在代碼中實現鬆散耦合&「插件」技術並仍編譯爲單個模塊來實現此目的。

5

添加到回答了有關使用包:

  • 包只能如果同時使用,主要的應用程序和所有的DLL(插件)是用Delphi編寫的使用Delphi的相同版本的書面
  • 的DLL可以寫,可以創建它們,並且可以通過任何程序,無論編程語言

所以可以使用任何編程語言,使用的DLL,而不是包有一定道理。

關於實際問題:是的,可以將表單放入dll中並且它們通常工作正常。只要確保你不會傳遞它們,因爲它們只是dll上下文中的有效對象。你會遇到表單失去焦點或出現在其他表單後面的奇怪問題。這通常可以通過將窗口句柄從主可執行文件傳遞給dll來解決,然後將dll作爲表單的父項。

另請注意:您的dll的TObject與您的應用程序的TObject不同。這同樣適用於其他常用的類和變量,例如(Forms。)應用程序。

我已經做到了,腰背疼痛,但並非不可能。主程序用Visual Basic 6編寫,一些模塊用Delphi 6編寫,其他用Delphi 7和Delphi 2007編寫。

結論:如果您確定自己的應用程序永遠不會使用與Delphi不同的東西,對於你的DLL(插件),並且在切換Delphi版本時總是重新編譯所有東西,你應該使用包。否則,使用常規dll可能會更好。 (你確定你將永遠是唯一一個寫這些DLL的人嗎?也許有時候會有一個第三方開發人員爲其中一個不需要Delphi版本的dll開發。)

2

IMO this is有時候是一個非常好的主意,也是唯一的出路 - 由於其他人提到的原因,我不喜歡軟件包,並且對DLL很熟悉。目前,我正在使用Delphi XE爲使用Delphi 5編寫的應用程序添加功能 - 它使用DLL或在D5中編寫 - 當然,我選擇了前者:D5應用程序調用XE編寫的DLL,其中包含所有最新和最強大的功能。 (我在Delphi中完成的第一個項目是通過舊的Borland Paradox - Paradox應用程序調用DLL編寫的Delphi 1!)

但是,我不會將表單或模塊從DLL發送回主應用程序 - 我只是發送DLL模塊一個結構,其中包含了它需要知道的工作,當它完成並且DLL的表單關閉時,它會清理並返回一個數字代碼或結構返回給調用者,指示成功,失敗等老式但非常有效)。

將表單實例從DLL傳遞迴您的主應用程序跨越DLL門限可能會有問題 - 請注意@dummzeuch上面的出色答案,以及如何協商某些問題的一些好的提示,如果您認爲這是您唯一的解決方案。

0

如果你在正常的dll中放置一個表單,表單將不能截取TAB或箭頭鍵。我被告知這是由於OnKeyDown無法通過。