ListView

Inhaltsverzeichnis

Einführung und einfaches Beispiel

Die ListView ist eines der umfangreichsten Steuerelemente, das vom Betriebssystem zur Verfügung gestellt wird. Eine ListView (auf Deutsch: Listenansicht) wird häufig verwendet, um eine Tabelle in Form von Zeilen und Spalten darzustellen. Das wohl bekannteste Beispiel dafür ist die detaillierte Auflistung von Dateien und Ordnern im Explorer.

Eine typische ListView sieht wie folgt aus:

ListView

Auch wenn es recht umfangreich erscheinen mag, sind die grundlegenden Features einer ListView relativ einfach zu bedienen. Die Syntax zum Erstellen einer ListView ist:

LV := GuiObj.Add("ListView", Optionen, ["SpalteTitel1","SpalteTitel2","..."])

Oder:

LV := GuiObj.AddListView(Optionen, ["SpalteTitel1","SpalteTitel2","..."])

Das folgende Beispiel ist ein lauffähiges Skript, das alle Dateien im Ordner "Eigene Dateien" des Benutzers in einer ListView auflistet:

; Das Fenster erstellen:
MeineGui := Gui()

; Zweispaltige ListView erstellen:
LV := MeineGui.Add("ListView", "r20 w700", ["Name","Größe (KB)"])

; Skript benachrichtigen, wenn der Benutzer eine Zeile doppelt anklickt:
LV.OnEvent("DoubleClick", LV_DoubleClick)

; Name und Größe jeder Datei in einem Ordner in die ListView einfügen:
Loop Files, A_MyDocuments "\*.*"
    LV.Add(, A_LoopFileName, A_LoopFileSizeKB)

LV.ModifyCol  ; Breite jeder Spalte an ihren Inhalt anpassen.
LV.ModifyCol(2, "Integer")  ; Aus Sortierungsgründen Spalte 2 als Integer kennzeichnen.

; Fenster anzeigen:
MeineGui.Show

LV_DoubleClick(LV, ZeileNummer)
{
    ZeileText := LV.GetText(ZeileNummer)  ; Text des ersten Feldes der Zeile abrufen.
    ToolTip("Sie haben die Zeile " ZeileNummer " doppelt angeklickt. Text: '" ZeileText "'")
}

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 ListView 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 ListView via LV.Opt("+BackgroundDefault") wiederhergestellt werden.

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 jeder Zeile bereit. Geben Sie beim Hinzufügen einer Zeile 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.

Count: Geben Sie das Wort Count an, unmittelbar gefolgt von der Anzahl der Zeilen, die die ListView letztendlich enthalten soll. Dies ist kein Limit: Nach Erreichen dieser Anzahl können weiterhin neue Zeilen hinzugefügt werden. Stattdessen dient diese Option eher als Hinweis, dass das Steuerelement den Speicher nur einmal reservieren soll und nicht jedes Mal, wenn eine neue Zeile hinzugefügt wird, was die Performanz beim Hinzufügen neuer Zeilen (und bis zu einem gewissen Grad auch beim Sortieren) deutlich verbessert. Um die Performanz noch weiter zu verbessern, verwenden Sie LV.Opt("-Redraw"), bevor Sie eine große Anzahl von Zeilen hinzufügen, und danach LV.Opt("+Redraw"). Weitere Informationen finden Sie unter Neuzeichnung.

Grid: Zeigt horizontale und vertikale Linien an, um die Grenzen zwischen den Zeilen und Spalten zu verdeutlichen.

Hdr: Geben Sie -Hdr (minus Hdr) an, um die Kopfzeile (Spaltenüberschriften) zu verstecken. Um sie später wieder sichtbar zu machen, verwenden Sie LV.Opt("+Hdr").

LV: Geben Sie die Zeichenkette LV an, unmittelbar gefolgt von der Zahl eines erweiterten ListView-Styles. Diese Styles sind etwas völlig anderes als die generischen erweiterten Styles. Zum Beispiel bewirkt -E0x200, dass der generische erweiterte Style WS_EX_CLIENTEDGE (Standardrahmen des Steuerelements) entfernt wird, während -LV0x20 den erweiterten ListView-Style LVS_EX_FULLROWSELECT entfernt.

LV0x10: Geben Sie -LV0x10 an, um den Benutzer daran zu hindern, die Spaltenüberschriften zwecks Neuanordnung nach links oder rechts zu verschieben. Normalerweise ist das in der Regel nicht notwendig, weil die physische Neuanordnung der Spalten keinen Einfluss auf die vom Skript gesehene Spaltenanordnung hat. Die erste Spalte wird aus Sicht des Skripts immer Spalte 1 sein, auch dann, wenn der Benutzer sie z.B. physisch ganz nach rechts verschoben hat.

LV0x20: Geben Sie -LV0x20 an, damit eine Zeile nur durch Anklicken des ersten Feldes ausgewählt werden kann (normalerweise kann sie durch Anklicken eines beliebigen Feldes ausgewählt werden). Diese Option hat den Vorteil, dass der Benutzer leichter ein Rechteck über mehrere Zeilen ziehen kann, um sie auszuwählen.

Multi: Geben Sie -Multi (minus Multi) an, um den Benutzer daran zu hindern, mehr als eine Zeile auszuwählen.

NoSortHdr: Verhindert, dass die Kopfzeile angeklickt werden kann. Die Spaltenüberschriften werden nicht mehr als normale Schaltflächen dargestellt, sondern bekommen ein flacheres Aussehen. Im Gegensatz zu den meisten anderen ListView-Styles kann dieser Style nicht mehr geändert werden, nachdem die ListView erstellt wurde.

NoSort: Verhindert die automatische Sortierung beim Anklicken einer Spaltenüberschrift. Die Spaltenüberschrift verhält sich jedoch weiterhin visuell wie eine Schaltfläche (es sei denn, die NoSortHdr-Option oben wurde angegeben). Außerdem wird das ColClick-Ereignis weiterhin ausgelöst, so dass das Skript mit einer benutzerdefinierten Sortierung oder einer anderen Aktion reagieren kann.

ReadOnly: Geben Sie -ReadOnly (minus ReadOnly) an, um dem Benutzer das Editieren des Textes in der ersten Spalte jeder Zeile zu erlauben. Um eine Zeile zu editieren, wählen Sie sie aus und drücken Sie F2 (siehe WantF2-Option unten). Alternativ können Sie einmal auf eine Zeile klicken, um sie auszuwählen, mindestens eine halbe Sekunde warten und dann erneut auf dieselbe Zeile klicken, um sie zu editieren.

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 Zeilen hoch gemacht wird. Wenn die ListView mit einem anderen Ansichtsmodus als Report erstellt wurde, wird die Höhe des Steuerelements so angepasst, dass Symbolzeilen anstelle von Textzeilen hineinpassen. Hinweis: Wenn Symbole zu den Zeilen einer ListView hinzugefügt werden, erhöht sich die Höhe jeder Zeile, wodurch diese Option ungenau wird.

Sort: Sortiert die Zeilen in alphabetischer Reihenfolge, basierend auf dem Inhalt der ersten Spalte.

SortDesc: Wie oben, aber in absteigender Reihenfolge.

WantF2: Geben Sie -WantF2 (minus WantF2) an, um den Benutzer daran zu hindern, die aktuell fokussierte Zeile 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 ListView-Styles.

Ansichtsmodi

Eine ListView hat fünf Ansichtsmodi. Der am häufigsten verwendete Modus ist die Report-Ansicht (Standardeinstellung). Um eine andere Ansicht zu verwenden, fügen Sie den entsprechenden Namen in die Optionsliste ein. Die Ansicht kann auch geändert werden, nachdem das Steuerelement erstellt wurde, zum Beispiel: LV.Opt("+IconSmall").

Icon: Große-Symbole-Ansicht. In dieser und allen anderen Ansichten außer Report sind nur die Texte der ersten Spalte sichtbar. Um Symbole in dieser Ansicht anzuzeigen, muss der ListView eine Große-Symbole-ImageList zugewiesen werden.

Tile: Große-Symbole-Ansicht, aber mit ergonomischen Unterschieden - z.B. wird der Text für jedes Element rechts vom Symbol angezeigt, nicht darunter. Checkboxen funktionieren nicht in dieser Ansicht.

IconSmall: Kleine-Symbole-Ansicht.

List: Kleine-Symbole-Ansicht im Listenformat, in der die Symbole in Spalten dargestellt werden. Die Anzahl der Spalten hängt von der Breite des Steuerelements und der Breite des breitesten darin enthaltenen Textelements ab.

Report: Wechselt zurück zur Report-Ansicht, was die Standardeinstellung für jede neue ListView ist. Zum Beispiel: LV.Opt("+Report").

Interne Methoden für ListViews

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

Der auf dieser Seite verwendete Begriff "Zeilennummer" bezieht sich auf die aktuelle Position einer Zeile innerhalb der ListView. Die erste/oberste Zeile ist 1, die zweite 2 und so weiter. Nachdem eine Zeile hinzugefügt wurde, kann sich die Zeilennummer durch Sortieren, Löschen und Einfügen anderer Zeilen ändern. Daher ist es ratsam, die GetText-Methode in einer Schleife zu verwenden, um bestimmte Zeilen anhand ihres Inhalts zu lokalisieren.

Zeilenmethoden:

Spaltenmethoden:

Abrufmethoden:

Sonstige Methoden:

Add

Fügt eine neue Zeile am Ende der Liste hinzu.

ZeileNummer := LV.Add(Optionen, Spalte1, Spalte2, ...)

Parameter

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.

Check: Zeigt ein Häkchen in der Zeile an (sofern die ListView über Checkboxen verfügt). Mit LV.Modify(ZeileNummer, "-Check") kann das Häkchen später wieder entfernt werden.

Col: Geben Sie das Wort Col an, unmittelbar gefolgt von der Spaltennummer, ab der die Parameter Spalte1 usw. angewendet werden sollen. Diese Option wird häufig in Verbindung mit der Modify-Methode verwendet, um einzelne Felder in einer Zeile zu ändern, ohne die Felder links davon zu beeinflussen.

Focus: Setzt den Tastaturfokus auf die Zeile (wird oft in Verbindung mit Select verwendet). Mit LV.Modify(ZeileNummer, "-Focus") kann der Fokus später wieder entfernt werden.

Icon: Geben Sie das Wort Icon an, unmittelbar gefolgt von der Nummer des Symbols, das links in der ersten Spalte dieser Zeile angezeigt werden soll. Wenn diese Option fehlt, wird das erste Symbol in der ImageList verwendet. Um ein leeres Symbol anzuzeigen, geben Sie -1 oder eine Zahl größer als die Anzahl der Symbole in der ImageList an. Wenn dem Steuerelement keine Kleine-Symbole-ImageList zugewiesen wurde, wird in der Report-Ansicht weder ein Symbol angezeigt noch Platz dafür reserviert.

Die Icon-Option akzeptiert eine 1-basierte Symbolnummer, die jedoch intern in eine 0-basierte Indexnummer übersetzt wird; so dass Icon0 der Konstanten I_IMAGECALLBACK entspricht, die normalerweise als -1 definiert ist, und Icon-1 der Konstanten I_IMAGENONE entspricht. Andere Werte, die außerhalb des Bereichs liegen, können dazu führen, dass anstelle des Symbols ein leeres Feld angezeigt wird.

Select: Wählt die Zeile aus. Mit LV.Modify(ZeileNummer, "-Select") kann die Zeile später wieder abgewählt werden. Beim Auswählen von Zeilen ist es ratsam, immer mindestens eine Zeile mit der Fokus-Eigenschaft zu versehen, damit die MENÜ-Taste ihr Kontextmenü (falls vorhanden) in der Nähe der fokussierten Zeile anzeigen kann. Direkt nach dem Wort Select kann optional eine 0 oder 1 angegeben werden, um den Startzustand zu bestimmen. Mit anderen Worten, "Select" ist dasselbe wie "Select" . VarEnthältEins (wobei der Punkt ein Verkettungsoperator ist). Dies funktioniert auch mit den obigen Optionen Focus und Check.

Vis: Scrollt die ListView bei Bedarf automatisch, um sicherzustellen, dass die angegebene Zeile vollständig sichtbar ist. Diese Option funktioniert nur mit LV.Modify, z.B. LV.Modify(ZeileNummer, "Vis").

Spalte1, Spalte2, ...

Typ: Zeichenkette

Die Spalten der neuen Zeile, die textuell oder numerisch sein können (einschließlich numerischer Ergebnisse von Ausdrücken). Um ein beliebiges Feld leer zu machen, geben Sie "" o.ä. an. Wenn zu wenige Felder zum Füllen aller Spalten vorhanden sind, werden die Spalten am Ende leer gelassen. Wenn zu viele Felder vorhanden sind, werden die Felder am Ende vollständig ignoriert.

Rückgabewert

Typ: Integer

Diese Methode gibt die neue Zeilennummer zurück. Beachten Sie, dass diese Zeilennummer nicht unbedingt die letzte Zeile repräsentiert, wenn die ListView mit der Sort- oder SortDesc-Option erstellt wurde.

Insert

Fügt eine neue Zeile an einer bestimmten Zeilennummer ein.

ZeileNummer := LV.Insert(ZeileNummer , Optionen, Spalte1, Spalte2, ...)

Parameter

ZeileNummer

Typ: Integer

Die Nummer der neuen Zeile, die eingefügt werden soll. Alle Zeilen, die auf oder unterhalb von ZeileNummer sind, werden nach unten verschoben, um Platz für die neue Zeile zu schaffen. Wenn ZeileNummer größer als die Anzahl der Zeilen in der Liste ist (sogar bis zu 2147483647), wird die neue Zeile am Ende der Liste hinzugefügt.

Optionen

Typ: Zeichenkette

Wenn leer oder weggelassen, werden standardmäßig keine Optionen verwendet. Andernfalls geben Sie eine oder mehrere Optionen aus der obigen Liste an.

Spalte1, Spalte2, ...

Typ: Zeichenkette

Die Spalten der neuen Zeile, die textuell oder numerisch sein können (einschließlich numerischer Ergebnisse von Ausdrücken). Um ein beliebiges Feld leer zu machen, geben Sie "" o.ä. an. Wenn zu wenige Felder zum Füllen aller Spalten vorhanden sind, werden die Spalten am Ende leer gelassen. Wenn zu viele Felder vorhanden sind, werden die Felder am Ende vollständig ignoriert.

Rückgabewert

Typ: Integer

Diese Methode gibt die angegebene Zeilennummer zurück.

Modify

Ändert die Attribute und/oder den Text einer Zeile.

LV.Modify(ZeileNummer , Optionen, NeueSpalte1, NeueSpalte2, ...)

Parameter

ZeileNummer

Typ: Integer

Die Nummer der Zeile, die geändert werden soll. Wenn 0, werden alle Zeilen im Steuerelement geändert.

Optionen

Typ: Zeichenkette

Wenn leer oder weggelassen, werden standardmäßig keine Optionen verwendet. Andernfalls geben Sie eine oder mehrere Optionen aus der obigen Liste an. Mit der Col-Option können bestimmte Spalten geändert werden, ohne die anderen zu beeinflussen.

NeueSpalte1, NeueSpalte2, ...

Typ: Zeichenkette

Die neuen Spalten der angegebenen Zeile, die textuell oder numerisch sein können (einschließlich numerischer Ergebnisse von Ausdrücken). Um ein beliebiges Feld leer zu machen, geben Sie "" o.ä. an. Wenn zu wenige Parameter zum Ändern aller Spalten vorhanden sind, bleiben die Spalten am Ende unverändert. Wenn zu viele Felder vorhanden sind, werden die Felder am Ende vollständig ignoriert.

Bemerkungen

Wenn nur die ersten zwei Parameter vorhanden sind, werden nur die Attribute der Zeile geändert, nicht der Inhalt ihrer Felder.

Delete

Löscht eine bestimmte Zeile oder alle Zeilen.

LV.Delete(ZeileNummer)

Parameter

ZeileNummer

Typ: Integer

Wenn weggelassen, werden alle Zeilen in der ListView gelöscht. Andernfalls geben Sie die Nummer der Zeile an, die gelöscht werden soll.

ModifyCol

Ändert die Attribute und/oder den Text einer bestimmten Spalte und ihrer Überschrift.

LV.ModifyCol(SpalteNummer, Optionen, SpalteTitel)

Parameter

SpalteNummer

Typ: Integer

Wenn dieser und alle anderen Parameter weggelassen werden, wird die Breite jeder Spalte an den Inhalt der Zeilen angepasst. Dies funktioniert nur in der Report-Ansicht.

Andernfalls geben Sie die Nummer der Spalte an, die geändert werden soll. Die erste Spalte ist 1 (nicht 0).

Optionen

Typ: Zeichenkette

Wenn weggelassen, wird standardmäßig Auto verwendet (die Breite der Spalte an den Inhalt ihrer Felder anpassen). 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.


Allgemeine Optionen:

N: Geben Sie für N die neue Breite der Spalte an (in Pixel). Diese Zahl muss nicht in Anführungszeichen gesetzt werden, wenn sie die einzige Option ist. Zum Beispiel: LV.ModifyCol(1, 50) und LV.ModifyCol(1, "50 Integer").

Auto: Passt die Breite der Spalte an den Inhalt ihrer Felder an. Dies funktioniert nur in der Report-Ansicht.

AutoHdr: Passt die Breite der Spalte an den Inhalt ihrer Felder und an den Inhalt ihrer Überschrift an, also je nachdem, welcher Inhalt breiter ist. Wird diese Option auf die letzte Spalte angewendet, wird diese mindestens so breit wie der gesamte restliche Platz in der ListView gemacht. In der Regel ist es ratsam, diese Option erst nach dem Hinzufügen der Zeilen anzuwenden, um den eventuell hinzugekommenen vertikalen Scrollbalken in die Größenberechnung mit einzubeziehen. Dies funktioniert nur in der Report-Ansicht.

Icon: Geben Sie das Wort Icon an, unmittelbar gefolgt von der Nummer des ImageList-Symbols, das neben der Spaltenüberschrift angezeigt werden soll. Geben Sie -Icon (minus Icon) an, um das Symbol wieder zu entfernen.

IconRight: Positioniert das Symbol auf der rechten statt linken Seite der Spalte.


Datentypoptionen:

Float: Bewirkt, dass die Felder der Spalte beim Sortieren als Floating-Point-Zahlen behandelt werden (hexadezimale Floating-Point-Zahlen werden nicht unterstützt). Float- und Text-Spalten werden bis zu 25-mal langsamer sortiert als Integer-Spalten.

Integer: Bewirkt, dass die Felder der Spalte beim Sortieren als Integer behandelt werden. Für eine korrekte Sortierung muss jeder Integer im 32-Bit-Bereich sein; also innerhalb des Bereiches von -2147483648 bis 2147483647. Jeder Wert, der kein Integer ist, wird bei der Sortierung als 0 behandelt (es sei denn, der Wert beginnt mit einer Zahl, dann wird diese verwendet). Die Zahlen können entweder dezimal oder hexadezimal (z.B. 0xF9E0) sein.

Text: Bewirkt, dass die Felder der Spalte beim Sortieren als Text behandelt werden, was die Standardeinstellung für jede neue Spalte ist. Nur die ersten 8190 Zeichen des Textes sind für die Sortierung relevant (es sei denn, die Logical-Option wird verwendet, dann liegt das Limit bei 4094).


Ausrichtungsoptionen:

Center: Zentriert den Text in der Spalte. Um eine Integer- oder Float-Spalte zu zentrieren, geben Sie das Wort Center nach dem Wort Integer oder Float an.

Left: Macht den Text der Spalte linksbündig, was die Standardeinstellung für jede neue Spalte ist. Bei älteren Betriebssystemen könnte die erste Spalte eine erzwungene Linksbündigkeit aufweisen.

Right: Macht den Text der Spalte rechtsbündig. Dieses Attribut muss nicht für Integer- und Float-Spalten angegeben werden, da diese standardmäßig rechtsbündig sind. Um diese Standardeinstellung zu überschreiben, können Sie z.B. "Integer Left" oder "Float Center" angeben.


Sortierungsoptionen:

Case: Die Sortierung der Spalte erfolgt Groß-/Kleinschreibung-sensitiv (betrifft nur Textspalten). Wenn die Optionen Case, CaseLocale und Logical weggelassen werden, werden die Großbuchstaben A bis Z und die entsprechenden Kleinbuchstaben bei der Sortierung als identisch betrachtet.

CaseLocale: Die Sortierung der Spalte erfolgt nicht Groß-/Kleinschreibung-sensitiv, gemäß den aktuellen Sprach- und Regionseinstellungen des Benutzers (betrifft nur Textspalten). Zum Beispiel behandeln die meisten englischen und westeuropäischen Sprach- und Regionseinstellungen die Großbuchstaben A bis Z, einschließlich ANSI-Großbuchstaben wie Ä und Ü, und die entsprechenden Kleinbuchstaben als identisch. Diese Methode verwendet auch eine "Wortsortierung", die Bindestriche und Apostrophe so behandelt, dass Wörter wie "coop" und "co-op" zusammenbleiben.

Desc: Absteigende Reihenfolge. Die Spalte erscheint in absteigender Reihenfolge, wenn der Benutzer sie zum ersten Mal sortiert.

Logical: Wie CaseLocale, außer dass alle Ziffernfolgen im Text als echte Zahlen und nicht als gewöhnliche Zeichen behandelt werden. Zum Beispiel wäre die Zeichenkette "T33" in diesem Fall größer als "T4". Logical und Case schließen sich gegenseitig aus - d.h. nur die zuletzt angegebene Option ist wirksam.

NoSort: Verhindert, dass ein Klick des Benutzers die Spalte automatisch sortiert. Das ColClick-Ereignis wird jedoch weiterhin ausgelöst, damit das Skript mit einer eigenen Sortierung oder einer anderen Aktion reagieren kann. Um die Sortierung nicht nur für einzelne, sondern für alle Spalten zu deaktivieren, fügen Sie NoSort in die Optionen der ListView ein.

Sort: Sortiert die Spalte sofort in aufsteigender Reihenfolge (selbst wenn sie die Desc-Option hat).

SortDesc: Sortiert die Spalte sofort in absteigender Reihenfolge.

Uni: Unidirektionale Sortierung. Verhindert, dass ein zweiter Klick auf dieselbe Spalte die Sortierrichtung umkehrt.

SpalteTitel

Typ: Zeichenkette

Wenn weggelassen, bleibt die aktuelle Überschrift unverändert. Andernfalls geben Sie die neue Spaltenüberschrift an.

InsertCol

Fügt eine neue Spalte an einer bestimmten Spaltennummer ein.

SpalteNummer := LV.InsertCol(SpalteNummer, Optionen, SpalteTitel)

Parameter

SpalteNummer

Typ: Integer

Wenn weggelassen oder größer als die Anzahl der Spalten im Steuerelement, wird die neue Spalte rechts neben der letzten Spalte hinzugefügt.

Andernfalls geben Sie die Nummer der neuen Spalte an, die eingefügt werden soll. Alle Spalten, die auf oder rechts von SpalteNummer sind, werden nach rechts verschoben, um Platz für die neue Spalte zu schaffen. Die erste Spalte ist 1 (nicht 0).

Optionen

Typ: Zeichenkette

Wenn weggelassen, beginnt die Spalte immer mit ihren Standardeinstellungen, z.B. ob sie Integer-Sortierung verwendet oder nicht. Andernfalls geben Sie eine oder mehrere Optionen aus der obigen Liste an.

SpalteTitel

Typ: Zeichenkette

Wenn leer oder weggelassen, wird standardmäßig eine leere Überschrift verwendet. Andernfalls geben Sie die Spaltenüberschrift an.

Rückgabewert

Typ: Integer

Diese Methode gibt die Positionsnummer der neuen Spalte zurück.

Bemerkungen

Der Inhalt der neuen Spalte ist vorerst leer, es sei denn, es handelt sich um die erste Spalte, dann wird der Inhalt der alten ersten Spalte in die neue kopiert und anschließend leer gemacht.

Eine ListView kann maximal 200 Spalten enthalten.

DeleteCol

Löscht eine bestimmte Spalte und deren Inhalt.

LV.DeleteCol(SpalteNummer)

Parameter

SpalteNummer

Typ: Integer

Die Nummer der Spalte, die gelöscht werden soll. Wenn eine Spalte gelöscht wird, wird die Nummer jeder Spalte auf der rechten Seite um 1 verringert. Ruft man zum Beispiel LV.DeleteCol(2) zweimal auf, würde dies dazu führen, dass die zweite und dritte Spalte gelöscht werden.

GetCount

Gibt die Anzahl der Zeilen oder Spalten im Steuerelement zurück.

Anzahl := LV.GetCount(Modus)

Parameter

Modus

Typ: Zeichenkette

Wenn leer oder weggelassen, gibt die Methode die Gesamtzahl der Zeilen im Steuerelement zurück. Andernfalls geben Sie eine der folgenden Zeichenketten an:

S oder Selected: Die Anzahl beinhaltet nur die ausgewählten/markierten Zeilen.

Col oder Column: Die Methode gibt die Anzahl der Spalten im Steuerelement zurück.

Rückgabewert

Typ: Integer

Diese Methode gibt die Anzahl der Zeilen oder Spalten im Steuerelement zurück. Der Wert wird immer sofort zurückgegeben, da das Steuerelement diese Zählungen zwischenspeichert.

Bemerkungen

Diese Methode wird oft in der obersten Zeile einer Schleife verwendet - in diesem Fall wird die Methode nur einmal aufgerufen (vor der ersten Wiederholung). Zum Beispiel:

Loop LV.GetCount()
{
    ErmittelterText := LV.GetText(A_Index)
    if InStr(AbgerufenerText, "beliebiger Filtertext")
        LV.Modify(A_Index, "Select")  ; Jede Zeile auswählen, deren erstes Feld den Filtertext enthält.
}

Um die Spaltenbreiten einer ListView abzurufen, z.B. um sie in einer INI-Datei zwischenzuspeichern, gehen Sie wie folgt vor:

Loop LV.GetCount("Column")
{
    SpalteBreite := SendMessage(0x101D, A_Index - 1, 0, LV)  ; 0x101D ist LVM_GETCOLUMNWIDTH.
    MsgBox("Die Spalte " A_Index " ist " SpalteBreite " Pixel breit.")
}

GetNext

Gibt die Zeilennummer der nächsten ausgewählten, abgehakten oder fokussierten Zeile zurück.

ZeileNummer := LV.GetNext(StartZeileNummer, ZeileTyp)

Parameter

StartZeileNummer

Typ: Integer

Wenn weggelassen oder kleiner als 1, beginnt die Suche bei der ersten Zeile in der Liste. Andernfalls geben Sie die Nummer der Zeile an, um die Suche bei der darauffolgenden Zeile zu beginnen.

ZeileTyp

Typ: Zeichenkette

Wenn leer oder weggelassen, sucht die Methode nach der nächsten ausgewählten/markierten Zeile (siehe das Beispiel unten). Andernfalls geben Sie eine der folgenden Zeichenketten an:

C oder Checked: Die nächste abgehakte Zeile suchen.

F oder Focused: Die fokussierte Zeile suchen. Es gibt nie mehr als eine fokussierte Zeile in der gesamten Liste, und manchmal gar keine.

Rückgabewert

Typ: Integer

Diese Methode gibt die Zeilennummer der nächsten ausgewählten, abgehakten oder fokussierten Zeile zurück. Wenn keine gefunden wird, gibt sie 0 zurück.

Bemerkungen

Das folgende Beispiel meldet alle ausgewählten Zeilen in der ListView:

ZeileNummer := 0  ; Die Suche bei der ersten Zeile beginnen.
Loop
{
    ZeileNummer := LV.GetNext(ZeileNummer)  ; Die Suche bei der nächsten Zeile fortsetzen.
    if not ZeileNummer  ; 0 zurückgegeben, also keine ausgewählten Zeilen mehr.
        break
    Text := LV.GetText(ZeileNummer)
    MsgBox('Die nächste ausgewählte Zeile ist Nr. ' ZeileNummer ', deren erstes Feld "' Text '" enthält.')
}

Das nächste Beispiel ist eine alternative Methode, um herauszufinden, ob eine bestimmte Zeilennummer abgehakt ist:

ElementZustand := SendMessage(0x102C, ZeileNummer - 1, 0xF000, LV)  ; 0x102C ist LVM_GETITEMSTATE. 0xF000 ist LVIS_STATEIMAGEMASK.
IstAbgehakt := (ElementZustand >> 12) - 1  ; Setzt IstAbgehakt auf 1 (true), wenn ZeileNummer abgehakt ist, andernfalls auf 0 (false).

GetText

Ruft den Text auf einer bestimmten Zeilen- und Spaltennummer ab.

Text := LV.GetText(ZeileNummer , SpalteNummer)
ZeileNummer

Typ: Integer

Die Nummer der Zeile, deren Text abgerufen werden soll. Wenn 0, wird die Spaltenüberschrift abgerufen.

SpalteNummer

Typ: Integer

Wenn weggelassen, wird standardmäßig 1 verwendet (der Text der ersten Spalte). Andernfalls geben Sie die Nummer der Spalte an, in der sich ZeileNummer befindet.

Rückgabewert

Typ: Zeichenkette

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

Bemerkungen

Die vom Skript gesehenen Spaltennummern bleiben unverändert, wenn der Benutzer die Spalten via Ziehen-und-Ablegen verschiebt. Zum Beispiel wäre die originale erste Spalte auch dann noch Nummer 1, wenn der Benutzer sie ganz nach rechts ziehen würde.

SetImageList

Setzt oder ersetzt eine ImageList zur Darstellung von Symbolen.

VorherigeImageListID := LV.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, werden die Symbole in der ImageList automatisch als groß oder klein erkannt. Andernfalls geben Sie 0 für große Symbole, 1 für kleine Symbole oder 2 für Zustandssymbole an (Zustandssymbole werden nur indirekt via SendMessage unterstützt).

Rückgabewert

Typ: Integer

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

Bemerkungen

Diese Methode wird normalerweise aufgerufen, bevor Zeilen zur ListView hinzugefügt werden. Sie weist der ListView eine ImageList zu, die zur Darstellung von Symbolen in den Zeilen (und optional in den Spaltenüberschriften) verwendet wird.

Einer ListView können maximal zwei ImageLists zugewiesen werden - eine ImageList für kleine Symbole und/oder eine für große Symbole. Dies ist nützlich, wenn das Skript dem Benutzer die Möglichkeit bietet, zwischen der Kleine-Symbole- und Große-Symbole-Ansicht umzuschalten. Um der ListView mehr als eine ImageList zuzuweisen, rufen Sie die SetImageList-Methode ein zweites Mal auf, mit der ImageList-ID der zweiten Liste. Eine ListView, die sowohl eine Kleine-Symbole- als auch Große-Symbole-ImageList verwendet, sollte sicherstellen, dass beide Listen die Symbole in der gleichen Reihenfolge enthalten. Der Grund dafür ist, dass dieselbe ID-Nummer verwendet wird, um sowohl auf die große als auch auf die kleine Version eines bestimmten Symbols zu verweisen.

Obwohl alle Ansichtsmodi außer Icon und Tile traditionell kleine Symbole anzeigen, kann dies überschrieben werden, indem eine Große-Symbole-ImageList an die SetImageList-Methode übergeben und als zweiter Parameter 1 (kleines Symbol) angegeben wird. Dadurch wird auch die Höhe jeder Zeile in der ListView erhöht, um Platz für das große Symbol zu schaffen.

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.
ColClickEine Spaltenüberschrift wurde 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.
ItemFocusEin anderes Element wurde fokussiert.
ItemSelectEin Element wurde aus- oder abgewä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.

ImageLists

Eine ImageList (übersetzt Bildliste) ist eine Gruppe von gleich großen Symbolen, die im Speicher abgelegt sind. Zu Beginn ist jede ImageList leer. Das Skript ruft IL_Add wiederholt auf, um Symbole zur Liste hinzuzufügen, wobei jedem Symbol eine fortlaufende Nummer zugewiesen wird, beginnend bei 1. Dies ist die Nummer, auf die sich das Skript bezieht, um ein bestimmtes Symbol in einer Zeile oder Spaltenüberschrift anzuzeigen. Das folgende Beispiel zeigt, wie Symbole in die Zeilen einer ListView eingefügt werden können:

MeineGui := Gui()  ; Ein MeineGui-Fenster erstellen.
LV := MeineGui.Add("ListView", "h200 w180", ["Symbol & Nummer","Beschreibung"])  ; Eine ListView erstellen.
ImageListID := IL_Create(10)  ; Eine ImageList erstellen, die 10 kleine Symbole fassen kann.
LV.SetImageList(ImageListID)  ; Die obige ImageList der aktuellen ListView zuweisen.
Loop 10  ; Die ImageList mit einer Reihe von Symbolen aus der DLL laden.
    IL_Add(ImageListID, "shell32.dll", A_Index) 
Loop 10  ; Zeilen zur ListView hinzufügen (eine pro Symbol zur Illustration).
    LV.Add("Icon" . A_Index, A_Index, "n/a")
MeineGui.Show

IL_Create

Erstellt eine neue ImageList, die zunächst leer ist.

ImageListID := IL_Create(AnfänglicheAnzahl, WachsendeAnzahl, GroßeSymbole)

Parameter

AnfänglicheAnzahl

Typ: Integer

Wenn weggelassen, wird standardmäßig 2 verwendet. Andernfalls geben Sie die Anzahl der Symbole an, die sofort in die Liste aufgenommen werden sollen.

WachsendeAnzahl

Typ: Integer

Wenn weggelassen, wird standardmäßig 5 verwendet. Andernfalls geben Sie die Anzahl der Symbole an, um die die Liste jedes Mal erweitert werden soll, wenn ihre Kapazität überschritten wird.

GroßeSymbole

Typ: Boolesch

Wenn weggelassen, wird standardmäßig false verwendet.

Wenn false, wird die ImageList kleine Symbole enthalten.

Wenn true, wird die ImageList große Symbole enthalten.

Symbole, die zur Liste hinzugefügt werden, werden automatisch skaliert, um den systeminternen Dimensionen für kleine und große Symbole zu entsprechen.

Rückgabewert

Typ: Integer

Bei Erfolg gibt diese Funktion die eindeutige ID der neuen ImageList zurück. Bei Misserfolg gibt sie 0 zurück.

IL_Add

Fügt ein Symbol oder Bild zu einer bestimmten ImageList hinzu.

SymbolIndex := IL_Add(ImageListID, SymbolDateiName , SymbolNummer)
SymbolIndex := IL_Add(ImageListID, BildDateiName, MaskeFarbe, Skalieren)

Parameter

ImageListID

Typ: Integer

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

SymbolDateiName

Typ: Zeichenkette

Der Name einer ICO- (Symbol), CUR- (Cursor) oder ANI-Datei (animierter Cursor, wird aber in einer ListView nicht animiert), oder ein Symbol-Handle wie "HICON:" handle. Die folgenden Dateitypen sind ebenfalls für Symbole geeignet: EXE, DLL, CPL, SCR und andere Typen, die Symbolressourcen enthalten.

SymbolNummer

Typ: Integer

Wenn weggelassen, wird standardmäßig 1 verwendet (die erste Symbolgruppe). Andernfalls geben Sie die Nummer der Symbolgruppe an, die in der Datei verwendet werden soll. Wenn die Nummer negativ ist, wird ihr Absolutwert als Ressourcen-ID eines Symbols innerhalb einer EXE-Datei vermutet. Das folgende Beispiel lädt das Standardsymbol aus der zweiten Symbolgruppe: IL_Add(ImageListID, "C:\Meine Anwendung.exe", 2).

BildDateiName

Typ: Zeichenkette

Der Name eines Nicht-Symbol-Bildes wie BMP, GIF, JPG, PNG, TIF, Exif, WMF und EMF oder ein Bitmap-Handle wie "HBITMAP:" handle.

MaskeFarbe

Typ: Integer

Die Zahl der Farbmaske/Transparenzfarbe. 0xFFFFFF (die Farbe weiß) ist für die meisten Bilder am besten geeignet.

Skalieren

Typ: Boolesch

Wenn true, wird das Bild auf die Größe eines Symbols skaliert.

Wenn false, wird das Bild in so viele Symbole wie möglich aufgeteilt.

Rückgabewert

Typ: Integer

Bei Erfolg gibt diese Funktion die Indexnummer des neuen Symbols zurück (1 ist das erste Symbol, 2 das zweite usw.). Bei Misserfolg gibt sie 0 zurück.

IL_Destroy

Löscht eine bestimmte ImageList.

IstZerstört := IL_Destroy(ImageListID)

Parameter

ImageListID

Typ: Integer

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

Rückgabewert

Typ: Integer (boolesch)

Bei Erfolg gibt diese Funktion 1 (true) zurück. Bei Misserfolg gibt sie 0 (false) zurück.

Bemerkungen

Es ist normalerweise nicht notwendig, ImageLists zu zerstören, da sie, wenn sie einmal mit einer ListView verbunden sind, automatisch zerstört werden, wenn die ListView oder ihr übergeordnetes Fenster zerstört wird. Wenn die ListView ihre ImageLists mit anderen ListViews teilt (indem sie 0x40 in ihren Optionen hat), sollte das Skript die ImageList explizit zerstören, nachdem es alle ListViews zerstört hat, die diese ImageList verwenden. Entsprechend sollte das Skript, wenn es eine der alten ImageLists mit einer neuen ersetzt, die alte explizit zerstören.

Bemerkungen

Gui.Submit funktioniert nicht mit einem ListView-Steuerelement.

Nachdem eine Spalte sortiert wurde - z.B. durch Anklicken der Spaltenüberschrift oder Aufruf von LV.ModifyCol(1, "Sort") - erscheinen alle danach hinzugefügten Zeilen am Ende der Liste, anstatt die aktuelle Sortierreihenfolge zu berücksichtigen. Es sei denn, die Styles Sort und SortDesc werden verwendet, dann werden neue Zeilen an die korrekten Positionen verschoben.

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

MeineGui.Add("Button", "Hidden Default", "OK").OnEvent("Click", LV_Enter)
...
LV_Enter(*) {
    global
    if MeineGui.FocusedCtrl != LV
        return
    MsgBox("Sie haben ENTER gedrückt. Die Nummer der fokussierten Zeile ist " LV.GetNext(0, "Focused"))
}

Zusätzlich zur zeilenweisen Navigation mit der Tastatur kann der Benutzer auch eine inkrementelle Suche durchführen, indem er die ersten paar Zeichen eines in der ersten Spalte befindlichen Elements eingibt. Dadurch springt die Auswahl auf die nächst passende Zeile.

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

Obwohl die maximale Anzahl von Zeilen in einer ListView nur durch den verfügbaren Systemspeicher begrenzt ist, gibt es Möglichkeiten, die Performanz beim Hinzufügen von Zeilen erheblich zu verbessern. Einige davon finden Sie unter Count.

Es ist möglich, ein Bild als Hintergrund um eine ListView herum zu verwenden (also um die ListView damit einzurahmen). Um das zu realisieren, erstellen Sie ein Picture-Steuerelement nach der ListView und fügen Sie 0x4000000 (WS_CLIPSIBLINGS) in dessen Optionen ein.

Ein Skript kann mehr als eine ListView pro Fenster erstellen.

Es ist ratsam, Spalten nicht direkt mit SendMessage einzufügen oder zu löschen. Der Grund dafür ist, dass das Programm für jede Spalte eine Sammlung von Sortiereinstellungen verwaltet und diese dann nicht mehr synchron wären. Verwenden Sie stattdessen die internen Spaltenmethoden.

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

Mit ListViewGetContent können Texte aus externen ListViews (die nicht zum Skript gehören) extrahiert werden.

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

Beispiele

Wählt alle Zeilen aus oder ab, durch Angabe von 0 als Zeilennummer.

LV.Modify(0, "Select")   ; Alle auswählen.
LV.Modify(0, "-Select")  ; Alle abwählen.
LV.Modify(0, "-Check")  ; Die Häkchen von allen CheckBoxes entfernen.

Passt die Breite aller Spalten automatisch an ihren Inhalt an.

LV.ModifyCol  ; Es gibt keine Parameter in diesem Modus.

Das folgende Beispiel ist ein lauffähiges Skript, das umfangreicher ist als das obige Beispiel. Es zeigt die Dateien eines vom Benutzer ausgewählten Ordners an und weist jeder Datei je nach Typ das entsprechende Symbol zu. Der Benutzer kann eine Datei doppelt anklicken, um sie zu öffnen, oder eine oder mehrere Dateien rechtsklicken, um ein Kontextmenü anzuzeigen.

; Ein GUI-Fenster erstellen:
MeineGui := Gui("+Resize")  ; Dem Benutzer erlauben, das Fenster zu maximieren oder dessen Größe zu ändern.

; Einige Schaltflächen erstellen:
B1 := MeineGui.Add("Button", "Default", "Ordner laden")
B2 := MeineGui.Add("Button", "x+20", "Liste leeren")
B3 := MeineGui.Add("Button", "x+20", "Ansicht wechseln")

; ListView und ihre Spalten via MeineGui.Add erstellen:
LV := MeineGui.Add("ListView", "xm r20 w700", ["Name","Ordner","Größe (KB)","Typ"])
LV.ModifyCol(3, "Integer")  ; Aus Sortierungsgründen die Spalte "Größe" als Integer kennzeichnen.

; Eine ImageList erstellen, damit die ListView einige Symbole anzeigen kann:
ImageListID1 := IL_Create(10)
ImageListID2 := IL_Create(10, 10, true)  ; Eine Liste von großen Symbolen, analog zu den kleinen.

; Die ImageLists mit der ListView verbinden, damit diese später die Symbole anzeigen kann:
LV.SetImageList(ImageListID1)
LV.SetImageList(ImageListID2)

; Steuerelementereignisse hinzufügen:
LV.OnEvent("DoubleClick", DateiAusführen)
LV.OnEvent("ContextMenu", KontextmenüAnzeigen)
B1.OnEvent("Click", OrdnerLaden)
B2.OnEvent("Click", (*) => LV.Delete())
B3.OnEvent("Click", AnsichtWechseln)

; Fensterereignisse hinzufügen:
MeineGui.OnEvent("Size", Gui_Size)

; Ein Kontextmenü erstellen:
Kontextmenü := Menu()
Kontextmenü.Add("Öffnen", KontextÖffnenOderEigenschaften)
Kontextmenü.Add("Eigenschaften", KontextÖffnenOderEigenschaften)
Kontextmenü.Add("Aus der ListView entfernen", KontextZeilenLöschen)
Kontextmenü.Default := "Öffnen"  ; "Öffnen" in fetter Schrift darstellen, um zu kennzeichnen, dass ein Doppelklick dasselbe bewirkt.

; Fenster anzeigen:
MeineGui.Show()

OrdnerLaden(*)
{
    static SymbolMap := Map()
    MeineGui.Opt("+OwnDialogs")  ; Den Benutzer zwingen, das folgende Dialogfenster zu schließen, bevor er das Hauptfenster nutzen kann.
    Ordner := DirSelect(, 3, "Wählen Sie einen Ordner zum Einlesen aus:")
    if not Ordner  ; Der Benutzer hat das Dialogfenster abgebrochen.
        return

    ; Prüfen, ob das letzte Zeichen im Ordnernamen ein umgekehrter Schrägstrich ist,
    ; was bei Root-Verzeichnissen wie C:\ vorkommt. Trifft dies zu, entfernen, um doppelte Schrägstriche zu vermeiden.
    if SubStr(Ordner, -1, 1) = "\"
        Ordner := SubStr(Ordner, 1, -1)  ; Schrägstrich am Ende entfernen.

    ; Erforderliche Puffergröße für die SHFILEINFO-Struktur berechnen.
    sfi_größe := A_PtrSize + 688
    sfi := Buffer(sfi_größe)

    ; Eine Liste von Dateinamen zusammenstellen und zur ListView hinzufügen:
    LV.Opt("-Redraw")  ; Performanz verbessern durch Abschalten von Redraw beim Laden.
    Loop Files, Ordner "\*.*"
    {
        DateiName := A_LoopFilePath  ; Muss für unten in eine beschreibbare Variable gespeichert werden.

        ; Eindeutige Endungs-ID erstellen, um Zeichen zu vermeiden, die in Variablennamen
        ; illegal sind, wie z.B. Bindestriche. Außerdem ist diese Methode performanter,
        ; weil das Auffinden eines Elements in einem Array keine Suchschleife erfordert.
        SplitPath(DateiName,,, &DateiEndung)  ; Endung der Datei ermitteln.
        if DateiEndung ~= "i)\A(EXE|ICO|ANI|CUR)\z"
        {
            EndungID := DateiEndung  ; Spezial-ID als Platzhalter.
            SymbolNummer := 0  ; Als nicht gefunden markieren, so dass diese Typen jeweils ein eindeutiges Symbol haben können.
        }
        else  ; Irgendeine andere Endung/Dateityp, also ihre eindeutige ID berechnen.
        {
            EndungID := 0  ; Initialisieren, um Endungen zu behandeln, die kürzer sind als andere.
            Loop 7     ; Endung auf 7 Zeichen limitieren, damit sie in einem 64-Bit-Wert passt.
            {
                EndungZeichen := SubStr(DateiEndung, A_Index, 1)
                if not EndungZeichen  ; Keine weiteren Zeichen.
                    break
                ; Eindeutige ID ableiten, indem jedem Zeichen eine andere Bitposition zugewiesen wird:
                EndungID := EndungID | (Ord(EndungZeichen) << (8 * (A_Index - 1)))
            }
            ; Prüfen, ob diese Dateiendung bereits ein Symbol in den ImageLists hat.
            ; Ist dies der Fall, können mehrere Aufrufe verhindert und die Ladeperformanz
            ; deutlich verbessert werden, insbesondere bei Ordnern mit sehr vielen Dateien:
            SymbolNummer := SymbolMap.Has(EndungID) ? SymbolMap[EndungID] : 0
        }
        if not SymbolNummer  ; Es gibt noch kein Symbol für diese Endung, also laden.
        {
            ; Hochqualitatives kleines Symbol abrufen, das mit dieser Dateieendung verknüpft ist:
            if not DllCall("Shell32\SHGetFileInfoW", "Str", DateiName
            , "Uint", 0, "Ptr", sfi, "UInt", sfi_größe, "UInt", 0x101)  ; 0x101 ist SHGFI_ICON+SHGFI_SMALLICON
                SymbolNummer := 9999999  ; Eine Nummer außerhalb des gültigen Bereichs setzen, um ein leeres Symbol anzuzeigen.
            else ; Symbol erfolgreich geladen.
            {
                ; hIcon-Element aus der Struktur extrahieren:
                hIcon := NumGet(sfi, 0, "Ptr")
                ; HICON direkt zur Kleine-Symbole- und Große-Symbole-Liste hinzufügen.
                ; Unten +1 verwenden, um den Rückgabeindex in 1-basiert umzuwandeln:
                SymbolNummer := DllCall("ImageList_ReplaceIcon", "Ptr", ImageListID1, "Int", -1, "Ptr", hIcon) + 1
                DllCall("ImageList_ReplaceIcon", "Ptr", ImageListID2, "Int", -1, "Ptr", hIcon)
                ; Da es in die ImageLists kopiert wurde, sollte das Original zerstört werden:
                DllCall("DestroyIcon", "Ptr", hIcon)
                ; Symbol zwischenspeichern, um Speicherbedarf zu reduzieren und Ladeperformanz zu verbessern:
                SymbolMap[EndungID] := SymbolNummer
            }
        }

        ; Neue Zeile hinzufügen und ihr die oben ermittelte Symbolnummer zuweisen:
        LV.Add("Icon" . SymbolNummer, A_LoopFileName, A_LoopFileDir, A_LoopFileSizeKB, DateiEndung)
    }
    LV.Opt("+Redraw")  ; Neuzeichnung reaktivieren (wurde oben deaktiviert).
    LV.ModifyCol()  ; Breite jeder Spalte an ihren Inhalt anpassen.
    LV.ModifyCol(3, 65)  ; Die Spalte "Größe" etwas breiter machen, um die Kopfzeile sichtbar zu machen.
}

AnsichtWechseln(*)
{
    static SymbolAnsicht := false
    if not SymbolAnsicht
        LV.Opt("+Icon")        ; Zur Symbolansicht wechseln.
    else
        LV.Opt("+Report")      ; Zur Detailansicht zurückwechseln.
    SymbolAnsicht := not SymbolAnsicht   ; Fürs nächste Mal umkehren.
}

DateiAusführen(LV, ZeileNummer)
{
    DateiName := LV.GetText(ZeileNummer, 1) ; Text des ersten Feldes abrufen.
    DateiVerz := LV.GetText(ZeileNummer, 2)  ; Text des zweiten Feldes abrufen.
    try
        Run(DateiVerz "\" DateiName)
    catch
        MsgBox(DateiVerz "\" DateiName " konnte nicht geöffnet werden.")
}

KontextmenüAnzeigen(LV, Element, IstRechtsklick, X, Y)  ; Bei einem Rechtsklick oder MENÜ-Tastendruck.
{
    ; Das Menü auf den Koordinaten X und Y anzeigen. Diese Koordinaten
    ; sind auch dann korrekt, wenn der Benutzer die MENÜ-Taste drückt:
    Kontextmenü.Show(X, Y)
}

KontextÖffnenOderEigenschaften(PunktName, *)  ; Der Benutzer hat "Öffnen" oder "Eigenschaften" im Kontextmenü ausgewählt.
{
    ; Nur mit der fokussierten Zeile arbeiten, nicht mit allen ausgewählten Zeilen:
    FokussierteZeileNr := LV.GetNext(0, "F")  ; Die fokussierte Zeile finden.
    if not FokussierteZeileNr  ; Keine Zeile fokussiert.
        return
    DateiName := LV.GetText(FokussierteZeileNr, 1) ; Text des ersten Feldes abrufen.
    DateiVerz := LV.GetText(FokussierteZeileNr, 2)  ; Text des zweiten Feldes abrufen.
    try
    {
        if (PunktName = "Öffnen")  ; Benutzer hat "Öffnen" im Kontextmenü ausgewählt.
            Run(DateiVerz "\" DateiName)
        else
            Run("properties " DateiVerz "\" DateiName)
    }
    catch
        MsgBox("Gewünschte Aktion konnte nicht auf " DateiVerz "\" DateiName " angewendet werden.")
}

KontextZeilenLöschen(*)  ; Der Benutzer hat "Leeren" im Kontextmenü ausgewählt.
{
    ZeileNummer := 0  ; Die Suche bei der ersten Zeile beginnen.
    Loop
    {
        ; Da das Löschen einer Zeile die Zeilennummer aller anderen Zeilen darunter
        ; verringert, 1 subtrahieren, damit die Suche die zuvor gefundene Zeilennummer
        ; einbezieht (falls benachbarte Zeilen ausgewählt sind):
        ZeileNummer := LV.GetNext(ZeileNummer - 1)
        if not ZeileNummer  ; 0 zurückgegeben, also keine ausgewählten Zeilen mehr.
            break
        LV.Delete(ZeileNummer)  ; Die Zeile aus der ListView entfernen.
    }
}

Gui_Size(thisGui, MinMax, Breite, Höhe)  ; ListView 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. ListView-Größe entsprechend anpassen.
    LV.Move(,, Breite - 20, Höhe - 40)
}