【问题标题】:Access to public methods and properties inside a Delphi BPL访问 Delphi BPL 中的公共方法和属性
【发布时间】:2011-12-18 23:37:47
【问题描述】:

我有一个应用程序可以加载一个简单表单中的 BPL。

此表单是主应用程序的可选选项。

BPL 加载正确,表单显示正确,但是我不知道如何访问 bpl 中表单的公共方法和属性。

谁能提供一个简单的例子?

我的代码:

// Load the BPL on aplication Load
LoadPackage( 'About.bpl' );

// CAll for TForm1 inside the About.BPL
var
  AClass: TClass;
  AForm: TForm;
begin

    AClass := GetClass('TForm1');
    if AClass <> nil then
  begin
        Application.CreateForm(TComponentClass(AClass), AForm);
        AForm.Show;
    end;

// The unit TForm1 inside the BPL package
unit Unit1;

interface

uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls;

type
    TForm1 = class(TForm)
        Button1: TButton;
        Label1: TLabel;
        procedure Button1Click(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
        PublicMthd;
    end;

var
    Form1: TForm1;

implementation

{$R *.dfm}

Procedure TForm1.PublicMthd;
Begin
    ShowMessage('Inside call');
End;

initialization
    RegisterClass(TForm1);

finalization
    UnRegisterClass(TForm1);

end.

如何在 Tform1 中访问“PublicMthd”?

【问题讨论】:

  • 向我们展示您的代码是什么样的。加载 BPL 文件的方法有很多种,答案取决于您的操作方式。
  • 这个 BPL 是你写的吗?为什么不导出一个叫GetMainForm的函数,然后调用function GetMainForm:TForm就可以访问了?您是否有理由不能使用常识方法?一旦你知道类并且可以枚举它们,甚至可能创建它们的实例,你打算做什么?您是否有理由没有指定适合您的问题域的 IPluginInterface,而不是直接从您的主应用程序转到底层类类型?
  • 您的可执行文件对 bpl 中的“TForm1”一无所知,只知道它是(或源自)TForm。因此,您只能访问 TForm 的方法和属性。不管你喜不喜欢,弗朗索瓦的答案是正确的。

标签: delphi module bpl


【解决方案1】:

在动态加载的 bpl 中包含 TOptionalForm 的一个好处(假设这是从“可选”位开始的))是为了避免您的应用程序专门保存 TOptionalForm 类的定义(它位于包中包含的单元中并且只有那里)。

这意味着您的应用程序对它一无所知,除非您使用以下任何一种:
- 共享基类
- 声明要访问的属性和方法的接口
- 一些基本的 RTTI 来访问已发布的属性和方法
- 一些扩展 RTTI 以访问公共属性和方法(如果您有 D2010 或更高版本)
- 来自 bpl 的一些外部例程接受基类参数(或 TObject/指针),在内部将其类型转换为 TOptionalForm。

这是非常模糊和笼统的,需要对您的代码进行更精确的改进...

【讨论】:

    【解决方案2】:

    如果你需要动态加载 BPL,你应该使用 - 正如 François 已经提到的:

    • 一个抽象类(更类似于 Delphi)
    • 一个界面(我认为它更干净,体验更好)

    放置在主应用程序和表单 BPL 都使用的纯界面单元中。

    我使用中间的“契约/接口”BPL,主应用程序和动态加载的应用程序都静态使用它。

    在接口使用的情况下,还可以查看$WEAKPACKAGEUNIT 指令以进一步将BPL 与应用程序解耦。

    要评论 cmets - 通过使用 DLL 导出或 RTTI,您基本上会绕过 BPL 的全部要点,即类型和命名空间共享。

    【讨论】:

    • 我是一个简单的例子,我给你赏金
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 1970-01-01
    相关资源
    最近更新 更多