Frage

Um Singletons und globale Variablen zu vermeiden ich zu einem TFrame Komponentenparameter in der Lage sein möchten, zu übergeben. Da jedoch normalerweise ein TFrame auf Formular zur Entwurfszeit enthalten ist, ist es nur möglich, das Standard-Konstruktor zu verwenden.

Die Mutterform kann natürlich einige Eigenschaften in dem OnCreate Rückruf gesetzt, nachdem die TFrame erstellt wurde. Dies gilt jedoch nicht sicher, dass eine Eigenschaft nicht vergessen wird, und die Abhängigkeiten sind nicht so klar wie ein Konstruktor.

Ein schöner Weg wäre, wenn es möglich ist, eine Fabrik registrieren für die Erstellung von Komponenten während der DFM-Datei gelesen wird. Dann könnten die erforderlichen Parameter an den TFrame Konstruktor übergeben werden, wenn sie von der Fabrik geschaffen. Gibt es eine Möglichkeit, dies zu erreichen?

Oder hat jemand eine bessere Lösung, wie Parameter übergeben an einen TFrame?

War es hilfreich?

Lösung

Alle Komponenten, einschließlich der Nachkommen von TFrame, müssen in der Lage sein, den Konstruktor von TComponent vererbt werden konstruiert werden. Andernfalls können sie nicht richtig zur Entwurfszeit verwendet werden. Wenn die Beschränkung der Entwurfszeit Verwendung für Sie akzeptabel ist, dann können Sie diesen Konstruktor überschreiben und eine Ausnahme ausgelöst. Das würde die Komponente verhindert, dass auf ein Formular zur Entwurfszeit gelegt. Geben Sie einfach einen anderen Konstruktor, die anderen Parameter benötigt.

Aufgrund der Entwurfszeitbedarf, müssen alle Komponenten der Lage sein, mit einigen oder allen ihrer Eigenschaften auf die Standardwerte noch zu existieren. Das bedeutet nicht, die Komponenten, die Dinge zu tun haben, während sie in diesem Zustand sind, aber sie müssen auf unbestimmte Zeit in diesem Zustand bleiben zu können. Es sollte in Ordnung sein, beispielsweise eine Komponente in einem Formular zu platzieren, speichern Sie das Formular, und schließt Delphi, mit der Absicht, die form Gestaltung zu einem späteren Zeitpunkt wieder aufzunehmen. Die Komponente soll selbst gespeichert und wiederhergestellt ermöglichen werden, auch wenn alle seine Eigenschaften noch nicht für die endgültige Verwendung eingerichtet.

Meine bevorzugte Option ist die Komponente, die Regeln nur während der Laufzeit zu erzwingen. Überprüfen Sie, ob alle Eigenschaften auf sinnvolle Werte gesetzt werden, bevor Sie es ihnen ermöglichen, verwendet werden. Sie können Behauptungen verwenden, um die ordnungsgemäße Verwendung Ihrer Komponenten zu erzwingen. Die Verbraucher der Klassen lernen sehr schnell, wenn sie Ihre Komponenten auf ihre Formen nicht beendet haben einrichten.

Andere Tipps

Ich würde normalerweise eine öffentliche, nicht-virtuellen „Initialise“ oder (initialisieren den Amerikanern) Prozedur hinzufügen, die alle Parameter benötigt zur Verfügung gestellt werden. Dies wird dann die Eigenschaften festgelegt.

Machen Sie die Eigenschaften geschützt oder privat, wenn möglich, so dass die einzige Art und Weise können sie eingestellt werden, ist vom Aufruf Initialise (AFoo, ABar: integer).

Dann in TFormXXX.FormCreate oder TformXXX.Create haben:

inherited;
Initialise(foo, bar);

könnten Sie Ihre eigene TFrame Komponente erstellen / registercomponent und Ort, der auf dem Formular -. es schaffen könnte alles übergeben, um es hat

Wenn eine Fabrik könnten die Parameter, die Sie benötigen, warum Sie nicht nur den Standard-Konstruktor für Ihren Rahmen außer Kraft setzen, und fragen Sie die Fabrik-Klasse für die Parameter?

ich in der Regel meine eigenen Konstruktor machen. Ich mag es nicht sowieso Frames zur Entwurf erstellen.

a) kann ein Rahmen dynamisch erstellt werden, wenn erforderlich, und zerstört, wenn sie nicht benötigt

b) gibt dem Rahmen eine öffentliche Eigenschaft entweder mit dem Parameterdatentyp oder einer Datenstruktur, und die Werte in die Form durch die Eigenschaft übergeben.

Beispiel:
TAddress - eine Klasse die üblichen Elemente einer Adresse halten
. TAddressFra - ein Rahmen mit den visuellen Kontrollen die Adresse anzuzeigen

  • bevölkert eine Instanz von TAddress mit Werten
  • Erstellen Sie eine Instanz TAddressFra
  • weisen Sie die TAddressFra.address Eigenschaft mit der TAddress Instanz
  • verwenden Sie die Prozedur setAddress(o_address : TAddress) die Werte zugewiesen werden von der TAddress zu den entsprechenden visuellen Komponenten auf dem TAddressFra Attribute
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top