ListView

Inhaltsverzeichnis

Einführung und einfaches Beispiel

ListView ist eines der umfangreichsten Steuerelemente, das vom Betriebssystem zur Verfügung gestellt wird. In seiner bekanntesten Form zeigt es eine tabellarische Ansicht mit Reihen und Spalten an - das bekannteste Beispiel davon ist die Listenansicht des Explorers (Detailansicht).

Eine typische ListView sieht wie folgt aus:

ListView

Zwar muss man sich erst einlesen, aber die grundlegenden Features einer ListView sind einfach zu bedienen. Die Syntax zum Erstellen einer ListView ist:

Gui, Add, ListView, Optionen, Spaltentitel1|Spaltentitel2|...

Das folgende Beispiel zeigt, wie eine ListView erstellt und angezeigt werden kann, die eine Liste mit Dateien aus dem Benutzerordner "Eigene Dokumente" enthält:

; Erstellt eine ListView mit den zwei Spalten, Name und Größe:
Gui, Add, ListView, r20 w700 gMeineListView, Name|Größe (KB)

; Sammelt eine Liste mit Dateien von einem Ordner und fügt sie in die ListView ein:
Loop, %A_MyDocuments%\*.*
    LV_Add("", A_LoopFileName, A_LoopFileSizeKB)

LV_ModifyCol()  ; Passt die Breiten der Spalten an den Inhalt der Reihen an.
LV_ModifyCol(2, "Integer")  ; Kennzeichnet aus Sortierungsgründen die Spalte 2 als Integer.

; Zeigt das Fenster an und geht in den Leerlauf. Das Skript wird benachrichtigt, wann immer der Benutzer eine Reihe doppelt anklickt.
Gui, Show
return

MeineListView:
if (A_GuiEvent = "DoubleClick")
{
    LV_GetText(Reihentext, A_EventInfo)  ; Ermittelt den Text aus dem ersten Feld der Reihe.
    ToolTip Sie haben die Reihe %A_EventInfo% doppelt angeklickt. Text: "%Reihentext%"
}
return

GuiClose:  ; Kennzeichnet, dass das Skript automatisch beim Schließen des Fensters beendet werden sollte.
ExitApp

Optionen und Styles für "Gui, Add, ListView, Optionen"

AltSubmit: Meldet dem Skript mehr ListView-Ereignisse als normal. Das heißt, dass das g-Label öfters gestartet wird. Siehe ListView-Benachrichtigungen für Details.

Background: Geben Sie das Wort Background an und fügen Sie direkt danach einen Farbnamen (siehe Farbentabelle) oder einen RGB-Wert (das 0x-Präfix ist optional) ein. Beispiele: BackgroundSilver, BackgroundFFDD99. Fehlt diese Option, verwendet ListView als Hintergrundfarbe standardmäßig die im letzten Parameter von Gui Color definierte Farbe (wenn keine definiert ist, dann die Standardhintergrundfarbe des Systems). Mit BackgroundDefault kann die Standardhintergrundfarbe des Systems gesetzt werden (in der Regel weiß). Zum Beispiel könnte man die Standardfarbe von ListView via GuiControl, +BackgroundDefault, MeineListView wiederherstellen.

C: Textfarbe. Geben Sie den Buchstaben C an und fügen Sie direkt danach einen Farbnamen (siehe Farbentabelle) oder einen RGB-Wert (das 0x-Präfix ist optional) ein. Beispiele: cRed, cFF2211, c0xFF2211, cDefault.

Checked: Stellt eine nicht-abgehakte CheckBox auf der linken Seite jeder Reihe bereit. Beim Hinzufügen einer Reihe kann das Wort Check in den Optionen angegeben werden, um die CheckBox zu Beginn im abgehakten Zustand anzuzeigen. Der Benutzer kann die CheckBox entweder anklicken oder die Leertaste drücken, um sie in den abgehakten oder nicht-abgehakten Zustand zu versetzen.

Count: Geben das Wort Count an und fügen Sie direkt danach die Anzahl der Reihen ein, die die ListView letztendlich enthalten soll. Diese Gesamtanzahl ist kein Limit: Nach Erreichen dieser Anzahl können weiterhin neue Reihen hinzugefügt werden. Stattdessen dient diese Option eher als Hinweis für das Steuerelement, dass es den Speicher nur einmal bereitstellen muss, anstatt jedes Mal, wenn eine neue Reihe hinzugefügt wird. Dies verbessert deutlich die Performance beim Hinzufügen neuer Reihen (es könnte auch die Performance beim Sortieren verbessern). Um die Performance weiter zu verbessern, nutzt man GuiControl, -Redraw, MeineListView, bevor eine große Anzahl von Reihen hinzugefügt werden. Verwenden Sie anschließend GuiControl, +Redraw, MeineListView, um das Neuzeichnen wieder zu aktivieren (was auch das Steuerelement neu zeichnet).

Grid: Stellt horizontale und vertikale Linien bereit, um die Abgrenzungen zwischen den Reihen und Spalten hervorzuheben.

Hdr: Geben Sie -Hdr (minus Hdr) an, um die Spaltenüberschriften zu verstecken. Mit GuiControl, +Hdr, MeineListView können die Spaltenüberschriften später wieder sichtbar gemacht werden.

LV: Geben Sie die Zeichenkette LV an und fügen Sie direkt danach die Nummer eines erweiterten ListView-Styles ein. Diese Styles unterscheiden sich vollständig von den gewöhnlichen erweiterten Styles. Zum Beispiel würde -E0x200 den generischen erweiterten Style WS_EX_CLIENTEDGE entfernen, um den Standardrahmen des Steuerelements zu beseitigen. -LV0x20 würde hingegen LVS_EX_FULLROWSELECT entfernen.

LV0x10: Geben Sie -LV0x10 an, um die Möglichkeit zu entfernen, die Spaltenüberschriften nach links oder rechts zu verschieben, um sie neu zu ordnen. Normalerweise ist das in der Regel nicht notwendig, weil die physische Neuanordnung der Spalten keinen Einfluss auf die vom Skript gesehene Spaltenanordnung hat. Zum Beispiel würde das Skript die erste Spalte immer als Spalte 1 sehen, selbst wenn der Benutzer sie physisch nach rechts verschoben hat.

LV0x20: Geben Sie -LV0x20 an, damit eine Reihe nur ausgewählt werden kann, wenn ihr erstes Feld angeklickt wird (normalerweise können alle Felder angeklickt werden, um die Reihe auszuwählen). Der Vorteil davon ist, dass der Benutzer leichter ein Rechteck über mehrere Reihen ziehen kann, um sie auszuwählen.

Multi: Geben Sie -Multi (minus Multi) an, um die Möglichkeit zu entfernen, mehr als eine Reihe auszuwählen.

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

NoSort: Deaktiviert die automatische Sortierung, die auftritt, wenn der Benutzer eine Spaltenüberschrift anklickt. Die Spaltenüberschrift verhält sich in visueller Hinsicht aber immer noch wie eine Schaltfläche (sofern NoSortHdr nicht vorhanden ist). Darüber hinaus erhält das g-Label weiterhin die ColClick-Benachrichtigung, mit der das Label eine benutzerdefinierte Sortierung oder andere Aktion durchführen könnte.

ReadOnly: Geben Sie -ReadOnly (minus ReadOnly) an, um den Text in der ersten Spalte editierbar zu machen. Um eine Reihe zu editieren, wählt man sie aus und drückt die F2-Taste (siehe die WantF2-Option unten). Oder wählen Sie eine Reihe per Linksklick aus, warten Sie mindestens eine halbe Sekunde, und klicken Sie dann die gleiche Reihe nochmals an, um sie editieren zu können.

R: Reihen-Höhe (bei der Erstellung). Geben Sie den Buchstaben R an und fügen Sie direkt danach die Anzahl der Reihen ein, für die innerhalb des Steuerelements Platz geschaffen werden soll. Zum Beispiel würde R10 das Steuerelement 10 Reihen hoch machen. Falls das ListView mit einer anderen Anzeigemethode als Report erstellt wurde, wird die Größe des Steuerelements angepasst, so dass Symbolreihen anstelle von Textreihen hineinpassen. Hinweis: Fügt man Symbole in den Reihen einer ListView ein, wird die Höhe jeder Reihe zunehmen, wodurch diese Option ungenau wird.

Sort: Das Steuerelement wird in Bezug zu den Inhalten der ersten Spalte alphabetisch sortiert.

SortDesc: Das gleiche wie oben, nur in absteigender Reihenfolge.

WantF2 [v1.0.44+]: Geben Sie -WantF2 (minus WantF2) an, um die Möglichkeit zu entfernen, die aktuell fokussierte Reihe via F2-Taste zu editieren. Diese Einstellung wird ignoriert, wenn -ReadOnly auch angegeben ist. Abgesehen von dieser Einstellung erhält das g-Label weiterhin F2-Benachrichtigungen.

(Namenlose numerische Styles): Da die restlichen Styles nur selten verwendet werden, haben sie keine Namen. In der ListView-Style-Tabelle finden Sie eine Liste mit Styles.

Anzeigemethoden

Eine ListView hat fünf Anzeigemethoden, von denen die Report-Ansicht am häufigsten verwendet wird (Standardeinstellung). Um eine der anderen Ansichten zu nutzen, fügt man ihr Name in den Optionen ein. Die Ansicht kann auch geändert werden, nachdem das Steuerelement erstellt wurde. Zum Beispiel: GuiControl, +IconSmall, MeineListView.

Icon: Zeigt eine Große-Symbole-Ansicht. In dieser und allen anderen Ansichten - außer Report - sind nur die Texte der ersten Spalte sichtbar. Um Symbole in diesem Modus darzustellen, muss der ListView eine ImageList mit großen Symbolen zugewiesen werden.

Tile: Zeigt eine Große-Symbole-Ansicht, aber mit ergonomischen Unterschieden - zum Beispiel wird der Text von jedem Element auf der rechten statt unteren Seite des Symbols dargestellt. Checkboxes funktionieren nicht in dieser Ansicht. Auch der Versuch, diese Ansicht auf Betriebssystemen älter als Windows XP anzuzeigen, bleibt wirkungslos.

IconSmall: Zeigt eine Kleine-Symbole-Ansicht.

List: Zeigt eine 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 längsten Texteintrags ab.

Report: Wechselt wieder zur Report-Ansicht (in moderneren Windows-Versionen auch als Details-Ansicht bekannt), die zu Beginn die Standardeinstellung ist. Zum Beispiel: GuiControl, +Report, MeineListView.

Interne Funktionen für ListView

Alle ListView-Funktionen agieren mit dem Standard-GUI-Fenster des aktuellen Threads (das mit Gui, 2:Default geändert werden kann). Wenn das Standardfenster weder vorhanden ist noch ListView-Steuerelemente hat, geben alle Funktionen null zurück, um das Problem zu kennzeichnen.

Wenn das Fenster mehrere ListView-Steuerelemente hat, agieren die Funktionen standardmäßig mit dem zuletzt hinzugefügten Steuerelement. Um das zu ändern, nutzt man Gui, ListView, ListViewName - ListViewName kann ListView's zugeordnete Variable, ClassNN (wie vom internen Tool Window Spy gezeigt) oder [in v1.1.04+] HWND sein. Einmal geändert, werden alle vorhandenen und zukünftigen Threads die angegebene ListView verwenden. [v1.1.23+]: A_DefaultListView enthält die aktuelle Einstellung.

Der auf dieser Seite verwendete Begriff "Reihennummer" bezieht sich auf die aktuelle Position einer Reihe innerhalb des ListViews. Die oberste Reihe ist 1, die zweite Reihe ist 2 und so weiter. Nachdem eine Reihe hinzugefügt wurde, neigen sie dazu, aufgrund von Sortieren, Löschen und Einfügen von anderen Reihen geändert zu werden. Um daher eine oder mehrere Reihen basierend auf ihre Inhalte zu lokalisieren, ist es am besten, LV_GetText() in einer Schleife zu verwenden.

Hinzufügen, Modifizieren und Entfernen von Reihen

Spalten-Funktionen

Daten aus einer ListView bekommen

Symbole setzen

LV_Add

Fügt eine neue Reihe an das untere Ende der Liste ein.

LV_Add(Optionen, Feld1, Feld2, ...)

Die Parameter Feld1 und so weiter sind die Spalten der neuen Reihe, die Text oder numerisch sein können (einschließlich numerische Ergebnisse von Ausdrücken). Um ein beliebiges Feld leer zu machen, fügt man "" oder Gleichwertiges ein. Falls zu wenig Felder zum Füllen der Spalten vorhanden sind, bleiben die Spalten am Ende leer. Zuviel angegebene Felder werden einfach ignoriert.

Bei Misserfolg gibt LV_Add() eine 0 zurück. Bei Erfolg gibt sie die neue Reihennummer zurück, die aber nicht unbedingt die letzte Reihe repräsentiert, wenn ListView den Sort- oder SortDesc-Style hat.

Reihen-Optionen

Der Optionen-Parameter kann eine Zeichenkette mit null oder mehreren Wörtern aus der unteren Liste sein (nicht Groß-/Kleinschreibung-sensitiv). Trennen Sie alle Wörter jeweils mit einem Leer- oder Tabulatorzeichen. Um eine Option zu entfernen, muss ein Minuszeichen davor gesetzt werden. Um eine Option hinzuzufügen, lässt man das Vorzeichen weg oder setzt ein Pluszeichen davor.

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

Col: Geben Sie das Wort Col und direkt danach die Spaltennummer an, um den Startpunkt für die Parameter Spalte1 und so weiter zu bestimmen. Diese Option wird häufig in Verbindung mit LV_Modify() verwendet, um einzelne Felder in einer Reihe zu ändern, ohne dabei Felder zu beeinflussen, die links danebenliegen.

Focus: Setzt den Tastaturfokus auf die Reihe (wird oft in Verbindung mit Select verwendet). Mit LV_Modify(Reihennummer, "-Focus") kann der Fokus später entfernt werden.

Icon: Geben Sie das Wort Icon und direkt danach eine Symbolnummer an, um ein Symbol auf der linken Seite der ersten Spalte dieser Reihe anzuzeigen. Fehlt diese Option, wird das erste Symbol aus der ImageList verwendet. Um ein leeres Symbol darzustellen, fügt man eine Nummer ein, die größer ist als die Anzahl der Symbole in der ImageList. Fehlt dem Steuerelement eine ImageList mit kleinen Symbolen, wird weder ein Symbol angezeigt noch dafür Platz in der Report-Ansicht reserviert.

Select: Wählt die Reihe aus. Mit LV_Modify(Reihennummer, "-Select") kann die Auswahl später aufgehoben werden. Beim Auswählen der Reihen sollte man am besten sicherstellen, dass immer mindestens eine Reihe die Fokus-Eigenschaft hat, damit die MENÜ-Taste ihr Kontextmenü (falls vorhanden) in der Nähe der fokussierten Reihe anzeigen kann. Direkt nach dem Wort Select kann optional eine 0 oder 1 erfolgen, um den Startzustand zu bestimmen. In diesem Fall ist "Select" das gleiche wie "Select" . VarEnthältEins (der hier verwendete Punkt ist ein Verkettungsoperator). Diese Vorgehensweise funktioniert auch bei Focus und Check.

Vis [v1.0.44+]: Sorgt dafür, dass eine bestimmte Reihe durch Scrollen der ListView komplett sichtbar ist, falls notwendig. Diese Option funktioniert nur mit LV_Modify(); zum Beispiel: LV_Modify(Reihennummer, "Vis").

LV_Insert

Fügt eine neue Reihe vor einer bestimmten Reihe ein.

LV_Insert(Reihennummer , Optionen, Spalte1, Spalte2, ...)

Verhält sich genauso wie LV_Add(), mit Ausnahme des ersten Parameters, der die Reihennummer für die neu eingefügte Reihe ist. Alle Reihen, die auf oder unterhalb der Reihennummer sind, werden nach unten verschoben, um Platz für die neue Reihe zu schaffen. Wenn Reihennummer größer als die Anzahl der Reihen in der Liste ist (sogar so hoch wie 2147483647), wird die neue Reihe an das untere Ende der Liste gesetzt. Als Optionen können die Reihen-Optionen verwendet werden.

LV_Modify

Modifiziert die Attribute und/oder die Texte einer Reihe.

LV_Modify(Reihennummer , Optionen, NeueSpalte1, NeueSpalte2, ...)

Sie gibt bei Erfolg eine 1 und bei Misserfolg eine 0 zurück. Wenn Reihennummer eine 0 ist, werden alle Reihen im Steuerelement geändert (in diesem Fall gibt die Funktion bei Erfolg eine 1 zurück, und eine 0, wenn ein Teil der Operation fehlgeschlagen ist). Wenn nur die ersten beiden Parameter vorhanden sind, werden nur die Attribute der Reihe geändert, aber nicht ihr Text. Wenn zu wenig Parameter zum Füllen der Spalten vorhanden sind, bleiben die Spalten am Ende unverändert. Mit der ColN-Option können bestimmte Spalten aktualisiert werden, ohne dabei andere zu beeinflussen. Als Optionen können die Reihen-Optionen verwendet werden.

LV_Delete

Entfernt eine bestimmte Reihe oder alle Reihen.

LV_Delete(Reihennummer)

Fehlt der Parameter, werden alle Reihen in der ListView gelöscht. Ansonsten wird nur die angegebene Reihennummer gelöscht. Sie gibt bei Erfolg eine 1 und bei Misserfolg eine 0 zurück.

LV_ModifyCol

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

LV_ModifyCol(Spaltennummer, Optionen, Spaltentitel)

Die erste Spalte beginnt bei 1 (nicht 0). Fehlen alle Parameter, wird die Breite jeder Spalte an den Inhalt der Reihen angepasst. Wenn nur der erste Parameter vorhanden ist, wird nur die Größe der angegebenen Spalte automatisch angepasst. Die automatische Größenanpassung funktioniert nur in der Report- bzw. Detail-Ansicht. Diese Funktion gibt bei Erfolg eine 1 und bei Misserfolg eine 0 zurück.

Spalten-Optionen

Der Optionen-Parameter kann eine Zeichenkette mit null oder mehreren Wörtern aus der unteren Liste sein (nicht Groß-/Kleinschreibung-sensitiv). Trennen Sie alle Wörter jeweils mit einem Leer- oder Tabulatorzeichen. Um eine Option zu entfernen, muss ein Minuszeichen davor gesetzt werden. Um eine Option hinzuzufügen, lässt man das Vorzeichen weg oder setzt ein Pluszeichen davor.

Spalten-Optionen: Allgemein

N: Geben Sie für N die neue Breite der Spalte an (in Pixel). Diese Nummer muss nicht in Anführungszeichen gesetzt werden, wenn sie die einzige Option ist. Zum Beispiel wären die folgenden Zeilen beide gültig: LV_ModifyCol(1, 50), LV_ModifyCol(1, "50 Integer").

Auto: Passt die Breite der Spalte an ihren Inhalten an. Diese Option funktioniert nur in der Report- bzw. Detail-Ansicht.

AutoHdr: Passt die Breite der Spalte an ihren Inhalten und ihrer Spaltenüberschrift an - je nachdem, was breiter ist. Wendet man diese Option bei der letzten Spalte an, wird ihre Breite mindestens so groß sein wie der restliche Platz der ListView. Diese Option sollte am besten nur angewendet werden, nachdem die Reihen eingefügt wurden, weil dadurch jeder Scrollbalken, der neu erschienen ist, beim Ändern der Größe der letzten Spalte einbezogen wird. Diese Option funktioniert nur in der Report- bzw. Detail-Ansicht.

Icon: Geben Sie das Wort Icon und direkt danach eine Symbolnummer aus der ImageList an, um ein Symbol neben der Spaltenüberschrift anzuzeigen. Geben Sie -Icon (minus Icon) an, um alle vorhandenen Symbole zu entfernen.

IconRight: Zeigt das Symbol nicht auf der linken, sondern auf der rechten Seite der Spalte an.

Spalten-Optionen: Datentyp

Float: Beim Sortieren werden die Felder der Spalte als Floating-Point-Zahlen angesehen (hexadezimales Format wird nicht unterstützt). Die Sortierungs-Performance ist bei Float- und Text-Spalten bis zu 25-mal langsamer als die bei Integer-Spalten.

Integer: Beim Sortieren werden die Felder der Spalte als Integer angesehen. Um richtig sortiert zu werden, muss jeder Integer im 32-Bit-Format sein; also innerhalb des Bereiches von -2147483648 bis 2147483647. Wenn einige der Werte keine Integer sind, werden sie beim Sortieren als null angesehen (es sei denn, sie beginnen mit einer Zahl, in diesem Fall wird diese Zahl verwendet). Die Zahlen können entweder dezimal oder hexadezimal (z. B. 0xF9E0) sein.

Text: Beim Sortieren werden die Felder der Spalte als Text angesehen - dies gilt standardmäßig für jede Spalte. Nur die ersten 8190 Zeichen des Textes werden beim Sortieren berücksichtigt (bei der Logical-Option gilt ein Limit von 4094).

Spalten-Optionen: Ausrichtung

Center: Zentriert den Text in der Spalte. Um eine Integer- oder Float-Spalte zu zentrieren, fügt man das Wort Center nach dem Wort Integer oder Float ein.

Left: Macht den Text der Spalte linksbündig, was die Standardeinstellung für jede neu erstellte Spalte ist. In älteren Betriebssystemen muss die erste Spalte eventuell immer linksbündig zu sein.

Right: Macht den Text der Spalte rechtsbündig. Bei Integer- und Float-Spalten muss dieses Attribut nicht angegeben werden, weil sie standardmäßig bereits rechtsbündig sind. Dieser Standard kann durch so etwas wie "Integer Left" oder "Float Center" überschrieben werden.

Spalten-Optionen: Sortierung

Case: Die Sortierung der Spalte erfolgt Groß-/Kleinschreibung-sensitiv (betrifft nur Text-Spalten). Fehlen die Optionen Case, CaseLocale und Logical, werden die Großbuchstaben von A bis Z und die entsprechenden Kleinbuchstaben beim Sortieren gleichwertig behandelt.

CaseLocale [v1.0.43.03+]: Die Sortierung der Spalte erfolgt nicht-Groß-/Kleinschreibung-sensitiv gemäß den aktuellen Sprach- und Regionseinstellungen des Benutzers (betrifft nur Text-Spalten). In den meisten englischen und westeuropäischen Regionen beispielsweise werden die Großbuchstaben A bis Z, einschließlich ANSI-Zeichen wie Ä und Ü, und die entsprechenden Kleinbuchstaben gleichwertig behandelt. Diese Methode verwendet zudem eine "Wortsortierung" - Bindestriche und Apostrophe werden so behandelt, dass Wörter wie "coop" und "co-op" zusammen bleiben.

Desc: Absteigende Reihenfolge. Wenn der Benutzer die Spalte das erste Mal sortiert, wird sie in absteigender Reihenfolge angezeigt.

Logical [v1.0.44.12+]: Das gleiche wie CaseLocale, außer dass Ziffernfolgen im Text nicht als normale Zeichen, sondern als echte Zahlen behandelt werden. Zum Beispiel wäre die Zeichenkette "T33" größer als "T4". Logical benötigt Windows XP oder höher (auf älteren Betriebssystemen gilt stattdessen automatisch CaseLocale). Darüber hinaus schließen sich Logical und Case gegenseitig aus: Nur das vor kurzem angegebene wird aktiv sein.

NoSort: Verhindert, dass ein automatischer Sortierungseffekt auftritt, wenn der Benutzer auf diese Spalte klickt. Um die Sortierung für alle Spalten zu deaktivieren, fügt man NoSort in den ListView-Optionen ein. Hat die ListView ein g-Label, wird es weiterhin die ColClick-Benachrichtigung erhalten, wann immer der Benutzer eine NoSort-Spalte anklickt.

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 der gleichen Spalte die Sortierungsrichtung umkehrt.

LV_InsertCol

Fügt eine neue Spalte vor einer bestimmten Spalte ein.

LV_InsertCol(Spaltennummer , Optionen, Spaltentitel)

Erstellt eine neue Spalte und fügt sie als eine bestimmte Spaltennummer ein (verschiebt alle anderen Spalten nach rechts, um Platz zu schaffen). Die erste Spalte ist 1 (nicht 0). Wenn Spaltennummer größer ist als die Anzahl der vorhandenen Spalten im Steuerelement, wird die neue Spalte rechts neben der letzten Spalte gesetzt. Die neu eingefügte Spalte ist zu Beginn leer. Wenn sie aber die erste Spalte ist, bekommt sie den Inhalt der alten ersten Spalte, die wiederum den Inhalt der neuen ersten Spalte bekommt (das heißt, dass deren Inhalte getauscht werden). Die Attribute der neuen Spalte - egal ob sie z. B. Integer-Sortierung verwendet oder nicht - haben zu Beginn immer ihre Standardwerte, sofern sie nicht via Optionen geändert wurden. Diese Funktion gibt die Positionsnummer der neuen Spalte zurück (oder 0 bei Misserfolg). Die maximale Anzahl von Spalten in einer ListView ist 200.

LV_DeleteCol

Entfernt eine bestimmte Spalte und all die Inhalte darunter.

LV_DeleteCol(Spaltennummer)

Sie gibt bei Erfolg eine 1 und bei Misserfolg eine 0 zurück. Wurde eine Spalte einmal entfernt, werden die Nummern der Spalten, die rechts danebenliegen, um 1 reduziert. Demzufolge würde das zweimalige Aufrufen von LV_DeleteCol(2) die zweite und dritte Spalte entfernen. Auf Betriebssystemen älter als Windows XP könnte der Versuch, die originale erste Spalte zu entfernen, fehlschlagen und 0 zurückgeben.

LV_GetCount

Gibt entweder die Gesamtanzahl von Reihen oder Spalten oder nur die Anzahl von ausgewählten Reihen zurück.

LV_GetCount(Modus)

Fehlt der Parameter, wird die Funktion die Anzahl der Reihen im Steuerelement zurückgeben. Wenn der Parameter "S" oder "Select" ist, wird die Zählung nur die ausgewählten/hervorgehobenen Reihen einbeziehen. Wenn der Parameter "Col" oder "Column" ist, wird die Funktion die Anzahl der Spalten im Steuerelement zurückgeben. Das Ausführen der Funktion erfolgt sofort, weil das Steuerelement solche Zählungen protokolliert.

Diese Funktion wird häufig in der obersten Zeile einer Schleife verwendet - in diesem Fall würde die Funktion nur einmal aufgerufen werden (vor dem ersten Durchlauf). Zum Beispiel:

Loop % LV_GetCount()
{
    LV_GetText(AbgerufenerText, A_Index)
    if InStr(AbgerufenerText, "beliebiger Filtertext")
        LV_Modify(A_Index, "Select")  ; Markiert jede Reihe, die im ersten Feld den Filtertext enthält.
}

Das folgende Beispiel zeigt, wie die Spaltenbreiten einer ListView abgerufen werden können, um sie z. B. in eine INI-Datei zu speichern, so dass sie zwischen den Sitzungen erhalten bleiben:

Gui +LastFound
Loop % LV_GetCount("Column")
{
    SendMessage, 4125, A_Index - 1, 0, SysListView321  ; 4125 ist LVM_GETCOLUMNWIDTH.
    MsgBox Die Spalte %A_Index% hat eine Breite von %ErrorLevel%.
}

LV_GetNext

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

LV_GetNext(Startreihennummer, Reihentyp)

Kann keine Reihe gefunden werden, wird null zurückgegeben. Fehlt der Startreihennummer-Parameter oder ist er kleiner als 1, beginnt die Suche am Anfang der Liste. Ansonsten beginnt die Suche bei der Reihe nach Startreihennummer. Fehlt der Reihentyp-Parameter, wird die Funktion die nächste ausgewählte/hervorgehobene Reihe suchen. Verwenden Sie ansonsten "C" oder "Checked", um die nächste abgehakte Reihe zu finden; oder "F" oder "Focused", um die fokussierte Reihe zu finden (es gibt nie mehr als eine fokussierte Reihe in der gesamten Liste, und manchmal gibt es überhaupt keine). Das folgende Beispiel meldet alle ausgewählten Reihen in der ListView:

Reihennummer = 0  ; Veranlasst den ersten Schleifendurchlauf, die Suche am Anfang der Liste zu beginnen.
Loop
{
    Reihennummer := LV_GetNext(Reihennummer)  ; Setzt die Suche bei der nächsten Reihe fort.
    if not Reihennummer  ; Oben wurde null zurückgegeben, also gibt es keine weiteren ausgewählten Reihen.
        break
    LV_GetText(Text, Reihennummer)
    MsgBox Die nächste ausgewählte Reihe ist #%Reihennummer%, die im ersten Feld "%Text%" enthält.
}

Das nächste Beispiel ist eine alternative Methode, mit der man herausfinden kann, ob eine bestimmte Reihennummer abgehakt ist:

Gui +LastFound
SendMessage, 4140, Reihennummer - 1, 0xF000, SysListView321  ; 4140 ist LVM_GETITEMSTATE. 0xF000 ist LVIS_STATEIMAGEMASK.
IstAbgehakt := (ErrorLevel >> 12) - 1  ; Setzt IstAbgehakt auf 1 (true), wenn Reihennummer abgehakt ist, ansonsten auf 0 (false).

LV_GetText

Ruft den Text ab, der auf der angegebenen Reihennummer und Spaltennummer zu finden ist, und speichert ihn in AusgabeVar.

LV_GetText(AusgabeVar, Reihennummer , Spaltennummer)

Fehlt der Spaltennummer-Parameter, verwendet er standardmäßig eine 1 (der Text in der ersten Spalte). Wenn Reihennummer eine 0 ist, wird die Spaltenüberschrift abgerufen. Wenn der Text länger als 8191 ist, werden nur die ersten 8191 Zeichen abgerufen. Diese Funktion gibt bei Erfolg eine 1 und bei Misserfolg eine 0 zurück. Bei Misserfolg wird AusgabeVar zudem leer gemacht.

Die vom Skript gesehenen Spaltennummern bleiben erhalten, selbst wenn der Benutzer die Spalten verschieben würde. Zum Beispiel wäre die originale erste Spalte weiterhin die Nummer 1, selbst wenn der Benutzer sie nach rechts verschieben würde.

LV_SetImageList

Setzt oder ersetzt die ImageList der ListView.

LV_SetImageList(ImageListID , Symboltyp)

Diese Funktion wird normalerweise aufgerufen, bevor man Reihen in die ListView einfügt. Sie wendet die ImageList auf die ListView an, so dass Symbole in ihren Reihen (oder Spalten) dargestellt werden können. Verwenden Sie als ImageListID die zurückgegebene Nummer von IL_Create(). Fehlt der Symboltyp-Parameter, werden die Symbole in der ImageList automatisch als große oder kleine Symbole erkannt. Verwenden Sie ansonsten eine 0 für große Symbole, eine 1 für kleine Symbole und eine 2 für Statussymbole (Statussymbole werden nur via SendMessage unterstützt).

Eine ListView kann bis zu zwei ImageLists haben: für kleine Symbole und/oder große Symbole. Damit könnte ein Skript den Benutzer zwischen den Symbolansichten wechseln zu lassen. Um mehr als eine ImageList in die ListView einzufügen, ruft man LV_SetImageList() ein zweites Mal auf und übergibt die ImageListID der zweiten Liste. Eine ListView mit einer ImageList für große und kleine Symbole sollte sicherstellen, dass beide Listen die Symbole in gleicher Reihenfolge enthalten. Das liegt daran, dass mit der gleichen ID-Nummer sowohl auf die großen als auch auf die kleinen Versionen eines bestimmten Symbols verwiesen wird.

Üblicherweise zeigen alle Anzeigemethoden (außer Icon und Tile) kleine Symbole an. Diese Standardeinstellung kann man überschreiben, wenn man eine Liste für große Symbole an LV_SetImageList übergibt und eine 1 (kleine Symbole) im zweiten Parameter angibt. Dabei wird auch jede Reihe in der ListView höher gemacht, um Platz für große Symbole zu schaffen.

Bei Erfolg gibt LV_SetImageList() die ImageListID zurück, die zuvor mit der ListView verbunden wurde (oder eine 0, wenn dies nicht der Fall ist). Jede nicht mehr benötigte ImageList kann mit IL_Destroy(ImageListID) zerstört werden.

g-Label-Benachrichtigungen (Primär)

Ein g-Label wie z. B. gMeineSubroutine kann in den Optionen des Steuerelements eingefügt werden. Dies führt dazu, dass jedes Mal das Label MeineSubroutine gestartet wird, wenn der Benutzer eine Aktion im Steuerelement durchführt. Diese Subroutine hat Zugriff auf die internen Variablen A_Gui und A_GuiControl, um herauszufinden, welches Fenster oder ListView das Ereignis erzeugt hat. Noch wichtiger ist, dass sie zudem auf A_GuiEvent zugreifen kann, die eine der folgenden Zeichenketten oder Buchstaben enthalten kann (für die Kompatibilität mit zukünftigen Versionen sollte ein Skript nicht davon ausgehen, dass das die einzigen möglichen Werte sind):

DoubleClick: Der Benutzer hat im Steuerelement einen Doppelklick gemacht. Die Variable A_EventInfo enthält die fokussierte Reihennummer. Mit LV_GetNext() kann stattdessen die erste ausgewählte Reihennummer abgerufen werden, die 0 ist, wenn der Benutzer eine leere Fläche doppelt anklickt.

R: Der Benutzer hat im Steuerelement einen doppelten Rechtsklick gemacht. Die Variable A_EventInfo enthält die fokussierte Reihennummer.

ColClick: Der Benutzer hat eine Spaltenüberschrift angeklickt. Die Variable A_EventInfo enthält die Spaltennummer, die der Spalte ursprünglich bei ihrer Erstellung zugewiesen wurde; das heißt, dass A_EventInfo nicht das Ziehen und Ablegen von Spalten durch den Benutzer widerspiegelt. Eine mögliche Reaktion beim Anklicken einer Spalte ist es, sie über eine versteckte Spalte (null Breite) zu sortieren, die Daten in einem sortierfreundlichen Format enthält (wie z. B. ein YYYYMMDD-Integer-Datum). Solch eine versteckte Spalte kann mit einer anderen Spalte verbunden werden, die die gleichen Daten in einem schöneren Format (wie z. B. DD.MM.YY) anzeigt. Zum Beispiel könnte ein Skript die Spalte 3 via LV_ModifyCol(3, 0) verstecken und dann die automatische Sortierung in der sichtbaren Spalte 2 via LV_ModifyCol(2, "NoSort") deaktivieren. Das Skript würde dann im Zusammenhang mit der ColClick-Benachrichtigung die ListView über die versteckte Spalte via LV_ModifyCol(3, "Sort") sortieren.

D: Der Benutzer hat den Versuch gestartet, eine Reihe oder ein Symbol zu verschieben (zurzeit gibt es keine interne Unterstützung zum Verschieben von Reihen oder Symbolen). Die Variable A_EventInfo enthält die fokussierte Reihennummer. [v1.0.44+]: Diese Benachrichtigung tritt auch ohne AltSubmit auf.

d (kleingeschriebenes D): Das gleiche wie oben, außer dass das Verschieben mit Rechtsklick begonnen wurde, statt mit Linksklick.

e (kleingeschriebenes E): Der Benutzer hat das erste Feld einer Reihe fertig editiert (er kann dieses Feld nur editieren, wenn -ReadOnly in den Optionen vorhanden ist). Die Variable A_EventInfo enthält die Reihennummer.

g-Label-Benachrichtigungen (Sekundär)

Hat die ListView das Wort AltSubmit in ihren Optionen, wird ihr g-Label öfters gestartet und A_GuiEvent weitere folgende Werte enthalten:

Normal: Der Benutzer hat eine Reihe mit der linken Maustaste angeklickt. Die Variable A_EventInfo enthält die fokussierte Reihennummer.

RightClick: Der Benutzer hat eine Reihe mit der rechten Maustaste angeklickt. Die Variable A_EventInfo enthält die fokussierte Reihennummer. In den meisten Fällen sollte man verhindern, ein Menü im Zusammenhang mit dieser Meldung anzeigen zu lassen. Ein GuiContextMenu-Label ist dafür besser geeignet, weil es auch die MENÜ-Taste erkennt. Zum Beispiel:

GuiContextMenu:  ; Startet, wenn man einen Rechtsklick macht oder die MENÜ-Taste drückt.
if (A_GuiControl <> "MeineListView")  ; Diese Überprüfung ist optional. Sie zeigt das Menü nur an, wenn Klicks innerhalb der ListView gemacht werden.
    return
; Zeigt das Menü bei den Koordinaten A_GuiX und A_GuiY an. Diese Koordinaten
; sind auch dann korrekt, wenn der Benutzer die MENÜ-Taste drückt:
Menu, MeinKontextmenü, Show, %A_GuiX%, %A_GuiY%
return

A: Eine Reihe wurde aktiviert - standardmäßig durch einen Doppelklick. Die Variable A_EventInfo enthält die Reihennummer.

C: Die ListView hat die Mauserfassung ausgelöst.

E: Der Benutzer hat damit begonnen, das erste Feld einer Reihe zu editieren (er kann dieses Feld nur editieren, wenn -ReadOnly in den Optionen vorhanden ist). Die Variable A_EventInfo enthält die Reihennummer.

F: Die ListView hat den Tastaturfokus erhalten.

f: Die ListView hat den Tastaturfokus verloren.

I: Element geändert. Eine Reihe wurde durch Auswählen/Abwählen, Häkchen setzen/entfernen und so weiter geändert. Wählt der Benutzer eine neue Reihe aus, werden mindestens zwei solcher Benachrichtigungen ankommen: eine Meldung durch Abwählen der vorherigen Reihe und eine Meldung durch Auswählen der neuen Reihe. [v1.0.44+]: Die Variable A_EventInfo enthält die Reihennummer. [v1.0.46.10+]: ErrorLevel enthält null oder mehrere der folgenden Buchstaben, die kennzeichnen, wie das Element geändert wurde: S (ausgewählt) oder s (abgewählt), und/oder F (fokussiert) oder f (defokussiert), und/oder C (Häkchen gesetzt) oder c (Häkchen entfernt). Zum Beispiel würde SF bedeuten, dass die Reihe ausgewählt und fokussiert wurde. Um zu überprüfen, ob ein bestimmter Buchstabe vorhanden ist, nutzt man entweder eine Parsende Schleife oder die GroßKleinSensitiv-Option von InStr(); zum Beispiel: InStr(ErrorLevel, "S", true). Hinweis: Für die Kompatibilität mit zukünftigen Versionen sollte ein Skript nicht davon ausgehen, das "SsFfCc" die einzigen möglichen Werte sind. Außerdem würde ein Critical in der ersten Zeile von g-Label sicherstellen, dass alle "I"-Benachrichtigungen ankommen (sonst könnten einige verloren gehen, wenn das Skript nicht mit ihnen mithalten kann).

K: Der Benutzer hat eine Taste gedrückt, während die ListView den Fokus hat. A_EventInfo enthält den virtuellen Tastencode der Taste - eine Zahl zwischen 1 und 255. Dieser Code kann via GetKeyName in einen Tastennamen oder Zeichen umgewandelt werden. Zum Beispiel Taste := GetKeyName(Format("vk{:x}", A_EventInfo)). Auf den meisten Tastaturlayouts können die Tasten von A bis Z via Chr(A_EventInfo) in das entsprechende Zeichen umgewandelt werden. F2-Eingaben werden erfasst, unabhängig von WantF2. Enter-Eingaben werden hingegen nicht erfasst; um sie dennoch zu erfassen, nutzt man eine Standardschaltfläche, wie unten beschrieben.

M: Auswahlrechteck. Der Benutzer hat damit begonnen, ein Auswahlrechteck über mehrere Reihen oder Symbolen zu ziehen.

S: Der Benutzer hat damit begonnen, in der ListView zu scrollen.

s (kleingeschriebenes S): Der Benutzer ist damit fertig, in der ListView zu scrollen.

ImageList (Symbole in die ListView einfügen)

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 die Liste mit Symbolen zu füllen, die jeweils eine fortlaufende Nummer zugewiesen bekommen, beginnend bei 1. Auf so eine Nummer bezieht sich das Skript, wenn es ein bestimmtes Symbol auf einer Reihe oder Spaltenüberschrift anzeigen soll. Das folgende Beispiel zeigt, wie Symbole in den Reihen einer ListView eingefügt werden können:

Gui, Add, ListView, h200 w180, Symbol & Nummer|Beschreibung  ; Erstellt eine ListView.
ImageListID := IL_Create(10)  ; Erstellt eine ImageList für 10 kleine Symbole.
LV_SetImageList(ImageListID)  ; Weist die obige ImageList der aktuellen ListView zu.
Loop 10  ; Fügt mehrere Symbole aus der DLL in die ImageList ein.
    IL_Add(ImageListID, "shell32.dll", A_Index) 
Loop 10  ; Fügt Reihen in die ListView ein (für jedes Symbol eine Reihe).
    LV_Add("Icon" . A_Index, A_Index, "n/a")
LV_ModifyCol("Hdr")  ; Passt die Breiten der Spalten automatisch an.
Gui Show
return

GuiClose:  ; Beendet das Skript, wenn der Benutzer das GUI-Fenster der ListView schließt.
ExitApp

IL_Create

Erstellt eine neue zunächst leere ImageList, und gibt die eindeutige ID der ImageList zurück (oder eine 0 bei Misserfolg).

IL_Create(AnfänglicheAnzahl, WachsendeAnzahl, GroßeSymbole)

AnfänglicheAnzahl ist die Anzahl der Symbole, die Sie vermutlich sofort in die Liste einfügen werden (fehlt dieser Parameter, gilt standardmäßig 2). WachsendeAnzahl ist die Anzahl der Symbole, mit der die Liste erweitert werden soll, wenn ihre Kapazität jedes Mal überschritten wird (fehlt dieser Parameter, gilt standardmäßig 5). GroßeSymbole sollte ein numerischer Wert sein: Wenn Wert ungleich null ist, wird die ImageList große Symbole enthalten. Wenn der Wert eine null ist, wird die ImageList kleine Symbole enthalten (Standardeinstellung, wenn der Parameter fehlt). Symbole, die man in die Liste einfügt, werden automatisch skaliert, damit sie mit den System-Abmessungen für kleine und große Symbole übereinstimmen.

IL_Add

Fügt ein Symbol oder Bild in eine bestimmte ImageListID ein und gibt die neue Indexnummer des Symbols zurück (1 ist das erste Symbol, 2 das zweite Symbol und so weiter).

IL_Add(ImageListID, Dateiname , Symbolnummer, BildSkalieren)

Dateiname ist der Name eines Symbols (.ICO), Cursors (.CUR) oder animierten Cursors (.ANI) (zurzeit werden animierte Cursor in einer ListView nicht wirklich animiert). Folgende Dateitypen sind auch für Symbole geeignet: EXE, DLL, CPL, SCR und andere Typen, die Symbolressourcen enthalten. Um anstelle der ersten Symbolgruppe eine andere in der Datei zu nutzen, müssen Sie für Symbolnummer die entsprechende Nummer angeben. Wenn Symbolnummer negativ ist, wird der absolute Wert dieser Nummer als Ressourcen-ID eines Symbols innerhalb einer ausführbaren Datei vermutet. Die folgende Beispielanweisung lädt das Standardsymbol aus der zweiten Symbolgruppe: IL_Add(ImageListID, "C:\Meine Anwendung.exe", 2).

Nicht-Symbol-Bilder wie BMP, GIF und JPG können ebenfalls geladen werden. In diesem Fall sollten die letzten beiden Parameter vorhanden sein, um korrektes Verhalten zu gewährleisten: Symbolnummer sollte die Nummer der Farbmaske/Transparenzfarbe sein (für die meisten Bilder am besten 0xFFFFFF, also weiß); und BildSkalieren sollte ungleich 0 sein, um das Bild auf ein einzelnes Symbol zu skalieren; oder 0, um das Bild über mehrere Symbole aufzuteilen.

Alle Betriebssysteme unterstützen GIF-, JPG-, BMP-, ICO-, CUR- und ANI-Bilder. In Windows XP oder höher werden zusätzliche Bildformate wie PNG, TIF, Exif, WMF und EMF unterstützt. Um Betriebssysteme älter als XP zu unterstützen, kopieren Sie die GDI+-DLL-Datei von Microsoft in den Ordner von AutoHotkey.exe (bei einem kompilierten Skript muss die DLL in den Ordner des Skripts kopiert werden). Die DLL finden Sie auf www.microsoft.com mit Suchbegriffen wie: gdi redistributable

[v1.1.23+]: Anstelle eines Dateinamens kann auch ein Bitmap- oder Symbol-Handle verwendet werden. Zum Beispiel HBITMAP:%handle%.

IL_Destroy

Löscht eine bestimmte ImageList und gibt bei Erfolg eine 1 und bei Misserfolg eine 0 zurück.

IL_Destroy(ImageListID)

Normalerweise ist es nicht notwendig, ImageLists zu zerstören, denn wenn sie einmal mit einer ListView verbunden sind, werden sie automatisch zerstört, wenn die ListView oder ihr übergeordnetes Fenster zerstört wird. Wenn eine ImageList bei mehreren ListViews verwendet wird (wenn 0x40 in deren Optionen ist), sollte das Skript die ImageList explizit zerstören, nachdem alle ListViews zerstört wurden. Ersetzt das Skript eine der alten ImageLists mit einer neuen, sollte es explizit die alte ImageList zerstören.

ListView-Bemerkungen

Der Befehl Gui Submit hat keine Auswirkung auf ein ListView-Steuerelement. Demzufolge kann das Skript die zugeordnete Variable der ListView zum Speichern von weiteren Daten verwenden (falls vorhanden), um andere Daten zu speichern, ohne befürchten zu müssen, dass sie jemals überschrieben wird.

Nachdem eine Spalte sortiert wurde - z. B. durch Anklicken der Spaltenüberschrift oder Aufrufen von LV_ModifyCol(1, "Sort") - werden alle danach eingefügten Reihen am unteren Ende der Liste erscheinen, anstatt die aktuelle Sortierungsreihenfolge zu berücksichtigen. Die Ausnahme davon sind die Styles Sort und SortDesc, weil sie neu hinzugefügte Reihen an die korrekte Position verschieben.

Um die Eingabe einer Enter-Taste bei einer fokussierten ListView zu erfassen, nutzt man eine Standardschaltfläche (die man natürlich verstecken kann). Zum Beispiel:

Gui, Add, Button, Hidden Default, OK
...
ButtonOK:
GuiControlGet, FokussiertesSteuerelement, FocusV
if (FokussiertesSteuerelement <> "MeineListView")
    return
MsgBox % "Sie haben ENTER gedrückt. Die fokussierte Reihennummer ist " . LV_GetNext(0, "Focused")
return

Neben der Möglichkeit, mit der Tastatur von Reihe zu Reihe zu navigieren, könnte der Benutzer auch eine inkrementelle Suche durchführen, indem er die ersten Zeichen eines Feldes aus der ersten Spalte eingibt. Dabei springt die Auswahl auf die nächst passende Reihe.

Zwar kann man ein Text mit beliebiger Länge in den Feldern einer ListView speichern, allerdings werden nur die ersten 260 Zeichen angezeigt.

Die maximale Anzahl an Reihen ist nur durch den verfügbaren Systemspeicher begrenzt. Siehe Count-Option, wie man die Performance beim Hinzufügen von Reihen erheblich verbessern kann.

Es ist möglich, ein Bild hinter einer ListView zu verwenden (quasi zum Einrahmen der ListView). Um das zu tun, erstellt man das Picture-Steuerelement nach der ListView und fügt 0x4000000 (WS_CLIPSIBLINGS) in den Optionen des Picture-Steuerelements ein.

Ein Skript kann mehr als eine ListView pro Fenster erstellen. Wie man mit einer anderen ListView anstelle der Standard-ListView agieren kann, erfahren Sie unter Interne Funktionen.

Spalten sollten am besten nicht direkt mit SendMessage eingefügt oder entfernt werden. Dies liegt daran, dass das Programm mehrere Sortier-Einstellungen für jede Spalte verwaltet, die dann nicht mehr synchron wären. Verwenden Sie stattdessen die internen Spalten-Funktionen.

GuiControl kann z. B. genutzt werden, um eine ListView größer/kleiner zu machen, zu verstecken, oder um die Schrift einer ListView zu ändern.

Mit ControlGet List können Texte aus externen ListViews (das sind solche, die nicht zum Skript gehören) extrahiert werden.

Siehe auch

TreeView, Andere Steuerelemente, Gui, GuiContextMenu, GuiControl, GuiControlGet, Style-Tabelle von ListView

Beispiele

Beispiel #1: Verschiedenes

; Das folgende Beispiel zeigt, wie mit einer 0 als Reihennummer alle Reihen aus- oder abgewählt werden können:
LV_Modify(0, "Select")   ; Wählt alle aus.
LV_Modify(0, "-Select")  ; Wählt alle ab.
LV_Modify(0, "-Check")  ; Entfernt die Häkchen von allen Checkboxen.

; Passt die Breite der Spalten an den Inhalt der Reihen an:
LV_ModifyCol()  ; Es gibt keine Parameter in diesem Modus.

Beispiel #2

Das folgende Skript ist aufwendiger als das Beispiel ganz oben. Es zeigt Dateien aus einem Ordner an, den der Benutzer aussuchen kann, und weist jeder Datei je nach Typ ein Symbol zu. Der Benutzer kann eine Datei doppelt anklicken, oder einen Rechtsklick auf eine oder mehrere Dateien machen, um das Kontextmenü anzuzeigen:

; Erlaubt dem Benutzer, das Fenster zu maximieren oder dessen Größe beliebig anzupassen:
Gui +Resize

; Erstellt einige Schaltflächen:
Gui, Add, Button, Default gButtonOrdnerLaden, Ordner laden
Gui, Add, Button, x+20 gButtonLeeren, Liste leeren
Gui, Add, Button, x+20, Ansicht wechseln

; Erstellt die ListView und ihre Spalten via Gui Add:
Gui, Add, ListView, xm r20 w700 vMeineListView gMeineListView, Name|Ordner|Größe (KB)|Typ
LV_ModifyCol(3, "Integer")  ; Kennzeichnet aus Sortierungsgründen die Spalte "Größe" als Integer.

; Erstellt eine ImageList, mit der die ListView einige Symbole anzeigen kann:
ImageListID1 := IL_Create(10)
ImageListID2 := IL_Create(10, 10, true)  ; Eine Liste mit großen Symbolen, verbunden mit den kleinen Symbolen.

; Verbindet die ImageLists mit der ListView, so dass sie später die Symbole anzeigen kann:
LV_SetImageList(ImageListID1)
LV_SetImageList(ImageListID2)

; Erstellt ein aufklappbares Menü, das als Kontextmenü verwendet wird:
Menu, MeinKontextmenü, Add, Öffnen, KontextDateiÖffnen
Menu, MeinKontextmenü, Add, Eigenschaften, KontextEigenschaften
Menu, MeinKontextmenü, Add, Von ListView entfernen, KontextReihenLeeren
Menu, MeinKontextmenü, Default, Öffnen  ; Zeigt "Öffnen" in fetter Schrift an, um zu kennzeichnen, dass ein Doppelklick das gleiche bewirkt.

; Zeigt das Fenster an und geht in den Leerlauf. Das System wird das Skript benachrichtigen, wann immer der Benutzer
; eine gültige Aktion durchführt:
Gui, Show
return


ButtonOrdnerLaden:
Gui +OwnDialogs  ; Zwingt den Benutzer, das folgende Dialogfenster zu schließen, bevor er das Hauptfenster benutzen kann.
FileSelectFolder, Ordner,, 3, Wählen Sie einen Ordner aus, das eingelesen werden soll:
if not Ordner  ; Der Benutzer hat das Dialogfenster abgebrochen.
    return

; Überprüft, ob das letzte Zeichen im Ordnernamen ein umgekehrter Schrägstrich ist, das bei Root-Verzeichnissen
; wie C:\ vorkommt. Ist dies der Fall, muss es entfernt werden, um später einen doppelten Schrägstrich zu verhindern.
StringRight, LetztesZeichen, Ordner, 1
if (LetztesZeichen = "\")
    StringTrimRight, Ordner, Ordner, 1  ; Entfernt den Schrägstrich am Ende.

; Berechnet die notwendige Puffergröße für die SHFILEINFO-Struktur.
sfi_größe := A_PtrSize + 8 + (A_IsUnicode ? 680 : 340)
VarSetCapacity(sfi, sfi_größe)

; Sammelt eine Liste mit Dateinamen vom ausgewählten Ordner und fügt sie in die ListView ein:
GuiControl, -Redraw, MeineListView  ; Verbessert die Performance durch Deaktivieren der Neuzeichnung während des Ladens.
Loop %Ordner%\*.*
{
    Dateiname := A_LoopFileFullPath  ; Muss in eine schreibbare Variable gespeichert werden, damit sie unten verwendet werden kann.

    ; Erstellt eine eindeutige Endungs-ID, um Zeichen in einem Variablennamen zu vermeiden, die illegal sind,
    ; wie z. B. Bindestriche. Zudem ist diese Methode leistungsfähiger, weil das Finden eines Elements
    ; in einem Array keine Such-Schleife erfordert.
    SplitPath, Dateiname,,, Dateiendung  ; Ermittelt die Dateiendung.
    if Dateiendung in EXE,ICO,ANI,CUR
    {
        EndungsID := Dateiendung  ; Spezial-ID als Platzhalter.
        Symbolnummer := 0  ; Markiert es als "nicht gefunden", damit jeder Typ ein einzigartiges Symbol haben kann.
    }
    else  ; Sonstige Endung/Dateityp, also ihre eindeutige ID berechnen.
    {
        EndungsID := 0  ; Initialisieren, um Endungen zu behandeln, die kürzer sind als andere.
        Loop 7     ; Limitiert die Endung auf 7 Zeichen, so dass sie in einem 64-Bit-Wert passt.
        {
            StringMid, Endungszeichen, Dateiendung, A_Index, 1
            if not Endungszeichen  ; Keine weiteren Zeichen.
                break
            ; Erlangt eine eindeutige ID durch Zuweisen von unterschiedlichen Bit-Positionen für jedes Zeichen:
            EndungsID := EndungsID | (Asc(Endungszeichen) << (8 * (A_Index - 1)))
        }
        ; Überprüft, ob diese Dateiendung bereits ein Symbol in den ImageLists hat. Ist dies der Fall,
        ; können mehrere Aufrufe verhindert werden, was die Lade-Performance deutlich verbessert,
        ; besonders bei einem Ordner mit mehreren hundert Dateien:
        Symbolnummer := SymbolArray%EndungsID%
    }
    if not Symbolnummer  ; Es gibt noch kein Symbol für diese Endung, also wird es geladen.
    {
        ; Ermittelt das kleine Symbol in hoher Qualität, das mit dieser Dateiendung verbunden ist:
        if not DllCall("Shell32\SHGetFileInfo" . (A_IsUnicode ? "W":"A"), "Str", Dateiname
            , "UInt", 0, "Ptr", &sfi, "UInt", sfi_größe, "UInt", 0x101)  ; 0x101 ist SHGFI_ICON+SHGFI_SMALLICON
            Symbolnummer := 9999999  ; Setzt die Nummer außerhalb des gültigen Bereichs, um ein leeres Symbol anzuzeigen.
        else ; Symbol erfolgreich geladen.
        {
            ; Extrahiert das hIcon-Element aus der Struktur:
            hIcon := NumGet(sfi, 0)
            ; Fügt das HICON direkt in die Listen der kleinen und großen Symbolen ein.
            ; Unten wird +1 verwendet, um den 0-basierten Index in einen 1-basierten umzuwandeln:
            Symbolnummer := DllCall("ImageList_ReplaceIcon", "Ptr", ImageListID1, "Int", -1, "Ptr", hIcon) + 1
            DllCall("ImageList_ReplaceIcon", "Ptr", ImageListID2, "Int", -1, "Ptr", hIcon)
            ; Da es nun in die ImageLists kopiert wurde, sollte das Original zerstört werden:
            DllCall("DestroyIcon", "Ptr", hIcon)
            ; Cacht das Symbol, um Speicher zu sparen und Lade-Performance zu erhöhen:
            SymbolArray%EndungsID% := Symbolnummer
        }
    }

    ; Erstellt die neue Reihe in der ListView und weist ihr die oben ermittelte Symbolnummer zu:
    LV_Add("Icon" . Symbolnummer, A_LoopFileName, A_LoopFileDir, A_LoopFileSizeKB, Dateiendung)
}
GuiControl, +Redraw, MeineListView  ; Reaktiviert die Neuzeichnung (es wurde oben deaktiviert).
LV_ModifyCol()  ; Passt die Breiten der Spalten an den Inhalt der Reihen an.
LV_ModifyCol(3, 65) ; Macht die Spalte "Größe" etwas breiter, um die Spaltenüberschrift komplett sichtbar zu machen.
return


ButtonLeeren:
LV_Delete()  ; Leert die ListView, aber hält das Symbol-Cache aus praktischen Gründen intakt.
return

ButtonAnsichtWechseln:
if not IconView
    GuiControl, +Icon, MeineListView    ; Wechselt zur Symbolansicht.
else
    GuiControl, +Report, MeineListView  ; Wechselt wieder zur Detail-Ansicht.
IconView := not IconView             ; Kehrt den Wert für die nächste Benutzung um.
return

MeineListView:
if (A_GuiEvent = "DoubleClick")  ; Es gibt noch viele andere Werte, die das Skript überprüfen kann.
{
    LV_GetText(Dateiname, A_EventInfo, 1) ; Ermittelt den Text des ersten Feldes.
    LV_GetText(Dateiverz, A_EventInfo, 2)  ; Ermittelt den Text des zweiten Feldes.
    Run %Dateiverz%\%Dateiname%,, UseErrorLevel
    if ErrorLevel
        MsgBox "%Dateiverz%\%Dateiname%" konnte nicht geöffnet werden.
}
return

GuiContextMenu:  ; Startet, wenn man einen Rechtsklick macht oder die MENÜ-Taste drückt.
if (A_GuiControl <> "MeineListView")  ; Zeigt das Menü nur an, wenn die Klicks innerhalb der ListView gemacht werden.
    return
; Zeigt das Menü bei den Koordinaten A_GuiX und A_GuiY an. Diese Koordinaten
; sind auch dann korrekt, wenn der Benutzer die MENÜ-Taste drückt:
Menu, MeinKontextmenü, Show, %A_GuiX%, %A_GuiY%
return

KontextDateiÖffnen:  ; Der Benutzer hat "Öffnen" im Kontextmenü ausgewählt.
KontextEigenschaften:  ; Der Benutzer hat "Eigenschaften" im Kontextmenü ausgewählt.
; Aus praktischen Gründen wird nur mit der fokussierten Reihe agiert, anstatt mit allen ausgewählten Reihen:
FokussierteReihennummer := LV_GetNext(0, "F")  ; Findet die fokussierte Reihe.
if not FokussierteReihennummer  ; Keine Reihe fokussiert.
    return
LV_GetText(Dateiname, FokussierteReihennummer, 1) ; Ermittelt den Text des ersten Feldes.
LV_GetText(Dateiverz, FokussierteReihennummer, 2)  ; Ermittelt den Text des zweiten Feldes.
IfInString A_ThisMenuItem, Öffnen  ; Benutzer hat "Öffnen" im Kontextmenü ausgewählt.
    Run %Dateiverz%\%Dateiname%,, UseErrorLevel
else  ; Der Benutzer hat "Eigenschaften" im Kontextmenü ausgewählt.
    Run Properties "%Dateiverz%\%Dateiname%",, UseErrorLevel
if ErrorLevel
    MsgBox Angeforderte Aktion auf "%Dateiverz%\%Dateiname%" konnte nicht durchgeführt werden.
return

KontextReihenLeeren:  ; Der Benutzer hat "Leeren" im Kontextmenü ausgewählt.
Reihennummer := 0  ; Veranlasst den ersten Schleifendurchlauf, die Suche am Anfang zu beginnen.
Loop
{
    ; Da das Löschen einer Reihe die Reihennummer aller anderen Reihen darüber reduziert,
    ; sollten sie um 1 subtrahiert werden, so dass die Suche die gleiche Reihennummer einbezieht,
    ; die zuvor gefunden wurde (falls die benachbarten Reihen ausgewählt sind):
    Reihennummer := LV_GetNext(Reihennummer - 1)
    if not Reihennummer  ; Oben wurde null zurückgegeben, also gibt es keine weiteren ausgewählten Reihen.
        break
    LV_Delete(Reihennummer)  ; Entfernt die Reihe aus der ListView.
}
return

GuiSize:  ; Vergrößert oder verkleinert die ListView, wenn der Benutzer die Fenstergröße ändert.
if (A_EventInfo = 1)  ; Das Fenster wurde minimiert. Keine Aktion notwendig.
    return
; Ansonsten wurde die Fenstergröße geändert oder maximiert. Passt die Größe der ListView an den neuen Werten an.
GuiControl, Move, MeineListView, % "W" . (A_GuiWidth - 20) . " H" . (A_GuiHeight - 40)
return

GuiClose:  ; Beendet das Skript automatisch, wenn das Fenster geschlossen wird:
ExitApp