Suche mal nach "Forms in Packages" oder so.
Nur kurz: benutzt du Packages erledigt sich das ganze Problem. Packages + EXE mit Packages + Formular DLLs mit Packages stellen sich im Speicher so dar als wären sie aus einem Guß, als wäre es eine single EXE.
Du baust also deine EXE um damit sie Packages benutzt.
Du baust dir ein Main.bpl Packages in das du alles reinpackst was Modulübergreifend gemeinsam benutzt werden soll, also Modulsystem, Hauptformular, Druckassistent usw.
Du baust nun deine Formulare in separate
DLL's die weiderum mit Packages arbeiten und da sie das
Package Main.bpl ebenfalls benutzen haben sie sogar noch wahlfreien und sauberen Zugriff auf die Hauptanwendung.
Nun gilt es aus deiner Sicht den Resourcenverbrauch abzuschätzen. Du musst ja nun zu deiner Anwendung auch alle Packages mit installieren die du benutzt hast. Es gibt also einen berechnenbaren Breakeven Point ab dem dein Packages basiertes Konzept nicht nur sauber sondern sogar weniger Festplattenplatz und Hauptspeicher benötigt.
Pi * Daumen:
Packages ca. 5Mb
EXE ca. 40Kb
jedes Form Modul ca. 100Kb.
Bei deiner jeztigen Lösung linkt der Compiler alles was in den Packages ist und im jeweiligen Modul benutzt wird statisch in dieses Modul ein. Ich schätze mal pro
DLL Forumular kommst du so auf ca. 600Kb Größe der
DLL.
Also EXE ~ 600Kb, + jedes weitere
DLL Form 600Kb.
Bei 9 solchen Forms also 10 * 600 = 6.00Mb.
Mit Packages 5Mb + 80Kb + 9 Forms * 100Kb = 5.98Mb.
Also nicht nur im Resourcenverbrauch sondern auch in der Schnittstellensicherheit und Ergonomie in der Entwicklung sind Packages überlegen.
Wie baust du nun deine unterschiedlichen Formulare ?
Nicht per INI, nicht externen Form Designer oder so'n Popelkram, sondern mit Delphi. Also ganz einfach eine neue
DLL erzeugt, Compileroptionen mit Packages kompilieren, deine Funktion CreateForm() exportieren, und deine Form
Unit in die
DLL einbinden, fertig.
Du benutz kein ShareMem da Packages benutzt werden. Du kannst auf ALLE Klassen die in Packages deklariert wurden und in den Module gemeinsam benutzt werden, ohne Probleme wie gewohnt in deinem Source zugreifen.
Du kannst aber NICHT auf diejenigen Klassen die du in den Form-DLLs deklariert hast gemeinsam zugreifen. Die sind quasi private zu den DLLs. Du kannst aber auf deren Basisklassen, solange diese in Packages deklariert wurden, wieder zugreifen.
So, ansonsten suche hier im Forum, ich habe das nämlich schon wirklich 100'erde Male erklärt ;=)
Ach übrigens, deine exportierte CreateForm() Funktion kannst du sogar noch eliminieren,sie ist nicht mehr notwendig. Wichtig ist nur das eine solche Form-
DLL beim Laden der Hautanwendung mitteilt welche Formulare + Klassen in dieser
DLL enthalten sind. Die geht ganz einfach indem du in der "initialization" Sektion deiner Form
Unit eines Procedure RegisterForm(TMyForm) aufrufst. Der Trick dabei ist diese Procedure RegisterForm() in ads gemeinsam benutzte
Package Main.bpl auszulagern. So wie RegisterClass() der
VCL arbeitet kannst du nun RegisterForm() aufbauen und so in der Hauptanwendung eine Liste der erzeugbaren Formularklassen der geladenen
DLL's aufbauen. Dies Liste kannst du später natürlich auch erweitern, zb.
DLL Dateiname zur registrierten TForm Klasse und somit auch in eine Datei speichern. Dies ermöglicht die dann später diese Liste aus der Datei zuladen und somit bei Erzeugung einer
DLL Form Klasse deren
DLL vorher dynamisch zu laden. Es läuft also darauf hinaus das die
DLL Form nur noch ein toter Kontainer ist der die Form Resource + die privaten Klassen + den Code zum Form enthält. Die Erzeugung eines solchen Forms liegt aber wieder in der Hand der Hauptanwendung, ergo: das Konzept der Schnittstelle ist wieder Top-Down und nicht vermischt.
Uff
Gruß Hagen
PS: ich bin Freelancer und eines meiner Verkaufsprojekte ist exakt ein solcher Frame, mit Benutzerverwaltung, dynamischer Anbindung an beliebige Datenbanken und Reportgeneratoren, mit über Komponenten konfigurierbarem Registrationssystem der Formulare in
DLL's und der Veraltung des Menusystemes etc. pp. D.h. bei meinem Frame klatscht du einfach eine Komponente auf dein TForm der
DLL und stellst dort alles ein was nötig ist. Diese Daten werden offline und online beim Modulssystem registriert und stehen später nachgeladen zu Verfügung um die Formulare und deren
DLL's dynamisch auf Nutzeranforderung zu laden, alles ist transparent.
Und, ich verkaufe diesen Frame bzw. auch die Dienstleistung einen eigenen Frame neu zu entwicklen, cool was.
Wenn du also Interesse hast dann mail HaReddmann at T-Online dot de.