Autor Beitrag
CenBells
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Di 08.04.03 10:40 
Hallo Leute,

ich möchte mein Programm endlich modularisieren, à la Pluginarchitektur und habe mir überlegt, daß BPls doch wie gerufen kommen, nun habe ich ein kleines Testprojekt erstellt, daß ein frame aus einem BPL auf einem Panel anzeigen soll.
Compilieren und so weiter ist überhaupt kein problem, aber wenn ich an die stelle komme, an der ich meinem Frame im Bpl nen parent zuweise, bekomme ich immer folgende Fehlermeldung...

Tfont kann nicht zu TFont zugewiesen werden

Und dann kommt ein haufen Accessviolations und das programm ist nicht mehr zu gebrauchen. Weiß jemand woran das liegt?

Gruß
KEn
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 08.04.03 14:20 
Hallo!

Ich kann dir leider keine Lösung präsentieren, dafür weiss ich über dein Frame zuwenig. Aber die Fehlermeldung stammt von der Routine Assign ab, irgendetwas unternimmt also den Versuch, Fonteinstellungen von einem anderen Font-Objekt zu übernehmen.
Der Fehler kommt nur zur Laufzeit? Was sagt denn der Aufrufstack? Welche Prozeduren finden sich beim Auslösen der Exception dort?
Poste doch einfach mal ein wenig Code.

Cu,
Udontknow
CenBells Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Di 08.04.03 16:53 
hallo,
also, ich habe ein formular, da liegen ein button und ein Panel drauf. In dem Panel will ich das Frame anzeigen. mit folgender methode binde ich das package ein und will das panel laden

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TForm1.Button1Click(Sender: TObject);
var
 phm: HModule;
 ExecF: function(AParent: TWinControl): ICBStatistikModule;
 LFrame: ICBStatistikModule;
begin
 phm:=LoadPackage('D:\projekte\bin\bpl\Statistik.bpl');
 if phm <> 0 then
 try
   @ExecF:=GetProcAddress(phm,'cbGetStatistikIntf');
   if Assigned(ExecF) then begin
     LFrame := ExecF(Panel1);
     if assigned(LFrame) then
       ShowMessage('False!');
     ShowMessage ('Execute routine not found!');
   end
 finally
   UnloadPackage(phm);
 end
 else
   ShowMessage ('Package not found');
end;


Das Interface, welche die Funktion zurückliefert, sieht wie folgt aus.

ausblenden Quelltext
1:
2:
3:
  ICBStatistikModule = Interface(IInterface)
    procedure IAssignParent(AParent: TWinControl);
  end;



Das witzige ist, daß ich das Interface gar nicht anspreche.
Und nun die methode aus dem Frame selbst, die mir ein frame, bzw das interface auf das frame, zurückliefert

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
function cbGetStatistikIntf(AParent: TWinControl): ICBStatistikModule;
begin
  vFrame := TFrame1.Create(AParent);
  vFrame.Parent := AParent;
  result := vFrame;
end;


hoffentlich hilft das weiter.

---Edit
Ich habe jetzt auch folgendes im Frame probiert.
ausblenden Quelltext
1:
2:
3:
4:
5:
function cbGetStatistikIntf(AParent: TWinControl): TFrame;
begin
  vFrame := TFrame1.create(Application);
  result := vFrame;
end;


Dann gibt es immerhin keine AV mehr, aber der Fehler mit dem TFont kommt noch immer.... Und im CallStack steht nur Button1.click
--Edit End

Gruß
Ken
CenBells Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Di 08.04.03 18:32 
und eine frage habe ich noch:
Wenn ich nun die Anwendung auf die Modularisierung mittels bpl umstelle, muss ich dann alle anderen bpls (vcl, ibxpress, etc) ebenfalls mit ausliefern oder reicht es, wenn ich meine exe und das neue package ausliefere?

Gruß
KEn
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 09.04.03 08:53 
Hmmm, das ist eine merkwürdige Vorgehensweise. Du versuchst, Packages wie eine DLL zu einem bestimmten Zeitpunkt einzubinden... Ob das so klappen kann, da bin ich mir nicht sicher. Packages sind zwar auch DLLs, allerdings müssen DLLs, die Objektreferenzen wie dein AParent annehmen oder übergeben, explizit mit sharemem (Siehe Delphi Hilfe) compiliert werden.

Die eigentliche Vorgehensweise um Laufzeitpackages zu benutzen, ist aber eine andere: In den Projektoptionen unter dem Reiter "Packages" gibt es eine Checkbox "Mit Laufzeitpackages aktualisieren", die du aktivieren musst. Das dann kompilierte Programm wird die Packages eigenständig laden, sobald sie benötigt sind.

Cu,
Udontknow
CenBells Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Mi 09.04.03 09:07 
@Udntknow: Das mit sharemem ist mir bekannt, wird aber definitiv nur für dlls benötigt. Da ist ein weiterer Vorteil von bpls. Das mit den "mit laufzeitpackages aktualisieren" ist mir bekannt.
Genau deshalb will ich ja wissen ob ich die anderen bpls wie vcl und so auch mitliefern muss?

So merkwürdig ist das aber nicht, plugins werden in sehr vielen programmen dynamisch eingebunden. D.H. Das programm schaut am anfang einmal nach, ob ein bestimmtes package da ist, und wenn ja, wird es eingebunden.
Fulltextsearch liefert dazu viele themen.

Gruß
Ken
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 09.04.03 09:28 
Du musst nur die Packages ausliefern, die du unter der Checkbox "mit Laufzeitpackages aktualisieren" angegeben hast.

Für mich gilt : Plugins <> Packages. Ich realisiere z.B. Plugins immer als COM-Objekte.

Hmm, frage ich mal anders herum: Warum willst du LoadPackage benutzen, wenn das Programm selber entscheiden könnte, wann es den Package-Code benötigt?

Als kleines Experiment könntest du ja auch mal anstelle des Parents die Eigenschaft ParentWindow übergeben. Geht es denn dann?

Cu,
Udontknow
CenBells Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Mi 09.04.03 09:41 
Hallo,
ich will das Package mit loadpackage einbinden, damit ich bei Vorhandensein während des Programmstartes die entsprechenden Menuoptionen einbinden kann, die das Modul ansteuern.
Also, ich stell mir das so vor, Programm schaut bei Programmstart im Order Plugins nach, welche vorhanden sind und generiert für ein vorhandenes Package dann jeweils die Menus usw...

Gruß
Ken
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 09.04.03 09:44 
Hallo,
Udontknow hat folgendes geschrieben:
Hmmm, das ist eine merkwürdige Vorgehensweise. Du versuchst, Packages wie eine DLL zu einem bestimmten Zeitpunkt einzubinden... Ob das so klappen kann, da bin ich mir nicht sicher.

das ist absolut möglich und für Plugins natürlich auch notwendig (Ist Pungin XXX vorhanden, dan lade es). Man muss nur anstelle von LoadLibrary LoadPackage verwenden. Einen Artikel zu dem Thema kannst du hier finden: community.borland.co...0,1410,27178,00.html

Gruß
Klabautermann
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 09.04.03 09:55 
Aha. Gut! Also ich denke mal, die Funktion GetClass ist wohl der Kerninhalt, der bei Cenbells fehlt. Das Objekt wird also nicht innerhalb der BPL durch eine Funktion erzeugt, sondern direkt von der Applikation.

Cu,
Udontknow
CenBells Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1547

Win 7
Delphi XE5 Pro
BeitragVerfasst: Mi 09.04.03 14:59 
Hallo,

danke für den hinweis. Ich habe das ausprobiert und nun funktioniert das auch. Aber ich stehe dennoch vor einem problem. Mein PAckage bindet nun die VCL als benötigt ein, bedeutet das nun, daß ich die vcl mit ausliefern muss?

Gruß
KEn
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 09.04.03 15:01 
Ich vermute mal, dass du das nicht brauchst, da die VCL ja direkt zu deinem Programm gelinkt wird. Probiere es doch einfach aus.

Cu,
Udontknow
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 09.04.03 15:30 
Hallo,

wenn ich das richtig verstanden habe kannst du diese Technick nur dann nutzen, wenn du deine Exe mit Laufzeitpackages kompilierst, also keine Packages mit einkompilierst. Das macht auch sinn, weil du ja sonst in jedes Plugin die VCL uns andere verwendete Packages mit einkompilieren müstest. Hierdurch währe das gesammtvolumen deines Programmes wesentlich größer als wenn du die BPL einmal mitlieferst.

Weitere Informationen zu Packages findest du auf folgenden Seiten:

Die Reihenfolge stellte keine Bewertung da (die irgendwann in dieser Reihenfolge in meine Bookmarks gewandert).

Gruß
Klabautermann
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Mi 09.04.03 15:40 
@Klabautermann:

Aber du kannst ja in den Projektoptionen einstellen, welche Laufzeit-Packages nun tatsächlich erst zur Laufzeit verwendet werden! Logischerweise wird all das, was dort nicht erwähnt wird, in die EXE gelinkt.

Cu,
Udontknow
Klabautermann
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mi 09.04.03 15:49 
Udontknow hat folgendes geschrieben:
@Klabautermann:

Aber du kannst ja in den Projektoptionen einstellen, welche Laufzeit-Packages nun tatsächlich erst zur Laufzeit verwendet werden! Logischerweise wird all das, was dort nicht erwähnt wird, in die EXE gelinkt.

Hmmm, eigentlich schon. Aber wenn ich mir das mal angucke und auf dan hinzufügen Knöpfchen drücke, fällt auf, das dort alle die Pfade der bei mir installierten Packages angegeben sind. Man müsste also expliziet welche entfernen.
Ich bin mir mit der oben getroffenen Aussage auch nicht 100% sicher, meine das aber in einem der Texte gelesen zu haben (ist schon 'ne weile her).

Gruß
Klabautermann