Einzelnen Beitrag anzeigen

Headbucket

Registriert seit: 12. Dez 2013
Ort: Dresden
172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Frame aus Package laden (ohne Runtime-Packages)

  Alt 22. Dez 2016, 12:29
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

Geändert von Headbucket (22. Dez 2016 um 12:37 Uhr) Grund: Kommentar hinzugefügt
  Mit Zitat antworten Zitat