TreeView

Inhaltsverzeichnis

Einführung und einfaches Beispiel

Eine Baumansicht (engl. TreeView) wird verwendet, um eine Hierarchie von mehreren ineinander verschachtelten Elementen darzustellen. Das wohl bekannteste Beispiel dafür ist der Navigationsbereich am linken Rand eines Explorer-Fensters, mit dem Laufwerke und Ordner ausgewählt werden können.

Eine typische TreeView sieht wie folgt aus:

TreeView

Die Syntax zur Erstellung einer TreeView ist:

TV := GuiObj.Add("TreeView", Optionen)

Oder:

TV := GuiObj.AddTreeView(Optionen)

Das folgende Beispiel ist ein lauffähiges Skript, das eine einfache Hierarchie von Elementen erstellt und anzeigt:

MeineGui := Gui()
TV := MeineGui.Add("TreeView")
P1 := TV.Add("Erstes Elternelement")
P1C1 := TV.Add("Erstes Kindelement von Elternelement 1", P1)  ; P1 als Elternelement für dieses Element festlegen.
P2 := TV.Add("Zweites Elternelement")
P2C1 := TV.Add("Erstes Kindelement von Elternelement 2", P2)
P2C2 := TV.Add("Zweites Kindelement von Elternelement 2", P2)
P2C2C1 := TV.Add("Erstes Kindelement von Elternelement 2", P2C2)

MeineGui.Show  ; Das Fenster und dessen TreeView anzeigen.

Optionen und Styles für den Optionen-Parameter

Background: Geben Sie das Wort Background an, unmittelbar gefolgt von einem Farbnamen (siehe Farbentabelle) oder RGB-Wert (mit oder ohne 0x-Präfix). Beispiele: BackgroundSilver, BackgroundFFDD99. Wenn diese Option nicht vorhanden ist, verwendet die TreeView als Hintergrundfarbe standardmäßig die Standardhintergrundfarbe des Systems. Mit BackgroundDefault oder -Background kann die Standardhintergrundfarbe des Systems gesetzt werden (in der Regel weiß). Zum Beispiel kann die Standardfarbe einer TreeView via TV.Opt("+BackgroundDefault") wiederhergestellt werden.

Buttons: Geben Sie -Buttons (minus Buttons) an, um die Plus- oder Minuszeichen auf der linken Seite eines Elements, das Kindelemente hat, zu entfernen.

C: Textfarbe. Geben Sie den Buchstaben C an, unmittelbar gefolgt von einem Farbnamen (siehe Farbentabelle) oder RGB-Wert (mit oder ohne 0x-Präfix). Beispiele: cRed, cFF2211, c0xFF2211, cDefault.

Checked: Stellt eine CheckBox auf der linken Seite jedes Elements bereit. Geben Sie beim Hinzufügen eines Elements das Wort Check in den Optionen an, um die CheckBox vorerst im abgehakten Zustand anzuzeigen. Der Benutzer kann die CheckBox anklicken oder die Leertaste drücken, um ein Häkchen zu setzen oder zu entfernen. Um herauszufinden, welche Elemente aktuell in der TreeView abgehakt sind, rufen Sie die GetNext-Methode oder Get-Methode auf.

HScroll: Geben Sie -HScroll (minus HScroll) an, um das horizontale Scrollen im Steuerelement zu deaktivieren (zusätzlich wird der horizontale Scrollbalken entfernt).

ImageList: Ermöglicht das Hinzufügen von Symbolen zu einer TreeView. Geben Sie das Wort ImageList an, unmittelbar gefolgt von der ImageListID, die von einem vorherigen IL_Create-Aufruf zurückgegeben wurde. Diese Option funktioniert nur beim Erstellen einer TreeView (die SetImageList-Methode unterliegt nicht dieser Einschränkung). Hier ein funktionierendes Beispiel:

MeineGui := Gui()
ImageListID := IL_Create(10)  ; Eine ImageList mit einer anfänglichen Kapazität von 10 Symbolen erstellen.
Loop 10  ; ImageList mit einigen Standardsymbolen des Systems füllen.
    IL_Add(ImageListID, "shell32.dll", A_Index)
TV := MeineGui.Add("TreeView", "ImageList" . ImageListID)
TV.Add("Elementname", 0, "Icon4")  ; Element zur TreeView hinzufügen und ein Ordnersymbol zuweisen.
MeineGui.Show

Lines: Geben Sie -Lines (minus Lines) an, um die Verbindungslinien zwischen den Eltern- und Kindelementen zu verstecken. Das Entfernen solcher Linien verhindert allerdings auch, dass die Plus-/Minuszeichen bei Top-Level-Elementen angezeigt werden.

ReadOnly: Geben Sie -ReadOnly (minus ReadOnly) an, um dem Benutzer das Editieren des Texts/Namens eines Elements zu erlauben. Um ein Element zu editieren, wählen Sie es aus und drücken Sie F2 (siehe WantF2-Option unten). Alternativ können Sie einmal auf ein Element klicken, um es auszuwählen, mindestens eine halbe Sekunde warten und dann erneut auf dasselbe Element klicken, um es zu editieren. Nach dem Editieren kann ein Element wie folgt unter seinen Geschwisterelementen alphabetisch neu positioniert werden:

TV := MeineGui.Add("TreeView", "-ReadOnly")
TV.OnEvent("ItemEdit", TV_Edit)  ; TV_Edit jedes Mal aufrufen, wenn der Benutzer aufgehört hat, ein Element zu editieren.
; ...
TV_Edit(TV, Element)
{
    TV.Modify(TV.GetParent(Element), "Sort")  ; Funktioniert auch, wenn das Element kein Elternelement hat.
}

R: Höhe in Zeilen (beim Erstellen). Geben Sie den Buchstaben R an, unmittelbar gefolgt von der Anzahl der Zeilen, für die innerhalb des Steuerelements Platz geschaffen werden soll. Zum Beispiel bewirkt R10, dass das Steuerelement 10 Elemente hoch gemacht wird.

WantF2: Geben Sie -WantF2 (minus WantF2) an, um den Benutzer daran zu hindern, das aktuell ausgewählte Element mit F2 zu editieren. Diese Einstellung wird ignoriert, es sei denn, -ReadOnly ist ebenfalls wirksam.

(Namenlose numerische Styles): Andere Styles als die oben genannten werden nur selten verwendet und haben daher keine Namen. Eine vollständige Liste finden Sie unter TreeView-Styles.

Interne Methoden für TreeViews

Zusätzlich zu den Standardmethoden/-eigenschaften eines GUI-Steuerelements verfügen TreeView-Steuerelemente über die folgenden Methoden (definiert in der Gui.TreeView-Klasse).

Element-Methoden:

Abrufmethoden:

Sonstige Methoden:

Add

Fügt ein neues Element zur TreeView hinzu.

ElementID := TV.Add(Name, ElternElementID, Optionen)

Parameter

Name

Typ: Zeichenkette

Der Anzeigetext des Elements, der textuell oder numerisch sein kann (einschließlich numerischer Ergebnisse von Ausdrücken).

ElternElementID

Typ: Integer

Wenn weggelassen, wird standardmäßig 0 verwendet, d.h. das Element wird als Top-Level-Element hinzugefügt. Andernfalls geben Sie die ID-Nummer des Elternelements des neuen Elements an.

Optionen

Typ: Zeichenkette

Wenn leer oder weggelassen, werden standardmäßig keine Optionen verwendet. Andernfalls geben Sie eine oder mehrere Optionen aus der unteren Liste an (nicht Groß-/Kleinschreibung-sensitiv). Trennen Sie alle Optionen jeweils durch ein Leer- oder Tabulatorzeichen. Um eine Option zu entfernen, setzen Sie ein Minuszeichen davor. Um eine Option hinzuzufügen, lassen Sie das Vorzeichen weg oder setzen Sie ein Pluszeichen davor.

Bold: Stellt den Namen des Elements in fetter Schrift dar. Um dessen Schrift später wieder zu normalisieren, verwenden Sie TV.Modify(ElementID, "-Bold"). Direkt nach dem Wort Bold kann optional eine 0 oder 1 angegeben werden, um den Startzustand zu bestimmen.

Check: Zeigt ein Häkchen links neben dem Element an (sofern die TreeView über CheckBoxen verfügt). Um das Häkchen später wieder zu entfernen, verwenden Sie TV.Modify(ElementID, "-Check"). Direkt nach dem Wort Check kann optional eine 0 oder 1 angegeben werden, um den Startzustand zu bestimmen. Mit anderen Worten, "Check" ist dasselbe wie "Check" . VarEnhältEins (wobei der Punkt ein Verkettungsoperator ist).

Expand: Klappt das Element auf, um seine Kindelemente (falls vorhanden) anzuzeigen. Um das Element später wieder zuzuklappen, verwenden Sie TV.Modify(ElementID, "-Expand"). Wenn es keine Kindelemente hat, gibt die Modify-Methode 0 anstelle der Element-ID zurück. Die Add-Methode hingegen markiert das Element als aufgeklappt, falls später noch Kindelemente hinzugefügt werden. Im Gegensatz zur Select-Option unten wird beim Aufklappen eines Elements nicht automatisch das Elternelement aufgeklappt. Direkt nach dem Wort Expand kann optional eine 0 oder 1 angegeben werden, um den Startzustand zu bestimmen. Mit anderen Worten, "Expand" ist dasselbe wie "Expand" . VarEnhältEins.

First | Sort | N: Diese Optionen gelten nur für die Add-Methode. Sie bestimmen die Position des neuen Elements relativ zu seinen Geschwisterelementen (ein Geschwisterelement befindet sich auf derselben Ebene). Wenn keine dieser Optionen vorhanden ist, wird das neue Element als letztes/unterstes Geschwisterelement hinzugefügt. Andernfalls geben Sie das Wort First an, um das Element als erstes/oberstes Geschwisterelement hinzuzufügen, oder das Wort Sort, um das Element unter seinen Geschwisterelementen in alphabetischer Reihenfolge einzufügen. Wenn eine Nummer (N) angegeben ist, wird diese als ID-Nummer des Geschwisterelements vermutet, hinter dem das neue Element eingefügt werden soll (wenn N die einzige Option ist, muss sie nicht in Anführungszeichen gesetzt werden).

Icon: Geben Sie das Wort Icon an, unmittelbar gefolgt von der Nummer des Symbols, das links neben dem Elementnamen angezeigt werden soll. Wenn diese Option fehlt, wird das erste Symbol in der ImageList verwendet. Um ein leeres Symbol anzuzeigen, geben Sie eine Nummer größer als die Anzahl der Symbole in der ImageList an. Wenn dem Steuerelement keine ImageList zugewiesen wurde, wird kein Symbol angezeigt und kein Platz dafür reserviert.

Select: Wählt das Element aus. Da immer nur ein Element ausgewählt werden kann, wird das zuvor ausgewählte Element automatisch abgewählt. Außerdem bewirkt diese Option, dass alle Elternelemente des neuen Elements, das ausgewählt wurde, aufgeklappt werden, falls erforderlich. Um die aktuelle Auswahl zu ermitteln, verwenden Sie die GetSelection-Methode.

Sort: In Verbindung mit der Modify-Methode bewirkt diese Option, dass die Kindelemente des angegebenen Elements in alphabetischer Reihenfolge sortiert werden. Um stattdessen alle Top-Level-Elemente zu sortieren, verwenden Sie TV.Modify(0, "Sort"). Wenn es keine Kindelemente hat, wird 0 anstelle der ID des geänderten Elements zurückgegeben.

Vis: Stellt sicher, dass das Element vollständig sichtbar ist, ggf. durch Scrollen der TreeView und/oder Aufklappen des Elternelements.

VisFirst: Dasselbe wie oben, außer dass die TreeView zusätzlich gescrollt wird, um das Element nach Möglichkeit ganz oben anzuzeigen. Diese Option ist in Verbindung mit der Modify-Methode grundsätzlich effektiver als mit der Add-Methode.

Rückgabewert

Typ: Integer

Bei Erfolg gibt diese Methode die eindeutige ID-Nummer des neuen Elements zurück. Bei Misserfolg gibt sie 0 zurück.

Bemerkungen

Um das Hinzufügen sehr vieler Elemente performanter zu machen, verwenden Sie TV.Opt("-Redraw"), bevor Sie die Elemente hinzufügen, und danach TV.Opt("+Redraw"). Weitere Informationen finden Sie unter Neuzeichnung.

Modify

Ändert die Attribute und/oder den Namen eines Elements.

ElementID := TV.Modify(ElementID , Optionen, NeuerName)

Parameter

ElementID

Typ: Integer

Die ID-Nummer des Elements, das geändert werden soll.

Optionen

Typ: Zeichenkette

Wenn dieser und der NeuerName-Parameter weggelassen werden, wird das Element ausgewählt. Andernfalls geben Sie eine oder mehrere Optionen aus der obigen Liste an.

NeuerName

Typ: Zeichenkette

Wenn weggelassen, bleibt der aktuelle Name unverändert. Andernfalls geben Sie den neuen Namen des Elements an.

Rückgabewert

Typ: Integer

Diese Methode gibt die ID des Elements zurück.

Delete

Löscht ein bestimmtes Element oder alle Elemente.

TV.Delete(ElementID)

Parameter

ElementID

Typ: Integer

Wenn weggelassen, werden alle Elemente in der TreeView gelöscht. Andernfalls geben Sie die ID-Nummer des Elements an, das gelöscht werden soll.

GetSelection

Gibt die ID-Nummer des ausgewählten Elements zurück.

ElementID := TV.GetSelection()

Rückgabewert

Typ: Integer

Diese Methode gibt die ID-Nummer des ausgewählten Elements zurück.

GetCount

Gibt die Gesamtzahl der Elemente im Steuerelement zurück.

Anzahl := TV.GetCount()

Rückgabewert

Typ: Integer

Diese Methode gibt die Gesamtzahl der Elemente im Steuerelement zurück. Der Wert wird immer sofort zurückgegeben, da das Steuerelement diese Zählung zwischenspeichert.

GetParent

Gibt die ID-Nummer des Elternelements eines bestimmten Elements zurück.

ElternElementID := TV.GetParent(ElementID)

Parameter

ElementID

Typ: Integer

Die ID-Nummer des Elements, das geprüft werden soll.

Rückgabewert

Typ: Integer

Diese Methode gibt die ID-Nummer des Elternelements des angegebenen Elements zurück. Wenn das Element kein Elternelement hat, gibt sie 0 zurück, was für alle Top-Level-Elemente gilt.

GetChild

Gibt die ID-Nummer des ersten/obersten Kindelements eines bestimmten Elements zurück.

KindElementID := TV.GetChild(ElementID)

Parameter

ElementID

Typ: Integer

Die ID-Nummer des Elements, das geprüft werden soll. Wenn 0, wird die ID-Nummer des ersten/obersten Elements in der TreeView zurückgegeben.

Rückgabewert

Typ: Integer

Diese Methode gibt die ID-Nummer des ersten/obersten Kindelements des angegebenen Elements zurück. Wenn dort kein Kindelement vorhanden ist, gibt sie 0 zurück.

GetPrev

Gibt die ID-Nummer des Geschwisterelements zurück, das sich oberhalb eines bestimmten Elements befindet.

VorherigesElementID := TV.GetPrev(ElementID)
ElementID

Typ: Integer

Die ID-Nummer des Elements, das geprüft werden soll.

Rückgabewert

Typ: Integer

Diese Methode gibt die ID-Nummer des Geschwisterelements zurück, das sich oberhalb des angegebenen Elements befindet. Wenn dort kein Geschwisterelement vorhanden ist, gibt sie 0 zurück.

GetNext

Gibt die ID-Nummer des nächsten Elements zurück, das sich unterhalb eines bestimmten Elements befindet.

NächstesElementID := TV.GetNext(ElementID, ElementTyp)

Parameter

ElementID

Typ: Integer

Wenn weggelassen, wird standardmäßig 0 verwendet, d.h. es wird die ID-Nummer des ersten/obersten Elements in der TreeView zurückgegeben. Andernfalls geben Sie die ID-Nummer des Elements an, das geprüft werden soll.

ElementTyp

Typ: Zeichenkette

Wenn weggelassen, wird die ID-Nummer des Geschwisterelements abgerufen, das sich unterhalb des angegebenen Elements befindet. Andernfalls geben Sie eine der folgenden Zeichenketten an:

Full oder F: Ruft das nächste Element unabhängig von seiner Beziehung zum angegebenen Element ab. Dadurch kann das Skript auf einfache Weise die gesamte TreeView Element für Element durchgehen. Siehe das Beispiel unten.

Check, Checked oder C: Ruft nur das nächste abgehakte Element ab.

Rückgabewert

Typ: Integer

Diese Methode gibt die ID-Nummer des nächsten Elements zurück, das sich unterhalb des angegebenen Elements befindet. Wenn dort kein nächstes Element vorhanden ist, gibt sie 0 zurück.

Bemerkungen

Das folgende Beispiel durchläuft die gesamte TreeView Element für Element:

ElementID := 0  ; Die Suche beim ersten Element beginnen.
Loop
{
    ElementID := TV.GetNext(ElementID, "Full")  ; Ersetzen Sie "Full" mit "Checked", um alle abgehakten Elemente zu finden.
    if not ElementID  ; Keine weiteren Elemente verfügbar.
        break
    ElementText := TV.GetText(ElementID)
    MsgBox('Das nächste Element ist ' ElementID ' und enthält "' ElementText '".')
}

GetText

Ruft den Text/Namen eines bestimmten Elements ab.

Text := TV.GetText(ElementID)

Parameter

ElementID

Typ: Integer

Die ID-Nummer des Elements, dessen Text abgerufen werden soll.

Rückgabewert

Typ: Zeichenkette

Diese Methode gibt den abgerufenen Text zurück. Es werden nur bis zu 8191 Zeichen abgerufen.

Get

Gibt die ID-Nummer eines bestimmten Elements zurück, unter Beachtung des angegebenen Attributs.

ElementID := TV.Get(ElementID, Attribut)

Parameter

ElementID

Typ: Integer

Die ID-Nummer des Elements, das geprüft werden soll.

Attribut

Typ: Zeichenkette

Geben Sie eine der folgenden Zeichenketten an:

E, Expand oder Expanded: Das Element ist gerade aufgeklappt (d.h. seine Kindelemente werden angezeigt).

C, Check oder Checked: Das Element hat ein Häkchen.

B oder Bold: Das Element wird gerade fett dargestellt.

Rückgabewert

Typ: Integer

Wenn das angegebene Element das angegebene Attribut hat, wird dessen ID zurückgegeben. Andernfalls wird 0 zurückgegeben.

Bemerkungen

Da eine IF-Anweisung jeden Wert ungleich 0 als "wahr" ansieht, sind die folgenden zwei Zeilen funktionsgleich: if TV.Get(ElementID, "Checked") = ElementID und if TV.Get(ElementID, "Checked").

SetImageList

Setzt oder ersetzt eine ImageList zur Darstellung von Symbolen.

VorherigeImageListID := TV.SetImageList(ImageListID , SymbolTyp)

Parameter

ImageListID

Typ: Integer

Die ID-Nummer, die von einem früheren Aufruf von IL_Create zurückgegeben wurde.

SymbolTyp

Typ: Integer

Wenn weggelassen, wird standardmäßig 0 verwendet. Andernfalls geben Sie 2 für Zustandssymbole an (Zustandssymbole werden nur indirekt via SendMessage unterstützt).

Rückgabewert

Typ: Integer

Bei Erfolg gibt diese Methode die ImageList-ID zurück, die zuvor mit der TreeView verknüpft war. Bei Misserfolg gibt sie 0 zurück. Jede nicht mehr verwendete ImageList sollte normalerweise mit IL_Destroy zerstört werden.

Ereignisse

Damit das Skript auf die folgenden Ereignisse reagieren kann, muss eine Rückruffunktion oder -methode via OnEvent registriert werden:

EreignisAuslösende Aktion
ClickDas Steuerelement wurde angeklickt.
DoubleClickDas Steuerelement wurde doppelt angeklickt.
ContextMenuDer Benutzer hat einen Rechtsklick auf das Steuerelement gemacht oder Menü oder Umschalt+F10 gedrückt, während das Steuerelement fokussiert war.
FocusDas Steuerelement hat den Tastaturfokus erhalten.
LoseFocusDas Steuerelement hat den Tastaturfokus verloren.
ItemCheckBei einem Element wurde ein Häkchen gesetzt oder entfernt.
ItemEditDie Beschriftung eines Elements wird vom Benutzer editiert.
ItemExpandEin Element wurde auf- oder zugeklappt.
ItemSelectEin Element wurde ausgewählt.

Weitere (selten verwendete) Benachrichtigungen können mit OnNotify erkannt und verarbeitet werden. Diese Benachrichtigungen sind in Microsoft Docs dokumentiert. Microsoft Docs zeigt normalerweise keine numerischen Werte für die Benachrichtigungscodes an; diese können im Windows SDK oder durch Suchen im Internet gefunden werden.

Bemerkungen

Um einen Enter-Tastendruck in einer fokussierten TreeView zu erfassen, verwenden Sie eine Standardschaltfläche (die bei Bedarf versteckt werden kann). Zum Beispiel:

MeineGui.Add("Button", "Hidden Default", "OK").OnEvent("Click", ButtonOK)
...
ButtonOK(*) {
    global
    if MeineGui.FocusedCtrl != TV
        return
    MsgBox("Sie haben ENTER gedrückt. Die ID des ausgewählten Elements ist " TV.GetSelection())
}

Zusätzlich zur elementweisen Navigation mit der Tastatur kann der Benutzer auch eine inkrementelle Suche durchführen, indem er die ersten paar Zeichen eines Elementnamens eingibt. Dadurch springt die Auswahl auf das nächst passende Element.

Obwohl ein beliebig langer Text in einem TreeView-Element gespeichert werden kann, werden nur die ersten 260 Zeichen angezeigt.

Auch wenn die TreeView theoretisch maximal 65536 Elemente enthalten kann, wird die Performanz beim Hinzufügen von Elementen schon lange vorher merklich abnehmen. Um diesen Performanzverlust etwas abzumildern, verwenden Sie den in der Add-Methode beschriebenen Tipp bzgl. Redraw.

Im Gegensatz zu den ImageLists einer ListView werden ImageLists einer TreeView nicht automatisch zerstört, wenn die TreeView zerstört wird. Daher sollte IL_Destroy nach dem Zerstören eines TreeView-Fensters aufgerufen werden, wenn die ImageList nicht länger benötigt wird. Dies ist jedoch nicht erforderlich, wenn das Skript in Kürze beendet wird, da in diesem Fall alle ImageLists automatisch zerstört werden.

Ein Skript kann mehr als eine TreeView pro Fenster erstellen.

Um eine TreeView z.B. größer/kleiner zu machen, zu verstecken oder mit einer anderen Schrift zu versehen, siehe GuiControl-Objekt.

Tree View eXtension (TVX) erweitert TreeViews um die Möglichkeit, Elemente zu verschieben, einzufügen und zu löschen. Siehe diesen archivierten Forumsthread.

ListView, Andere Steuerelemente, Gui(), ContextMenu-Ereignis, Gui-Objekt, GuiControl-Objekt, TreeView-Styles

Beispiele

Das folgende Beispiel ist ein lauffähiges Skript, das umfangreicher ist als das obige Beispiel. Es erstellt und zeigt eine TreeView, die sämtliche Ordner des Alle-Benutzer-Startmenüs enthält. Wenn der Benutzer einen Ordner auswählt, wird dessen Inhalt in einer ListView auf der rechten Seite angezeigt (wie beim Windows Explorer). Zusätzlich zeigt ein StatusBar-Steuerelement Informationen über den aktuell ausgewählten Ordner an.

; Der folgende Ordner definiert den Stammordner der TreeView. Beachten Sie, dass
; das Laden lange dauern kann, wenn ein ganzes Laufwerk wie C:\ angegeben ist:
TreeRoot := A_MyDocuments
TreeViewBreite := 280
ListViewBreite := A_ScreenWidth/2 - TreeViewBreite - 30

; MeineGui-Fenster erstellen und Root-Ordner in der Titelleiste anzeigen:
MeineGui := Gui("+Resize", TreeRoot)  ; Dem Benutzer erlauben, das Fenster zu maximieren oder dessen Größe zu ändern.

; Eine ImageList erstellen und mit einigen Standardsymbolen des Systems füllen:
ImageListID := IL_Create(5)
Loop 5 
    IL_Add(ImageListID, "shell32.dll", A_Index)
; Eine TreeView und ListView nebeneinandersetzen, ähnlich dem Windows Explorer:
TV := MeineGui.Add("TreeView", "r20 w" TreeViewBreite " ImageList" ImageListID)
LV := MeineGui.Add("ListView", "r20 w" ListViewBreite " x+10", ["Name","Änderungsdatum"])

; Statusleiste erstellen, um Anzahl der Dateien und Gesamtgröße anzuzeigen:
SB := MeineGui.Add("StatusBar")
SB.SetParts(60, 85)  ; Leiste in drei Segmente aufteilen (das dritte Segment füllt die restliche Breite aus).

; Ordner und ihre Unterordner zur TreeView hinzufügen. Status anzeigen, falls das Laden länger dauert:
M := Gui("ToolWindow -SysMenu Disabled AlwaysOnTop", "Lade Baumstruktur..."), M.Show("w200 h0")
VerzListe := UnterordnerInBaumEinfügen(TreeRoot, Map())
M.Hide()

; TV_ItemSelect aufrufen, wenn ein neues Element ausgewählt wird:
TV.OnEvent("ItemSelect", TV_ItemSelect)

; Gui_Size aufrufen, wenn die Fenstergröße geändert wird:
MeineGui.OnEvent("Size", Gui_Size)

; Spaltenbreiten der ListView setzen (dies ist optional):
Spalte2Breite := 70  ; Kürzen, um nur den YYYYMMDD-Teil anzuzeigen.
LV.ModifyCol(1, ListViewBreite - Spalte2Breite - 30)  ; Platz für den vertikalen Scrollbalken schaffen.
LV.ModifyCol(2, Spalte2Breite)

; Das Fenster anzeigen. Das Skript wird benachrichtigt, wenn der Benutzer eine gültige Aktion ausführt:
MeineGui.Show

UnterordnerInBaumEinfügen(Ordner, VerzListe, ElternElementID := 0)
{
    ; Diese Funktion fügt alle Unterordner eines Ordners zur TreeView hinzu
    ; und speichert deren Pfade zusammen mit einer ID in ein Objekt für den späteren Gebrauch.
    ; Sie ruft sich selbst rekursiv auf, um Unterordner in beliebiger Tiefe zu erfassen.
    Loop Files, Ordner "\*.*", "D"  ; Alle Unterordner des Ordners abrufen.
    {
        ElementID := TV.Add(A_LoopFileName, ElternElementID, "Icon4")
        VerzListe[ElementID] := A_LoopFilePath
        VerzListe := UnterordnerInBaumEinfügen(A_LoopFilePath, VerzListe, ElementID)
    }
    return VerzListe
}

TV_ItemSelect(thisCtrl, Element)  ; Diese Funktion wird aufgerufen, wenn ein neues Element ausgewählt wird.
{
    ; Dateien in die ListView einfügen:
    LV.Delete  ; Alle Zeilen löschen.
    LV.Opt("-Redraw")  ; Performanz verbessern durch Abschalten von Redraw beim Laden.
    GesamtGröße := 0  ; Für die untere Schleife initialisieren.
    Loop Files, VerzListe[Element] "\*.*"  ; Nur die Dateien in der ListView anzeigen.
    {
        LV.Add(, A_LoopFileName, A_LoopFileTimeModified)
        GesamtGröße += A_LoopFileSize
    }
    LV.Opt("+Redraw")

    ; Die drei Segmente der Statusleiste mit Infos über den aktuell ausgewählten Ordner aktualisieren:
    SB.SetText(LV.GetCount() " Dateien", 1)
    SB.SetText(Round(GesamtGröße / 1024, 1) " KB", 2)
    SB.SetText(VerzListe[Element], 3)
}

Gui_Size(thisGui, MinMax, Breite, Höhe)  ; ListView und TreeView kleiner/größer machen, wenn Benutzer die Fenstergröße ändert.
{
    if MinMax = -1  ; Das Fenster wurde minimiert. Keine Aktion notwendig.
        return
    ; Andernfalls wurde das Fenster kleiner/größer gemacht oder maximiert. Größe der Steuerelemente anpassen.
    TV.GetPos(,, &TV_W)
    TV.Move(,,, Höhe - 30)  ; -30 für StatusBar und Abstände.
    LV.Move(,, Breite - TV_W - 30, Höhe - 30)
}