簡體   English   中英

DLL表格為MDI CHILD

[英]DLL Forms as MDI CHILD

我有一個用Delphi 5開發的大型MDI應用程序,我需要添加更多新功能,新的表單在DLL中使用Delphi XE。

我有一個非常好的例子 Raymond Alexander,它在Delphi 5上運行得很好,但是在我的項目中試圖跟隨他的例子時,帶有Delphi XE的DLL無法正常工作,並且在我傳遞的時候給了我一個錯誤參數“APPLICATION”和DLL未正確接收。

function Modulo_PPtos_Configuracion(No_Orden : Integer; PathDB : WideString ;        PathDBConfig : WideString ; App : TApplication; Scr : TScreen) : Integer ; StdCall;
begin 
  if not Assigned(DmDatos) then
   Abrir_BasesDeDatos(No_Orden, PathDB, PathDBConfig);

 if not (assigned(frm_Configuracion)) then
  begin
{$IFDEF MDI}
  **Application := App;
SHOWMESSAGE(APPlication.MainForm.Name);
   frm_Configuracion := Tfrm_Configuracion.Create(Application.MainForm);**
{$ENDIF}

{$IFNDEF MDI}
   frm_Configuracion := Tfrm_Configuracion.Create(nil);
{$ENDIF}  
end;

正如您將注意到,在進行調試時會顯示一條消息,並顯示失敗的原因,因為原始代碼無法調試以下代碼行。

請原諒我的英語。

這種方法無法奏效。 您的應用程序中有兩個不同的VCL實例,一個來自exe,另一個來自DLL。 這是VCL太多了。

通過考慮對象是什么,您可以最容易地理解這一點。 對象既是數據又是代碼。 將對象從exe傳遞給DLL時,您傳遞的是數據,而不是代碼。 Delphi對象不是可行的跨語言互操作類型。 當您將D5 TApplication實例傳遞給XE DLL時,XE代碼會將其解釋為XE TApplication。 但事實並非如此。 同樣的問題適用於您的MDI父母和孩子。 前者是D5形式,后者是XE形式,因此它們的相互作用不能成功。

包通過共享VCL的單個實例來解決這個問題,但當然這有一個必然結果,所有包都使用相同版本的Delphi構建。 如果你想使用VCL,這是一個硬約束。

因此,如果您想要使用XE構建一些表單,則需要移植整個應用程序。

Dave非常出色的答案的唯一替代方法是使用sharemem,但我認為你仍會遇到VCL版本的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM