Доступ к публичным методам и свойствам внутри Delphi BPL - PullRequest
5 голосов
/ 19 декабря 2011

У меня есть приложение, которое загружает 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.

Как я могу получить доступ к "PublicMthd" в Tform1?

Ответы [ 2 ]

9 голосов
/ 19 декабря 2011

Один из интересов наличия TOptionalForm в динамически загружаемом bpl (исходя из этого «необязательного» бита)) заключается в том, чтобы приложение не содержало определение класса TOptionalForm специально (оно находится в модуле, содержащемся в пакете). и только там).

Это означает, что ваше приложение не может ничего знать об этом, если вы не используете либо:
- общий базовый класс
- Интерфейс, объявляющий свойства и методы, к которым вы хотите получить доступ
- некоторые базовые RTTI для доступа к опубликованным свойствам и методам
- некоторые расширенные RTTI для доступа к публичным свойствам и методам (если у вас D2010 или новее)
- некоторые внешние подпрограммы из bpl, принимающие параметр базового класса (или TObject / pointer), типизирующие его как TOptionalForm для внутреннего использования.

Это очень расплывчато и обобщенно, и для его уточнения потребуется больше точности ...

2 голосов
/ 27 декабря 2011

Если вам нужно динамически загрузить BPL, вам следует использовать - как уже упоминалось Франсуа:

  • абстрактный класс (который больше похож на Delphi или)
  • anИнтерфейс (который я считаю более чистым и лучше с ним работает)

, помещенный в блок только для интерфейса, используемый как основным приложением, так и формой BPL.

Я использую промежуточный BPL «контракт / интерфейс», статически используемый как основным приложением, так и динамически загружаемым.

В случае использования интерфейса можно также посмотреть директиву $WEAKPACKAGEUNIT, чтобы дополнительно отделить BPL от приложения.

Чтобы комментировать комментарии - используя экспорт DLL или RTTI, вы в основном обойдете весь смысл BPL, а именно совместное использование типа и пространства имен.

...