【问题标题】:DLL Forms as MDI CHILD作为 MDI CHILD 的 DLL 表单
【发布时间】:2011-11-04 04:48:01
【问题描述】:

我有一个使用 Delphi 5 开发的大型 MDI 应用程序,我需要添加更多新功能,新表单在 Delphi XE 的 DLL 中。

我有一个非常好的 example,作者是 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;

您会注意到,在进行调试时会显示一条消息,以及失败的地方,因为原始代码未能调试以下代码行。

请原谅我的英语。

【问题讨论】:

    标签: delphi delphi-xe


    【解决方案1】:

    这种方法行不通。您的应用程序中有两个不同的 VCL 实例,一个来自 exe,一个来自 DLL。一个 VCL 太多了。

    您可以通过思考对象是什么来最容易地理解这一点。对象既是数据又是代码。当您将一个对象从 exe 传递到 DLL 时,您传递的是数据,而不是代码。 Delphi 对象不是可行的跨语言互操作类型。当您将您的 D5 TApplication 实例传递给您的 XE DLL 时,XE 代码将其解释为好像它是一个 XE TApplication。但事实并非如此。同样的问题也适用于您的 MDI 父级和子级。前者是D5形式,后者是XE形式,所以它们的交互不能成功。

    包通过共享 VCL 的单个实例来解决这个问题,但当然,所有包都使用相同版本的 Delphi 构建。如果你想使用 VCL,那是一个硬约束。

    因此,如果您想要使用 XE 构建某些表单,则需要移植整个应用程序。

    【讨论】:

    • 非常感谢您的回答,现在我学到了我一无所知的东西,现在我有了另一种方法来开发未来的应用程序。
    • 很高兴听到。如果这回答了您的问题,那么请记住将其勾选为已接受的答案。你应该对你的previous question 做同样的事情,假设其中一个答案确实回答了这个问题。
    【解决方案2】:

    Dave 非常出色的答案的唯一替代方法是使用 sharemem,但我认为您仍然会遇到 VCL 版本问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多