2011-12-18 11 views
5

Tengo una aplicación que carga un BPL que como dentro de un formulario simple.Acceso a métodos y propiedades públicos dentro de un Delphi BPL

Este formulario es una opción opcional de la aplicación principal.

El BPL se carga correctamente, el formulario se muestra correctamente, pero no sé cómo acceder a los métodos y propiedades públicos del formulario dentro del bpl.

¿Alguien puede dar un ejemplo simple?

mi código:

// 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. 

¿Cómo puedo acceder "PublicMthd" en TForm1?

+2

Muéstranos cómo es tu código. Hay una variedad de formas de cargar archivos BPL y la respuesta dependerá de cómo lo haga. –

+0

Vea también esta pregunta SO: [execute-a-method-from-a-form-created-by-class-reference-delphi] (http://stackoverflow.com/questions/2991934/execute-a-method-from -a-form-created-by-class-reference-delphi) –

+0

¿Escribió este BPL? ¿Por qué no exporta una función llamada GetMainForm y luego llama a 'function GetMainForm: TForm' y luego puede acceder a ella?¿Hay alguna razón por la que no puedas usar un enfoque de sentido común? ¿Qué piensas hacer una vez que conoces las clases y puedes enumerarlas, y quizás incluso crear instancias de ellas? ¿Hay alguna razón por la que no especifique una IPluginInterface que se ajuste a su dominio problemático, en lugar de ir directamente a los tipos de clases subyacentes, desde su aplicación principal? –

Respuesta

9

Uno de los intereses de tener TOptionalForm en un bpl cargado dinámicamente (asumiendo esto del bit "opcional") es evitar que su aplicación mantenga la definición de la clase TOptionalForm específicamente (está en la unidad contenida en el paquete y solo allí).

Eso significa que su aplicación no puede saber nada sobre él a menos que utilice ya sea:
- una base compartida Clase
- una interfaz de declarar las propiedades y métodos de los que desee acceder
- algunos de RTTI básica para acceder a las propiedades publicadas y métodos
- algunos RTTI extendidos para acceder a propiedades y métodos públicos (si tiene D2010 o posterior)
- algunas rutinas externas del bpl aceptan un parámetro de clase base (o TObject/puntero) encasillando como TOptionalForm internamente.

Esto es muy vaga y general y una mayor precisión sobre sería necesaria su código para refinar ...

2

Si necesita cargar dinámicamente la BPL, debe utilizar - como ya se ha metioned por François:

  • una clase abstracta (que es más similar a Delphi o)
  • una interfaz (que considero más limpia y tener una mejor experiencia con)

lugar d en una unidad de interfaz única utilizada tanto por la aplicación principal como por el formulario BPL.

Utilizo un BPL intermedio "contrato/interfaz", utilizado estadísticamente tanto por la aplicación principal como por los cargados dinámicamente.

En el caso del uso de la interfaz, también puede consultar la directiva $WEAKPACKAGEUNIT para desacoplar aún más el BPL de la aplicación.

Para comentar los comentarios: al usar exportaciones de DLL o RTTI, básicamente pasaría por alto el punto completo de los BPL, que es el tipo y el espacio de nombres compartidos.

+1

I simple ejemplo de eso y te doy la recompensa – DRokie

Cuestiones relacionadas