Hallo zusammen,
ich habe folgendes Problem:
Ich möchte gerne aus einer Delphi-Applikation (die keine Runtime-
Package (
VCL,
RTL, ...) verwendet) ein einzelnes
Package dynamisch laden und auf eine enthaltene Klasse zugreifen, die dann im Kontext der Anwendung laufen soll.
Wenn ich die Anwendung auf das Benutzen von dynamischen
Package konfiguriere, dann klappt der GetClass Aufruf.
Dann ist meine Applikation aber klein und verwendet die Standard
Package.
Ich möchte aber eine Stand-alone-Exe haben, die bei Bedarf nur auf einem
Package etwas nachladen soll.
Beisp
Package: (der Einfachheit-halber nur ein Formular)
Delphi-Quellcode:
package myPackage;
...
contains
u_frmPackage
in '
u_frmPackage.pas'
{frmPackage};
end.
Delphi-Quellcode:
unit u_frmPackage;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfrmPackage =
class(TForm)
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
implementation
{$R *.dfm}
procedure TfrmPackage.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0
to Application.ComponentCount - 1
do
begin
Memo1.Lines.Add(Application.Components[i].
Name + '
: ' + Application.Components[i].ClassName);
end;
end;
initialization
RegisterClasses([TfrmPackage]);
ShowMessage('
Class registered');
finalization
UnRegisterClasses([TfrmPackage]);
ShowMessage('
Class unregistered');
end.
Die Anwendung:
Delphi-Quellcode:
u_frmApp
...
type
TmyFormClass = class of TForm;
procedure TfrmApp.Button1Click(Sender: TObject);
var
i: HMODULE;
c: TmyFormClass;
f: TForm;
begin
i := LoadPackage('myPackage.bpl');
c := TmyFormClass(GetClass('TfrmPackage'));
if c = nil then
begin
Caption := 'Form wurde nicht gefunden';
end
else
begin
Caption := c.ClassName;
f := c.Create(self);
f.ShowModal;
f.Free;
end;
UnLoadPackage(i);
end;
...
Wenn "Menu -> Projekt -> Optionen -> Packages -> Laufzeit Packages -> [X] LaufzeitPackages aktivieren" aktiviert ist, dann funktioniert es.
Was muß ich tun um diese Funktionalität auch zutzen zu können,
wenn "Menu -> Projekt -> Optionen -> Packages -> Laufzeit Packages -> [ ] LaufzeitPackages aktivieren"
nicht aktiviert ist?
Es werden zwar die Klassen registriert (Dialog mit 'Class registered' bzw 'Class unregistered' ist zu sehen),
aber GetClass() gibt nur nil zurück.
Ich hoffe jemand heit einen guten Vorschlag
Unsere Anwendungen komplett auf Packages umzustellen geht aus verschiedenen technischen Gründen nicht.
Danke und viele Grüße
MaBuSE