![]() |
Klassen variabel (z.B. aus Datenbank heraus) registrieren
Hallo die Gemeinde,
ich habe in einem Projekt eine ganze Latte an Klasse zu registrieren: registerclass(TFrmxyz...) Nun meine Frage: kann man dieses über Variablen steuern? Ich würde die Klassen gern aus einer DB als "Liste" einlesen, weil immer nur die Formulare generiert werden, die für diesen User zugelassen sind. Am liebsten würde ich mit der Uses-Klausel ähnlich verfahren, aber ich glaube, das ist nicht möglich? Beste Grüsse mcinternet |
AW: Klassen variabel (z.B. aus Datenbank heraus) registrieren
Hi mcinternet
Ich bin nicht sicher, ob ich dich richtig verstanden habe, aber schau dir doch ![]() ![]() Zitat:
Wenn du nun auf die Klasse Foo in der unit Faa zugreifst, wird diese zum bestehenden Programm eincompiliert. Aber in diesem Fall eben nur Code der Klasse Foo und nicht die komplette Unit Faa. Gruss Delor |
AW: Klassen variabel (z.B. aus Datenbank heraus) registrieren
Zitat:
Delphi-Quellcode:
Das Problem ist hier, dass FindType einen "qualified name" erwartet, d.h. eine Kombination aus Unit und Klassennamen, separiert durch einen Punkt. Wenn Du also in der Datenbank nur die Klassennamen abgelegt hast wird es etwas aufweniger. Dann mußt Du über TRttiContext.GetTypes die Liste aller bekannten Typen holen (und das sind Tausende!) und Dir die benötigten selbst in der Liste suchen. Nicht gerade flott, aber das machst Du ja nur einmal, beim Start der Anwendung.
procedure TForm1.RunTest;
var LContext : TRttiContext; LType : TRttiType; begin LContext := TRttiContext.Create; try LType := LContext.FindType(self.QualifiedClassName); if LType.IsInstance then memo1.lines.Add('Found: '+LType.QualifiedName) else memo1.lines.Add(Classname + ' not found'); finally LContext.Free; end; end; Ansonsten gibt es noch die self-made Lösung: Bau deine eigene Klassenliste (basierend auf TClasslist oder TList<TClass>). Das wäre ein Singleton-Object, in das jede Formunit in der Initialisation-Sektion ihre Formklasse registriert. Dann brauchst Du später nur noch in dieser Liste suchen. Was Du aber nicht vermeiden kannst, ist alle Forms (um die geht es ja wohl hier) auch in die Anwendung einzubinden, egal ob sie später gebraucht werden oder nicht. Rtti wird halt nur für Typen erzeugt, die auch einkompiliert werden, und das gleiche gilt für Unit-Initialisations. Wenn Du wirklich auch nur ausliefern willst was der Kunde verwenden darf brauchts Du ein anderes Design der Anwendung. In diesem Fall muss die Anwendung auf Packages basieren, wobei kundenspezifische Teile der Anwendung in eigenen Packages untergebracht werden, die dann zur Laufzeit dynamisch geladen werden. Wenn Du bisher kein solches Design verwendet hast und die Anwendung praktisch schon existiert ist die Umarbeitung ein erheblicher Aufwand, und auch die Auslieferung wird komplexer, da Du jede Menge Packages (RTL, VCL, 3rd-party) mit installieren musst. Packages sind all or nothing, und da jede Unit nur in einer der Packages vorkommen darf erfordert die Aufteilung existierenden Kodes eine Menge Planung und Vorarbeit, besonders bei schlampig gebauten RAD-Anwendungen mit vielen wechselseitigen Abhängigkeiten zwischen Units. |
AW: Klassen variabel (z.B. aus Datenbank heraus) registrieren
Ich sehe schon, das Ganze sprengt dann den Rahmen.
Ich werde es dabei belassen, die Klassen per registerclass einzutragen. Vielen Dank und beste Grüße mcinternet |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 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