![]() |
Entkoppeln von Forms
Ich würde gern die Erzeugung von Forms entkoppeln. Wenn also FormA ein FormB erzeugt, möchte ich nicht, dass in FormA ein uses FormB steht. FormB soll sich irgendwo registrieren und von dort soll FormA ihn anfordern können.
Erreichen möchte ich, dass zB für Testzwecke ein anderer FormB sich registriert und ich aber am FormA gar nichts ändern muss. Aber weder Generics noch Factories machen mich so richtig glücklich :-/ Am ehesten kommt eine Liste aus "FormName" und "FormInstanz" hin, wo sich FormB einträgt und wo FormA sich über den Namen die Instanz abholen kann. Aber irgendwie gefällt mir das auch nicht. Hat wer eine elegante Idee oder kreative Vorschläge? |
AW: Entkoppeln von Forms
Das ist aber wirklich sehr stark Geschmackssache.
Ganz pragmatisch: Wie wäre es mit einer gemeinsam genutzten Unit, die eine globale Variable vom Typ
Delphi-Quellcode:
enthält? Simpler geht's glaub ich nimmer.
TFormClass
Delphi-Quellcode:
unit CommonGlobals;
interface var MyFormClass: TFormClass = nil; implementation end. |
AW: Entkoppeln von Forms
FormB kann sich nirgends registrieren, solange es nicht instantiiert ist. Du scheinst da konstruktivisch ein Henne-und-Ei-Problem zu haben. Theoretisch kannst du dir eine Manager-Unit anlegen, darin ein TDictionary<string, TCustomForm> sowie eine globale Variable, die du im initialization-Abschnitt instantiierst. Ebenso über initialization kannst du auch in den Units deiner Sekundär-Forms verfahren und dann gleich in die globale Variable der Manager-Unit ablegen.
Elegant sieht aber anders aus ^^ |
AW: Entkoppeln von Forms
Zitat:
|
AW: Entkoppeln von Forms
Das mit den Instanzen stimmt natürlich + war "schlampert" von mir. Sollten besser die Klassentypen sein.
Ich könnte einen FormManager machen, ein Dictionary aus Name+TFormClass Dann könnte FormA sowas wie FormManager.CreateAndShow('FORMB') machen. Der FormManager sucht nach 'FormB', findet als Klassentyp TFormB + erzeugt dann TFormB. Wie könnte das gehen? |
AW: Entkoppeln von Forms
Zitat:
Ähnliche Probleme habe ich kennengelernt, als es darum ging, Forms in DLLs auszulagern. Die wurden dann durch Installer per Registry mit dem Programm verknüpft und zur Laufzeit nachgeladen. Möglicherweise geht das Projekt ja in eine solche Richtung. |
AW: Entkoppeln von Forms
Also entweder habe ich etwas falsch verstanden oder was du willst ist ein völlig legitimes (und hier auch super passendes) Dependency Injection über einen "Inversion of Control"-Container.
Zitat:
![]() Bei mir war das erste mal im Delphi-Land etwas ähnliches: Benutzer-Eingaben von Text oder Zahlen fanden über große, touch-freundliche Popups statt. Für Remote-Support über TeamViewer oder an Desktop-Rechnern sollten es aber lieber die gewohnten Eingabe-Dialoge (Vcl.InputQuery(..) oder so) sein. Was lag hier näher als eine zentrale Anlaufstelle
Delphi-Quellcode:
(oder so ähnlich). Je nach Konfiguration bekommt man zur Laufzeit das passende Eingabe-Popup. Das Formular (FormA) weiß überhaupt nicht ob es nun ein FormB oder FormC oder sonstwas bekommt, es muss es nicht kümmern. Es fordert ein ITextInput an, es bekommt das passende, es arbeitet damit, gut ist.
TInputPopup.CreateTextInput(): ITextInput
Wenn dir das alles noch gar nichts sagt macht der folgende Artikel das vielleicht schmackhaft: ![]() Der Autor ist auch der Mann hinter "Spring4D" das auch einen DI-Container mitbringt. Man braucht ein paar Minuten für die ersten Schritte, danach kann man nicht mehr ohne. Ich würde auch gleich das neulich erschienene ![]() |
AW: Entkoppeln von Forms
Wie sagt man so schön: Been there. Done that. :- )
Das löst mein Problem nicht, weil die Forms Creatables + nicht Injectables sind. Und ich möchte sie eben nicht alle zu Beginn erzeugen + dann via DI weiterreichen. |
AW: Entkoppeln von Forms
Vielleicht bin ich schon zu lange im Urlaub, aber was genau soll das Problem sein? Weshalb solltest du Instanzen der Formulare zu Beginn erzeugen müssen? Was ist ein Creatable und was ein Injectable?
Container wie Spring bieten auch an, z.B. Klassen als Singletons registrieren zu können und man bekommt dann, wenn man den Typ (bzw. Schnittstelle anfordert) die entsprechende Instanz. Vielleicht habe ich auch die Frage noch nicht verstanden, es hörte sich zumindest für mich genauso an wie mein Fall mit z.B. den Input-Popups. |
AW: Entkoppeln von Forms
Weil DI wie der Name sagt das Übergeben einer Abhängigkeit ist. Mein FormA müsste also FormB "injected" bekommen. Dann hilft der DI-Container.
Aber wie hast du das mit deinen Input-Popups gelöst? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 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