AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Klassen variabel (z.B. aus Datenbank heraus) registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Klassen variabel (z.B. aus Datenbank heraus) registrieren

Ein Thema von mcinternet · begonnen am 29. Mai 2019 · letzter Beitrag vom 6. Jun 2019
Antwort Antwort
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#1

Klassen variabel (z.B. aus Datenbank heraus) registrieren

  Alt 29. Mai 2019, 08:49
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
Jörg
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.186 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Klassen variabel (z.B. aus Datenbank heraus) registrieren

  Alt 29. Mai 2019, 09:02
Hi mcinternet

Ich bin nicht sicher, ob ich dich richtig verstanden habe, aber schau dir doch das oder dies mal an.

Zitat:
Am liebsten würde ich mit der Uses-Klausel ähnlich verfahren, aber ich glaube, das ist nicht möglich?
Nein. Die Usesklausel informiert den Compiler darüber, welcher Code sonst noch zum Programm gehört, also zum Bleistift die Unit Faa.
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor (29. Mai 2019 um 09:17 Uhr)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Klassen variabel (z.B. aus Datenbank heraus) registrieren

  Alt 29. Mai 2019, 11:32
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
Was Du aus der Datenbank holen kannst sind die Namen der Klassen als String, nicht war? Was Du dann brauchst ist eine Methode, um aus diesem String eine Referenz auf die Klasse (zur Laufzeit) zu erzeugen. Das sollte mit Hilfe von extended RTTI möglich sein.

Delphi-Quellcode:
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;
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.

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.
Peter Below
  Mit Zitat antworten Zitat
mcinternet

Registriert seit: 22. Apr 2010
Ort: Odenwald
193 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Klassen variabel (z.B. aus Datenbank heraus) registrieren

  Alt 6. Jun 2019, 11:38
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
Jörg
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz