In 4D können Sie hierarchische Listboxen definieren und verwenden. Das ist eine Listbox, in welcher der Inhalt der ersten Spalte in hierarchischer Form erscheint. Diese Art von Darstellung ermöglicht die Präsentation von Information, die wiederholte bzw. hierarchisch gegliederte Werte enthält, z.B. Land/Bundesland/Stadt o.ä.
Nur Listboxen vom Typ Array können hierarchisch sein.
Hierarchische Listboxen sind eine besondere Darstellungsart von Daten. Sie verändern jedoch nicht die Struktur dieser Daten (die Arrays). Hierarchische Listboxen werden exakt wie normale Listboxen verwaltet.
Um eine hierarchische Listbox zu definieren, gibt es drei Möglichkeiten:
Hierarchische Elemente manuell mit der Eigenschaftenliste des Formulareditors konfigurieren.
Die Hierarchie visuell über das PopUp-Menü zur Listbox Verwaltung im Formulareditor erzeugen.
Dieser Abschnitt beschreibt, wie Sie hierarchische Listboxen im 4D Formulareditor anlegen, die grundlegende Arbeitsweise während der Ausführung und ihre Verwaltung (Auswahl, Umbrüche, Formularereignisse On Expand und On Collapse, etc.).
Sie können den hierarchischen Modus in der Eigenschaftenliste unter der Gruppe "Hierarchie" aktivieren und konfigurieren. Weitere Informationen dazu finden Sie im Abschnitt Eigenschaften für Listboxen.
Wählen Sie im Formulareditor in einem Objekt Listbox vom Typ Array mindestens eine Spalte zusätzlich zur ersten aus, erscheint im Kontextmenü der Eintrag Hierarchie anlegen:
Markieren Sie diesen Eintrag, werden folgende Aktionen ausgeführt:
In der Eigenschaftenliste ist die Option "Hierarchische Listbox" ist für das Objekt markiert.
Die Variablen der Spalten werden zum Definieren der Hierarchie verwendet. Sie ersetzen alle bereits deklarierten Variablen.
Die gewählten Spalten erscheinen nicht länger in der Listbox, mit Ausnahme der ersten.
Beispiel: Wir haben eine Listbox mit den Spalten Countries, Regions, Cities und Population. Sind Countries, Regions und Cities ausgewählt und markieren Sie im Kontextmenü den Eintrag Hierarchie anlegen, wird in der ersten Spalte eine dreistufige Hierarchie erstellt, Spalte 2 und 3 werden entfernt und die Spalte Population wird die 2. Spalte:
Ist die 1. Spalte ausgewählt und bereits als Hierarchie definiert, können Sie den Eintrag Hierarchie löschen verwenden. Markieren Sie diesen Eintrag, werden folgende Aktionen ausgeführt:
Die Option "Hierarchische Listbox" wird für das Objekt inaktiv,
Die hierarchischen Ebenen 2 bis X werden entfernt und wieder in Spalten in der Listbox umgewandelt.
Wird ein Formular mit hierarchischer Listbox zum ersten Mal geöffnet, werden standardmäßig alle Zeilen aufgeklappt. Ein Umbruch und ein hierarchischer Knotenpunkt werden automatisch in der Listbox hinzugefügt, wenn Werte in den Arrays wiederholt werden. Nehmen wir z.B. eine Listbox mit vier Arrays mit den Spalten "Countries", "Regions", "Cities" und "Population":
Wird diese Listbox in hierarchischer Form angezeigt (die drei ersten Arrays sind in der Hierarchie enthalten), erhalten Sie folgendes:
Die Arrays werden vor dem Aufbau der Hierarchie nicht sortiert. Enthält ein Array z.B. die Daten AAABBAACC, lautet die Hierarchie: > A > B > A > C
Um eine hierarchische Liste auf- oder zuzuklappen, klicken Sie auf das Zeichen vor dem Eintrag. Klicken Sie mit der Tastenkombination Alt+Klick unter Windows, bzw. Wahltaste+Klick auf macOS darauf, werden auch alle Unterelemente auf- oder zugeklappt. Diese Operationen lassen sich über die Befehle LISTBOX EXPAND und LISTBOX COLLAPSE auch per Programmierung ausführen.
Sind in einer hierarchischen Listbox Werte vom Typ Datum oder Zeit enthalten, erscheinen sie in einem Standardformat:
Datum wird im Format systemabhängig kurz angezeigt, z.B. für den 30. Mai 2009 auf einem amerikanischen System "05/30/09", auf einem europäischen System "30.05.09".
Zeit wird ebenfalls im Format systemabhängig kurz angezeigt, d.h. je nach den Einstellungen des Systems "12:15:30" oder "12:15".
Bei einer Listbox im hierarchischen Modus wird die Standardsortierung, d.h. wenn Sie auf den Titel einer Spalte der Listbox klicken, immer wie folgt aufgebaut:
Zuerst werden alle Ebenen der hierarchischen Spalte, d.h. der ersten Spalte, in aufsteigender Reihenfolge sortiert.
Die Sortierung wird dann, je nach der Benutzeraktion, auf die Werte der angeklickten Spalte in aufsteigender oder absteigender Reihenfolge ausgeführt.
Alle Spalten werden aufeinander abgestimmt.
Bei nachfolgenden Sortierungen, die in nicht-hierarchischen Spalten der Listbox ausgeführt werden, wird nur die letzte Ebene der ersten Spalte sortiert. Sie können die Sortierung dieser Spalte durch Klick in den Spaltentitel ändern.
Im folgenden sehen Sie ein weiteres Beispiel. Wir nehmen folgende Listbox, die keine spezifische Sortierung enthält:
Klicken Sie auf den Spaltentitel "Population", um die Einwohner in aufsteigender oder alternativ in absteigender Reihenfolge zu sortieren. Auf dem Bildschirm erscheint folgendes Ergebnis:
Sie können, wie für alle Listboxen, die standardmäßig vorgegebene Sortierung durch Deaktivieren der Option "Sortierbar" für die Listbox ausschalten und die Sortierung per Programmierung verwalten.
Eine hierarchische Listbox zeigt je nach Status eine variable Anzahl Zeilen auf dem Bildschirm, je nachdem ob die hierarchischen Knotenpunkte auf- oder zugeklappt sind. Das bedeutet jedoch nicht, dass die Anzahl der Zeilen variiert. Nur die Anzeige verändert sich, nicht die Daten ansich.
Es ist wichtig, dieses Prinzip zu verstehen, weil die programmierte Verwaltung hierarchischer Listboxen immer auf den Daten der Arrays basiert und nicht auf den angezeigten Daten. Speziell die automatisch hinzugefügten Umbruchzeilen werden im Array mit den Anzeigeoptionen nicht berücksichtigt (siehe unteren Abschnitt Umbruchzeilen verwalten).
Nehmen wir z.B. folgende Arrays:
Beim Anzeigen in hierarchischer Form erscheint der Eintrag "Freising" nicht in der zweiten, sonderen in der vierten Zeile, weil zwei Umbruchzeilen hinzugefügt werden:
Unabhängig von der Darstellung der Daten in der Listbox (hierarchisch oder nicht), wollen Sie die Zeile mit "Freising" in Fettschrift setzen, müssen Sie die Anweisung Stil{2} = bold schreiben. Denn es wird nur die Position der Zeile in den Arrays berücksichtigt.
Dieses Prinzip gilt für interne Arrays. Sie können damit folgende Elemente verwalten:
Farben
Hintergrundfarben
Stilelemente
Ausgeblendete Zeilen
Auswahlen
Um z.B. die Zeile mit Rosenheim auszuwählen, müssen Sie folgendes übergeben:
->MyListbox{3}:=True
Nicht-hierarchische Darstellung:
Hierarchische Darstellung:
Hinweis: Sind eine oder mehrere Zeilen ausgeblendet, weil das übergeordnete Element zugeklappt ist, sind sie nicht mehr ausgewählt. Nur sichtbare Zeilen lassen sich auswählen, sei es direkt oder durch Scrollen. Mit anderen Worten, Zeilen können nicht gleichzeitig ausgeblendet und ausgewählt sein.
Analog zu Auswahlen gibt der Befehl LISTBOX GET CELL POSITION für eine hierarchische bzw. eine nicht-hierarchische Listbox denselben Wert zurück. Das bedeutet, dass dieser Befehl in beiden nachfolgenden Beispielen dieselbe Position zurückgibt, nämlich: (3;2)
Sind alle Zeilen einer Unterhierarchie ausgeblendet, wird die Umbruchzeile ebenfalls ausgeblendet. Werden zum Beispiel unter Deutschland die Zeilen 1 bis 3 ausgeblendet, erscheint die Umbruchzeile "Bayern" nicht.
Umbruchzeilen werden in internen Arrays zur Verwaltung der grafischen Darstellung von Listboxen (Stilarten und Farben) nicht berücksichtigt. Sie können die Merkmale für Umbruchzeilen jedoch über die Befehle zur grafischen Verwaltung von Objekten (im Kapitel Objekte (Formulare)) verändern. Dazu müssen Sie nur die entsprechenden Befehle für die Arrays ausführen, welche die Hierarchie enthalten.
Nehmen wir z.B. nachfolgende Listbox (die Namen der zugewiesenen Arrays sind in Klammern angegeben):
Nicht-hierarchische Darstellung:
Hierarchische Darstellung:
Im hierarchischen Modus werden Umbruchzeilen nicht von den Arrays für Stiländerungen mit Namen tStyle und tColor berücksichtigt. Um Farbe oder Stil von Umbruchebenen zu ändern, müssen Sie folgende Anweisung ausführen:
Hinweis: In diesem Kontext kann nur die Syntax, welche die Array Variable enthält, mit den Befehlen für Objekteigenschaften funktionieren, da die Arrays keine zugewiesenen Objekte haben.
Sie können Anzeigen und Arbeiten mit hierarchischen Listboxen mit den beiden Formularereignissen On Expand und On Collapse optimieren.
Eine hierarchische Listbox wird mit dem Inhalt seiner Arrays aufgebaut, es kann also nur angezeigt werden, wenn all diese Arrays in den Speicher geladen sind. Das erschwert den Aufbau umfangreicher hierarchischer Listboxen über Arrays, die aus Daten generiert werden (mit dem Befehl SELECTION TO ARRAY), nicht nur in Bezug auf die Anzeigegeschwindigkeit, sondern auch in Bezug auf den verwendeten Speicher.
Diese Einschränkungen können Sie über die Formularereignisse On Expand und On Collapse aufheben. Sie können z.B. nur einen Teil der Hierarchie anzeigen und die Arrays gemäß Benutzeraktionen unmittelbar laden/entladen.
Im Kontext dieser Ereignisse gibt der Befehl LISTBOX GET CELL POSITION die Zelle zurück, in die der Benutzer geklickt hat, um eine Zeile auf- oder zuzuklappen.
In diesem Fall müssen Sie Arrays über den Code füllen und leeren. Die Funktionsweise ist wie folgt:
Wird die Listbox angezeigt, muss nur das erste Array gefüllt werden. Sie müssen jedoch ein zweites Array mit leeren Werten erstellen, damit die Listbox die Icons zum Auf- und Zuklappen anzeigt:
Klickt ein Benutzer auf das Icon Aufklappen, kann das Ereignis On Expand operieren. Der Befehl LISTBOX GET CELL POSITION gibt die entsprechende Zelle zurück und lässt Sie die passende Hierarchie aufbauen: Sie füllen das erste Array mit den wiederholten Werten, das zweite mit den vom Befehl SELECTION TO ARRAY gesendeten Werten und fügen über den Befehl LISTBOX INSERT ROWS soviele Zeilen, wie benötigt werden, in die Listbox ein:
Klickt ein Benutzer auf das Icon Zuklappen, kann das Ereignis On Collapse operieren. Der Befehl LISTBOX GET CELL POSITION gibt die entsprechende Zelle zurück: Sie entfernen über den Befehl LISTBOX DELETE ROWS die entsprechenden Zeilen aus der Listbox.