2011-08-20 118 views
5

爲DELPHI應用程序實現外部模塊系統的最佳方法是什麼?外部模塊實現

我需要的是非常基本的實在:

  • 主要的應用程序會檢測是否有模塊存在,並將其加載(運行時間)
  • 模塊可以存儲形式
  • 模塊可以存儲數據模塊
  • 模塊可以存儲代碼

我需要使用其他表單中的存儲表單,並且只能作爲獨立的

我使用這樣的

 if Assigned(pNewClass) then begin 
      Application.CreateForm(pNewClass, _lFrm); 
      _lFrm.Hide; 
      _lFrm.BorderStyle := bsNone; 
      _lFrm.Parent := pBasePNL //(TPanel); 
      _lFrm.Align := alClient; 
     end; 

所以我創建了一個TForm的,但把它放在一個TPanel內。

至於DataModules,我通常會存儲ImageLists,因此理念是更改應用程序ICO只需更改外部模塊。

那麼實現這一目標的最佳方法是什麼?

看着運行時BPL,但似乎並不明白如何去做。 謝謝。

UPDATE:.....................................

閱讀一些相關的問題和答案後,我想我找到了我的答案和解決方案。

http://edn.embarcadero.com/article/27178

這篇文章是老東西,但令人驚訝的簡單。

那麼邏輯是有我只是似乎沒有得到它顯示的形式

我只是測試例2

它加載的BPL,但沒有得到表:

AClass := GetClass('TForm2'); 

始終retrievex '零'

但BPL,因爲它註冊:

RegisterClass(TForm2); 

任何人都可以幫助這個。

+1

你可能會發現更多的信息,如果你尋找插件 –

+0

這真的是一個重複的,只要看看右邊的相關問題的列表 –

+0

剛剛做了,謝謝。在那裏找到我的解決方案。 – Jlouro

回答

2

我給你做了一個演示,它很容易上手!然而...開始沒有完成。

每當我開始使用插件,我後來都後悔了。但是,正如你所說,你需要一個二進制插件系統。所以BPL是正確的解決方案。 David建議使用接口(使用普通的DLL而不是完整的運行時包BPL),這樣可以解決一些常見的BPL不穩定問題,這是由於沒有對類進行版本控制,從而影響了應用程序和包的二進制兼容性依賴關係,正常。如果你不需要共享內存並且不需要使用borlandmm.dll(共享內存管理),那麼帶有接口的直連DLL就可以正常工作。

如果您只需腳本就可以完成所有工作,並且只需通過腳本創建插件系統即可。如果你可以逃脫DLL,接口,並沒有內存共享,然後使用普通的DLL。如果你必須共享內存和類的類型,那麼是的,使用BPL。

請注意,使用BPL(運行時軟件包)帶有很多您可能沒有預料到的副作用。我工作過的最大的基於BPL的應用程序比我工作過的任何單一應用程序都更加混亂,並且不太穩定。看起來只有鬆開包裝纔可以嘗試它們,然後我發現,我再次鬆開了單塊。

如果您正確使用BPL包,並且您正確地版本化插件,則一切正常。 BPL很棒。但在現實世界中,似乎理智的版本控制和ABI兼容性和互操作性以及穩定性是非常重要的。

更新:我給你做了演示,它是here(plugin_r2.zip)。它是在Delphi XE中完成的,但如果您使用的是舊版本的delphi,則只需刪除.dproj文件並打開主應用程序的.dpr文件以及打包的.dpk文件。

+0

我需要的是將表單,數據模塊和資源存儲在BPL中。我們的目標是爲主APP創建額外的模塊,我給客戶或不給客戶。每次構建主體時,我都會重建模塊(BPL)。 DELPHI版本不是我在2007年工作的問題,並且計劃將它保留一段時間以使其擴展。現在不工作的是GetClass。 – Jlouro

+0

我給你做了一個演示,看看上面的答案上面的鏈接!如果你沒有使用delphi XE,那麼刪除DPROJ文件,然後打開.dpr文件,它仍然可以工作。 –

+0

感謝您的DEMO,但「mainFormMainUnit1.pas」丟失。 – Jlouro

4

軟件包是一個簡單的解決方案,但它們有一個巨大的缺點。使用包迫使插件作者不僅使用Delphi,而且使用與您相同版本的編譯器。

我個人更傾向於通過一些接口公開應用程序的功能。這允許從Delphi以外的語言訪問。

通常,插件將在DLL中實現,並將導出應用程序調用的函數以傳遞代表應用程序的根界面。然後該插件將調用該接口的方法,從而建立雙向交互。

+1

如果他想要將Datamodules和Delphi表單作爲問題狀態返回,則此建議不是很有用。由於返回的表單將依賴Delphi和版本 –

+0

但是,警告人們遠離鯊魚出沒的水域是個好主意。因此,大衛+1。 –