| Autor |
Beitrag |
CenBells
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: 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
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.
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
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.
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 
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: 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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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 
      
Beiträge: 1547
Win 7
Delphi XE5 Pro
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: 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
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: 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
|
|