![]() |
Form laden
Hallo zusammen,
ich bschäftige mich seit einiger Zeit mit Lösungsmöglichkeiten für folgenden Anwendungsfall: Ich möchte meine künftige Applikation so aufbauen, dass diese im Grunde nur ein "Container" für weitere Programmfunktionalitäten ist. In dem Programm wird ein Berechtigungssystem abgebildet, welcher User welchen Zugriff auf welche Funktionen hat. Zudem ist noch eine Reporting-Funktionalität enthalten, die sich aber auf die zugrunde liegende Datenbank bezieht. Die gesamten angesprochenen Funktionalitäten möchte ich komplett auslagern. Dafür gibt es aus meiner Sicht 2 Gründe: a) Wartbarkeit der einzelnen "Module" und b) Erweiterbarkeit. Man stelle sich den Grundsätzlichen Anwendungsaufbau so vor: Hauptformular mit einem Treeview links, der die durch das Berechtigungssystem freigeschalteten "Module" anzeigt und rechts einen freien Fensterbereich (bzw. ein Panel), in dem das jeweilige Modul angezeigt werden soll. Anforderungen meinerseits ist: Das Hauptprogramm soll von der Art der zu ladenden Forms und deren individuellen Funktionalitäten keine Kenntnis haben müssen. Man wählt also im TV eine Funktion aus, daraufhin wird das Modul geladen, angezeigt und steht funktional zur Verfügung. Was ich mir wünsche:
Delphi-Quellcode:
Ich habe bisher die Möglichkeiten von Formularen in DLLs und Packages gefunden. Nur leider wurde das Thema, was mich interessiert, überall nur kurz angerissen.
ShowModule('Modulname',iUserID)
Habt ihr evtl. einen für meine Fragestellung passenden Lösungsansatz? Gruß Igotcha |
Re: Form laden
Hier in der DP gibts eine Menge dazu ...
Ich finde das Plugin-System von Sakura absolut Klasse. Du musst es natütlich deinen Bedürfnissen anpassen, so das z.B. die Plugins automatisch registriert werden und für den Aufruf z.B. Actions bereitgestellt werden, die du dann dynamisch in dein Programm einbinden kannst ... ![]() :hi: |
Re: Form laden
Da habe ich schon drübergeschaut, hat mich aber nicht wirklich weitergebracht, da ich bisher keine Antwort gefunden habe, ob mein Vorhaben in der Form überhaupt möglich ist.
Du sprichst u.a. genau das an, worüber ich mir noch nicht im Klaren bin. Ich will ja gerade erreichen, dass mein "Programm-Container" eben gerade nichts über das zu ladende Modul wissen muss, da sämtliche Funktionalität in diesem enthalten ist. Beispiel: Der Anwender wählt im Modulbaum z.B. "Adressverwaltung" aus. Dann soll das Modul "Adressverwaltung" in das Hauptprogramm geladen werden. In dem Modul "Adressverwaltung" ist sämtliche Funktionalität vorhanden, die zur Verwaltung von Adressen notwendig ist (Datenbankanbindung, Anzeige, Buttons mit Funtionen, etc.). Also ein "Modul" soll bei mir eine komplett eigenständige Komponente sein - das Hauptprogramm muss mit dieser nicht interagieren (also keine Rückgabewerte empfangen, o.ä.), sondern dient quasi nur als "parent". Um es mal plakativ zu sagen, ich möchte praktisch eine EXE innerhalb einer EXE darstellen ;-) Gruß Igotcha |
Re: Form laden
Genau das kannst du damit machen.
Dein Programm muss doch aber eine dynamische Registrierung der Plugins dürchführen, um die richtigen Menüeinträge für die vorhandenen Plugins anzuzeigen und um die Funktion z.B. "ShowModule(GetPluginIdByName(MenuItem[nn].Caption),iUserID)" für das gewünschte Plugin starten zu können. Du kannst doch beim Starten deines Programms das Plugin-Verzeichnis durchsuchen lassen. Für jedes "poteltielle" Plugin >RegisterPlugin< aufrufen und bei Erfolg die Menuitem-Eventhandler (oder besser Actions) dynamisch in dein Programm einbinden ... Ich bin total Zufrieden mit Sakuras Plugin-System ... (Wird auch brav in jeder About-Box erwähnt :dp: ) Das Einzige was sich meine Plugins mit dem Hautpprogramm "teilen" ist die AdoConnection, damit das Programm nicht bei jedem Plugin-Aufruf eine neue DB-Anmeldung machen muß. Wichtig ist, das die gemeinsame Unit möglichst von Anfang an ein gutes Konzept hat, und nicht für jedes Plugin verändert werden muß ... Schöne Grüße :hi: |
Re: Form laden
Zitat:
Zitat:
Sagen wir mal die Anwendung wird mit dem aktuellen Stand an Modulen ausgeliefert (z.B.10 Stück). Beim Anwender liegen alle 10 Module im Verzeichnis "Modules". Wenn der Anwender das Hauptprogramm startet, wird im Hauptprogramm sein "Menübaum" aufgebaut, der sich aus dem Berechtigungssystem in der Datenbank ergibt (das Verzeichnis "Modules" bzw. was darin ist, wird nicht beachtet, da sowieso alle Module darin vorhanden sind). Abhängig vom Menübaum kann der Anwender aber nur die Module laden, die für ihn freigeschaltet sind. Gibt es mal ein neues Modul, wird dieses a) in der Datenbank eingetragen und b) in das Anwender "Modulverzeichnis" kopiert - anschließend muß der Anwender in der DB noch für das Modul berechtigt werden. Ist also ein andere Weg wie bei z.B. Photoshop, wo man Plugins in ein Verzeichnis kopiert und PS bei jedem Start erstmal schaut, welche Plugins in dem Verzeichnis eigentlich vorhanden sind. Ich brauche an dieser speziellen Stelle nach meiner Ansicht, also weniger "Verwaltungskram". EDIT: Vielleicht suche ich auch gar kein "Plugin-System", sondern einfach nur eine Möglichkeit, Formulare mit in sich abgeschlossenen Funktionalitäten in meine Hauptanwendung zu laden. Evtl. ist das auch der ursprünglich angesprochene Grund, warum ich bisher zu meiner Fragestellung nie so recht fündig wurde. Deshalb noch mal kurz meine Anforderungen: Ich möchte mir in der IDE ein Formular bauen mit allem Drum und Dran (Toolbar, Datensensitive Komponenten, Visuelle Komponenten, etc.). Dieses als "irgenetwas abspeichern und in einer anderen Anwendung einfach nur anzeigen, um in dieser Hauptanwendung dann mit diesen "Plugin-Formular" zu arbeiten. |
Re: Form laden
Liste der Anhänge anzeigen (Anzahl: 1)
Ich bin echt am verzeifeln und bekomme es nicht gebacken...
Deshalb habe ich mal ein Minimalprojekt abgehängt, welches aus der DLL mit der Form und der "Haupt-Applikation" mit dem Panel besteht, in welchem die DLL-Form angezeigt werden soll. Evtl. kann mir ja jemand auf die Sprünge helfen. Danke und Gruß Igotcha |
Re: Form laden
Liste der Anhänge anzeigen (Anzahl: 1)
Dein Hauptpromlen war, das du die dllForm erstellst und die DLL sofort wieder entlädst.
Habe die mal eine funktionierende Version (ohne den unschönen Umweg über ShowModal) drangehängt ... Schau es dir mal an ... :hi: Jens |
Re: Form laden
Liste der Anhänge anzeigen (Anzahl: 1)
Vielen Dank!
Das ist zumindest eine technisch saubere Lösung. Aber genau so hatte auch einer meiner Versuche vom Ergebnis her ausgesehen. ich habe mal einen Screenshot beigefügt, wie das Ganze unter XP aussieht. Man beachte den rechten und unteren Fensterrand da, wo die Form eingebettet wurde. Die eingebette Form ist, obwohl "alclient" größer als das Client-Panel. Wenn wir das noch richtig hinbekommen, habe ich zumindest einen Anfang ;-) Viele Grüße Igotcha |
Re: Form laden
Liste der Anhänge anzeigen (Anzahl: 1)
Habe nochmal einen anderen Screenshot mit einer zusätzlichen Statusbar und einem Panel hinzugefügt. Hoffe, man sieht das Problem da besser.
Die in Panel1 eingebettete dllForm ist auf "alclient" gesetzt, das Panel als Parent. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:44 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-2025 by Thomas Breitkreuz