繁体   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