2009-07-28 4 views
2

Ich versuche, mehrere "Bäume" im Speicher zu erstellen, und später einer von ihnen einem TTreeView-Steuerelement zuzuweisen, mit dem der Benutzer interagieren kann. Ich kann jedoch keine TTreeNodes-Objekte erstellen, ohne einen Zeiger auf ein vorhandenes TTreeView zu übergeben. Das Übergeben von NIL verursacht AVs.Warum ist Delphi TTreeNodes grundsätzlich an TCustomTreeView gebunden?

Zwei Fragen: - Was ist der Grund für diese "harte" Verknüpfung zwischen TTreeNodes und TTreeViews, und, was ist der beste Weg, um das Problem zu lösen?

Einige Optionen kann ich sehen, sind:

  • pflegen Struktur meine eigenen Baum ohne TTreeNodes und dynamisch Aufbau der TTreeNodes nach Bedarf.
  • Mit mehreren unsichtbaren TTreeView Objekte, die nur verwendet werden, um die TTreeNodes Zeug arbeiten.

.. aber ich habe keine Vor-und Nachteile für diese abgewogen.

+0

Ich habe den Tagwechsel zurückgesetzt. Dies ist keine Frage über generische Baumknoten, sondern * speziell * über das Verhalten der Delphi "TTreeNodes" -Klasse. – Roddy

Antwort

4

Es gibt eine Menge Code in TTreeView und den zugehörigen Klassen, um die Verbindung zwischen den Delphi-Objekten und der zugrunde liegenden Windows-Steuerung synchron zu halten. Wenn Knoten direkt über Fenstermeldungen hinzugefügt werden, muss das Delphi-Objekt diese Änderung widerspiegeln, sobald Sie das nächste Mal fragen, wie viele Knoten es zum Beispiel hat.

TTreeView ist ein Wrapper für die Windows-Steuerung, und TTreeNodes und TTreeNode sind einfach Teil dieses Wrappers. Sie implementieren nicht wirklich alle Baumoperationen, die die Steuerung ausführt. Bestimmte Operationen sind ungültig, wenn derzeit keine Windows-Steuerung verfügbar ist.

TTreeView ist eine visuelle Kontrolle. Wenn Sie nichts zu visualisieren haben, dann ist es nicht die Kontrolle für Sie. Wenn Sie mehrere Strukturdatenstrukturen haben und nur ein Struktursteuerelement verwenden möchten, müssen Sie die Strukturknoten zerstören und neu erstellen, wenn Sie zu einer anderen Struktur wechseln. Das Steuerelement bietet nicht einmal eine Möglichkeit, bestimmte Knoten vorübergehend zu verbergen.

Das könnte Sie interessieren: Mike Lischke's virtual tree control. In seiner beabsichtigten Verwendung verwalten Sie die Baumdatenstruktur selbst; das Steuerelement ist nur eine Visualisierung. Es fragt Sie, wie viele Kinder jeder Knoten hat, und dann fragt er Sie, was der Text jedes Knotens jedes Mal ist, wenn er diesen Knoten zeichnen muss.Es wurde verwaltet, welche Knoten erweitert, ausgewählt, überprüft oder sichtbar sind, Sie verwalten jedoch alle Daten. Es ist free and open-source.

+1

+1 für virtuelle Baumansicht Komponente. Probieren Sie es aus, lernen Sie es, lieben Sie es :) – DiGi

2

Der (Haupt) Grund würde wahrscheinlich verhindern, dass Sie eine TTreeNode in mehr als 1 TTreeview erscheinen lassen. Es ist ein übliches Designmuster, das auch in XmlNode-Klassen usw. zu finden ist.

Wie für Ihre 2 Optionen, schwer zu sagen, ohne mehr über das was/wie/wie viele in Ihrem Projekt zu wissen.

Wenn es die geringsten Unterschiede im Aussehen/Verhalten im Zusammenhang mit den Node-Sets gibt, würde ich TTreeviews tauschen.

3

Wenn Sie sich die Quelle von TTreeNodes anschauen, sehen Sie, dass sie den Owner benötigt (was ein TCustomTreeView ist). Sie können eine versteckte Baumansicht verwenden oder eine benutzerdefinierte Unterklasse erstellen.

Ich bevorzuge es, gui von datamodel zu trennen. Es gibt also immer ein Datenmodell mit den richtigen Beziehungen.

+0

Besitzer ist normalerweise optional, aber in diesem Fall nicht, was mehr oder weniger die Frage ist. –

+0

Besitzer wird ohne eine Überprüfung auf Null zugegriffen. Also in diesem Fall ist es nicht optional. –

Verwandte Themen