Hallo,
auch, wenn der Thread schon etwas älter ist: Geht das wirklich nicht? Ich möchte Packages (
BPL) dynamisch von meiner Hauptanwendung laden. Es soll damit möglich sein auch später noch neue Packages zu entwickeln, ohne die Hauptanwendung nochmal zu übersetzen. Die Packages sollen dabei Frames bereitstellen, welche in der Hauptanwendung angezeigt werden.
1. Ansatz
Quellen:
http://www.delphipraxis.net/171762-h...-packages.html
http://www.delphipraxis.net/63743-fo...sch-laden.html
http://stackoverflow.com/questions/3...to-application
http://edn.embarcadero.com/article/27178
Folgendes im
Package:
Delphi-Quellcode:
initialization
RegisterClass(TMyFrame);
finalization
UnRegisterClass(TMyFrame);
Funktioniert leider nicht, da die Packages hier leider bereits beim Compilieren der Hauptanwendung bekannt sein müssen. Ansonsten erhalte ich, wie in vielen Threads angemerkt, "nil", wenn ich mit GetClass/FindClass nach der Klasse suche.
2. Ansatz
Erstellen von Funktionen im
Package, welche per
export bereitgestellt werden.
Leider erhalte ich dann, wie hier im ersten Post geschrieben, den Fehler "TFont kann nicht TFont zugeweisen werden".
Mein bisheriger Versuch:
Package:
Code:
exports
CreateFrame;
function CreateFrame(AOwner: TComponent; AParent: TWinControl; AHandle: HWnd): TFrame;
begin
Application.Handle := AHandle;
Result := TFrameBPL.Create(AOwner);
Result.Parent := AParent;
Result.Align := alClient;
end;
Hauptanwendung:
Delphi-Quellcode:
procedure TMain.LoadBPL(AFileName: string);
type
TCreateFrame = function(AOwner: TComponent; AParent: TWinControl; AHandle: HWnd): TFrame;
var
CreateFrame: TCreateFrame;
BPLFrame: TFrame;
begin
FPackageModule := LoadPackage(AFileName);
if FPackageModule <> 0 then
begin
@CreateFrame := GetProcAddress(FPackageModule, 'CreateFrame');
if Assigned(CreateFrame) then
BPLFrame := CreateFrame(sb, sb, Application.Handle); //sb ist eine TScrollBox
end;
end;
Was mache ich falsch, bzw. wie sollte man es richtig machen?
Grüße
Headbucket