Programmierung

TreeView + DataList = TreeList

Das TreeView– und das DataList-Objekt sind zwei der meistverwendenten Oberflächenobjekte in CONZEPT 16 zur Visualisierung von dynamisch erzeugten Daten.

Das TreeView-Objekt wird hauptsächlich zur Darstellung hierarchischer Strukturen eingesetzt. Das DataList-Objekt hingegen wird vorwiegend zur Anzeige gleichrangiger, aber ausführlicherer Informationen genutzt.

In diesem Artikel möchte ich Ihnen ein Modul vorstellen, das ein DataList-Objekt um die Vorzüge eines TreeView-Objektes erweitert.

TreeView

Der Hauptvorteil einer Baumansicht gegenüber einer Listenansicht liegt in der Möglichkeit des Benutzers für ihn irrelevante Informationen ausblenden zu können, indem er einzelne Äste des Baumes zuklappt. Außerdem können dem Benutzer durch die Baumansicht Hierarchien oder Abhängigkeiten von Daten sehr einfach veranschaulicht werden.

TreeView-Objekt

DataList-Objekt

Typischerweise ist der Informationsgehalt eines einzelnen Elements innerhalb eines TreeView-Objektes auf wenige Daten, wie den Namen des Elements, beschränkt. In einem DataList-Objekt hingegen kann die Information eines einzelnen Elementes auf eine beliebige Anzahl von Spalten aufgeteilt werden.

DataList-Objekt

TreeList

Das Modul „MdlTreeList“ ergänzt das DataList-Objekt um die Vorteile des TreeView-Objektes: Das Zuklappen einzelner Elemente und die einfache Visualisierung hierarchischer Strukturen.

TreeList-Objekt

Für die Speicherung der Hierarchie und die Darstellung der Symbole werden zusätzliche Spalten innerhalb des DataList-Objektes benötigt. Mit der CONZEPT 16-Version 5.7.05 und den dynamischen Spalten kann das Modul diese Spalten selbstständig anlegen und löschen.

Die Schnittstelle des Moduls orientiert sich an den Funktionen des TreeView- und des DataList-Objektes. Ein Ausschnitt:

LineAdd // Zeile hinzufügen
(
  aVarOrLineParent      : handle;       // Instanz oder Übergeordnete Zeile
  opt aCaption          : alpha(4096);  // Titel
  opt aImage            : int;          // Bild "zugeklappt" (_Win.TreeListImage...)
  opt aImageExp         : int;          // Bild "aufgeklappt" (_Win.TreeListImage...)
  opt aLineNext         : handle;       // Nachfolgende Zeile
)
: handle;                               // Zeile

LineRemove // Zeile entfernen
(
  aLine                 : handle;       // Zeile
  opt aChildrenOnly     : logic;        // Nur untergeordnete Zeilen entfernen
)

LineCaptionSet // Titel setzen
(
  aLine                 : handle;       // Zeile
  aCaption              : alpha(4096);  // Titel
)

LineImageSet // Bild setzen
(
  aLine                 : handle;       // Zeile
  aImage                : int;          // Bild "zugeklappt" (_Win.TreeListImage...)
  opt aImageExp         : int;          // Bild "aufgeklappt" (_Win.TreeListImage...)
)

LineExpand // Zeile aufklappen
(
  aLine                 : handle;       // Zeile
)

LineCollapse // Zeile zuklappen
(
  aLine                 : handle;       // Zeile
)

LineDynamicSet // Setzen, dass untergeordnete Zeilen dynamisch (beim Auf-/Zuklappen) hinzugefügt bzw. entfernt werden
(
  aLine                 : handle;       // Zeile
  aDynamic              : logic;        // Untergeordnete Zeilen werden dynamisch hinzugefügt.
)

CellSetA // Zelle setzen (Typ: alpha)
(
  aLine                 : handle;       // Zeile
  aColumnNo             : int;          // Spaltennummer
  aValue                : alpha(4096);  // Wert
)

// Ereignis EvtFold setzen - Wird vor dem Auf- und Zuklappen einer Zeile ausgelöst.
EventFoldSet
(
  aVar                  : handle;       // Instanz
  aEvt                  : alpha(61);    // Funktion
)
Beispiel
...
@I:MdlWinTreeListInc

...
// TreeList-Objekt initialisieren
tTreeList # MdlWinTreeList:Init(
  $dlDataList,        // DataList-Objekt
  5,                  // Anzahl der Bildspalten im DataList-Objekt
  1,                  // Spaltennummer für Titel
);
// Zeile zu Liste hinzufügen
tTreeLine # tTreeList->MdlWinTreeList:LineAdd('Ordner 1', _Win.TreeListImageFolder);
// Untergeordnete Zeile zu Zeile hinzufügen
tTreeLine # tTreeLine->MdlWinTreeList:LineAdd('Dokument 1', _Win.TreeListImageDocument);
// 2. Zelle setzen
tTreeLine->MdlWinTreeList:CellSetA(2, '1. Jan.');
// 3. Zelle setzen
tTreeLine->MdlWinTreeList:CellSetA(3, '95 KB');
...
// TreeList-Objekt terminieren
tTreeList->MdlWinTreeList:Term();
...

Der am Ende des Artikel befindliche Download beinhaltet neben dem eigentlichen Modul auch ein Beispiel zur Verwendung.

Das Modul überlässt dem Entwickler viele Freiheiten in der optischen Gestaltung und bietet ihm darüber hinaus Spielraum für eigene Anpassungen und Erweiterungen.


Fazit

Die breite Palette an Oberflächenobjekten die CONZEPT 16 bereits Out-of-the-Box mitbringt lässt sich durch eigene Objekte erweitern – wenn auch mit etwas Aufwand, dafür aber auf die eigenen Bedürfnisse zugeschnitten. Auf dem gleichen Prinzip basieren übrigens auch das in früheren Artikel vorgestellte Slider-Objekt und die Suchleiste für RTFEdit-Objekte.

Haben Sie für Ihre Anwendungen auch eigene, allgemein verwendbare Objekte entwickelt, die Sie hier im CONZEPT 16-Blog gerne vorstellen und mit anderen Entwicklern teilen möchten? Wir würden uns sehr darüber freuen =).

Download

Zum downloaden hier klicken MdlWinTreeList.zip (129.13 KB)
Sie müssen angemeldet sein, um die Datei herunterladen zu können.

3 Kommentare

3 Kommentare “TreeView + DataList = TreeList”

  1. Nicht schlecht. Wie man sieht, erhöht die Möglichkeit, Dialoge dynamisch aufzubauen die Flexibilität erheblich.

    Jetzt scheint auch ein XML-Import von Dialogen in Reichweite zu sein.

    So richtig schön wäre es, wenn all diese Dynamik auch bei den Druckobjekten und -elementen zum Tragen käme. Dort wären sicherlich ebenfalls viele eigene wiederverwendbare Druckobjekte denkbar.

Kommentar abgeben