![]() |
Runtime-Packages, visual inheritance, Updaten der Runtime-Packages ohne exe-Update
Hallo,
ich arbeite gerade an einem größeren Projekt, bin noch ziemlich am Anfang. Jetzt bin ich gerade auf Runtime-Packages als Alternative zu DLLs gekommen. Konkret hat mich das hier inspiriert: ![]() Dort wird gezeigt wie man eine Form aus einem zur Laufzeit dynamisch geladenen Package benutzen kann. Ein Chapter zuvor wird davor gewarnt, dass die exe neu compiliert werden muss, wenn in den Interface-Abschnitten der Units in den Packages etwas verändert wird: ![]() Ich gehe mal stark davon aus, dass diese Warnung nur auf statisch gelinkte Runtime-Packages zutrifft. Nun zu meiner eigentlichen Frage: Ich habe vor in meiner exe eine von TForm abgeleitete Basisklasse zu definieren und diese in verschiedenen Packages verschieden zu spezialisieren (mittels visual inheritance). Aus der exe heraus erfolgt der Zugriff ausschließlich auf die Elemente (Methoden, Eigenschaften etc.) der Basisklasse, die exe weiß nichts von der Spezialisierung. Unter diesen Voraussetzungen kann ich doch nun ohne weiteres während der Laufzeit der exe solch ein Package entladen, die Package-Datei updaten, neu laden, die Form wieder instanzieren (über eine Klassenvariable, siehe Quelltextbeispiel unten) und anzeigen.
Delphi-Quellcode:
Da ich noch an weiteren Stellen erst einmal herausbekommen muss, wie so etwas tatsächlich gemacht werden muss (z.B. Einstellungen in Delphi etc.), möchte ich gerne im Vorfeld hier klären, ob das Vorhaben so machbar ist, oder ob es von vornherein zum Scheitern verurteilt ist. Wenn ich mich damit bereits auskennen würde, würde ich es natürlich selbst mal schnell austesten ;-)
var
FormSpez: TForm; FormClass: TFormClass; HandlePack: HModule; begin // try to load the package HandlePack := LoadPackage('PackWithForm.bpl'); FormClass := TFormClass(GetClass); FormSpez := FormClass.Create(Application); FormSpez.ShowModal; FormSpez.Free; UnloadPackage(HandlePack); MfG RSE |
AW: Runtime-Packages, visual inheritance, Updaten der Runtime-Packages ohne exe-Updat
Eigentlich machen Runtime packages nur für ein Programm Sinn: die Delphi IDE.
Die drakonischen Einschränkungen, die du dir damit aufhalst lohnen sich einfach nicht. Du musst nämlich
Wenn du deine Binaries aufteilen willst, dann kannsu das mit DLLs und Interfaces machen. Aber in Delphi ist es ziemlich einfach eine große Echse zu erzeugen, egal in wievielen Packages man den Source verteilt hat. Sollten halt bloß keine Runtime-Packages sein. Du wirst dich sonst nämich ständig dabei erwischen, komplett alle Packages neu verteilen zu müssen. Weil du zwar nur ein paar Kleinigkeiten geändert haben magst, aber da ihr auch ein Hotfix (mit RTL Fixes) in eurem Delphi installiert habt, sind alle Packages invalidiert. Das Argument mit den kleineren Update-Downloads ist IMO nur ein theorethisches. |
AW: Runtime-Packages, visual inheritance, Updaten der Runtime-Packages ohne exe-Updat
@Elvis: Wir benutzen Delphi XE, ich wüsste nicht, was es da für Updates an der RTL geben sollte, vielleicht geht da aber auch was an mir vorbei. Die drakonischen Einschränkungen, die du aufführst, sind mit einer Projektgruppe leicht zu regeln.
Das Programm stellt Callaktionen für ein Callcenter bereit. An der Grundfunktionalität wird sich also äußerst selten etwas ändern. Auch die Callaktionen sind sich sehr ähnlich (die Basisklasse aus meinem ersten Post). Was sich allerdings mehrfach täglich ändern kann, sind die Spezialisierungen - die Callaktionen selbst. Der Vorteil, den ich mir durch die Runtime-Packages verspreche ist der, dass das Programm nicht neu gestartet werden muss, um die Callaktion zu aktualisieren. Die exe kann sogar selbst auf Aktualisierungen prüfen und diese ungefragt aus unserem lokalen Netz downloaden. Inzwischen habe ich mich natürlich weiter informiert und bin auf ein anderes Problem gestoßen: Die Spezialisierung der Basisklassen geschieht über Visual Form Inheritance (VFI). Das ist aber nur möglich, wenn die Basisklassen in einem eigenen Package sind und statisch geladen werden. ![]() Wenn ich das richtig verstanden habe, gibt es 3 Arten, ein Package einzubinden:
Aktuell bin ich am Suchen, wie ich Packages als statische Runtimepackages einbinden kann. In der exe scheint das in den Projektoptionen auf der Seite Packages der untere Teil zu sein. Ich weiß allerdings nicht, ob die Checkbox "Laufzeit-Packages verwenden" bewirkt, dass ich alle dort bereits eingetragenen Packages als Laufzeit-Packages mitliefern müsste. Zweites Problem: Der untere Bereich ist bei Packages grau. |
AW: Runtime-Packages, visual inheritance, Updaten der Runtime-Packages ohne exe-Updat
Zitat:
Die Units aus den Packages, die du dynamisch laden willst, dürfen im Source nicht verwendet werden. |
AW: Runtime-Packages, visual inheritance, Updaten der Runtime-Packages ohne exe-Updat
Zusätzlich zu den verwendeten bpl gibt es noch versteckte BPL Abhängigkeiten. Das führt dazu, dass ein Delphiprogramm noch eine Reihe bpl beim Start verlangt,
die im Programm selbst garnicht verwendet werden. In meinem Projekt waren das so um die 70 bis 80 bpl, die zusätzlich mitgeliefert werden mussten. Fehlende oder geänderte bpl merkt man erst beim Kunden, da hier erst die isolierte Umgebung vorhanden ist. Also vor der Auslieferung in einer delphifreien VM testen, ob das Programm startet. Dann beten, das kein weiteres Delphiprogramm auf dem gleichen Rechner bpl benötigt. Das muss nicht mal mit unterschiedlichen Delphi-Versionen compiliert sein. Das bpl Konzept ist antiquiert und verursacht nur Ärger. Wenn wirklich Modular, dann entweder dll und Interface oder Com-Technologie. Eine große Exe und Schluss oder eine kleine Exe und 80 bis 90 bpl die versioniert überwacht und updatet werden müssen, was ist besser? Ich habe runtime bpl zwischenzeitlich aus allen Projekten wieder herausgeworfen, da Nutzen und zusätzlicher Aufwand in keinem Verhältnis stehen. Gruß Peter |
AW: Runtime-Packages, visual inheritance, Updaten der Runtime-Packages ohne exe-Updat
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Es gibt übrigens noch ein anderes Beispiel, wo das Package-Konzept erfolgreich für einen modularen, dynamischen Aufbau verwendet wird: FinalBuilder! |
AW: Runtime-Packages, visual inheritance, Updaten der Runtime-Packages ohne exe-Updat
Vielen Dank für das Aufweisen der Stolperfallen. Mein Ziel ist es nicht, die Größe des Gesamtprogramms zu verringern, sondern zu modularisieren und Module zur Programmlaufzeit updaten zu können.
Habe ich denn die 3 verschiedenen Arten, Packages einzubinden, oben korrekt wiedergegeben? Wieso kann ich ein Package nicht statisch in ein anderes linken? Würden sich die vielen (80-90???) benötigten BPLs nicht als Designtime-Packages einbinden lassen (so wie in eine "normale" exe)? |
AW: Runtime-Packages, visual inheritance, Updaten der Runtime-Packages ohne exe-Updat
Zitat:
Design-Time-Packages werden ausschlieslich von der Delphi-IDE geladen und benützt. Sehr häufig benützt das Design-Time-Package ein Runtime-Package damit Komponenten innerhalb der IDE "leben" können. Es gibt aber auch Design-Time-Packages, die ganz ohne Runtime-Packages daherkommen. Sie enthalten sog. "Experten" also Erweiterungen der Delphi-IDE. Nur Runtime-Packages können später in Anwendungen benützt werden. |
AW: Runtime-Packages, visual inheritance, Updaten der Runtime-Packages ohne exe-Updat
Zitat:
|
AW: Runtime-Packages, visual inheritance, Updaten der Runtime-Packages ohne exe-Updat
OK, das mit den Packages hab ich jetzt verstanden. Die wichtigste Frage bleibt aber offen. Wie ich oben verlinkt habe, kann ich nur visuell von einer Form ableiten, wenn die Basisklasse im gleichen Modul definiert ist oder statisch ins Modul gelinkt wird. Die Compiler-Option des statischen Linkens ist aber bei Packages deaktiviert. Kann ich also in Packages grundsätzlich keine visuelle Ableitung von einer außerhalb des Packages definierten Klasse vornehmen? Damit würde mein ganzer Ansatz nicht mehr aufgehen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz