Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#4

Re: Zugriff auf Komponenten auf einer Form in einer DLL

  Alt 28. Sep 2005, 18:07
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.
  Mit Zitat antworten Zitat