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:

Gui, Add, ListView, Optionen, SpalteTitel1|SpalteTitel2|...

Hier sehen Sie ein funktionierendes Skript, das alle Dateien im Ordner "Eigene Dateien" des Benutzers in einer ListView auflistet:

; Zweispaltige ListView erstellen:
Gui, Add, ListView, r20 w700 gMeineListView, Name|Größe (KB)

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

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

; Das Fenster anzeigen und in den Leerlauf gehen. Das Skript wird jedes Mal benachrichtigt, wenn der Benutzer eine Zeile doppelt anklickt.
Gui, Show
return

MeineListView:
if (A_GuiEvent = "DoubleClick")
{
    LV_GetText(ZeileText, A_EventInfo)  ; Text des ersten Feldes der Zeile abrufen.
    ToolTip Sie haben die Zeile %A_EventInfo% doppelt angeklickt. Text: "%ZeileText%"
}
return

GuiClose:  ; Kennzeichnen, dass das Skript automatisch beendet werden soll, wenn das Fenster geschlossen wird.
ExitApp

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

AltSubmit: Teilt dem Skript mehr ListView-Ereignisse als normal mit. Mit anderen Worten, das g-Label wird öfters gestartet. Weitere Informationen finden Sie unter ListView-Benachrichtigungen.

Background: Geben Sie das Wort Background an, unmittelbar gefolgt von einem Farbnamen (siehe Farbentabelle) oder RGB-Wert (das 0x-Präfix ist optional). Beispiele: BackgroundSilver, BackgroundFFDD99. Wenn diese Option nicht vorhanden ist, verwendet die ListView zu Beginn 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 kann die Standardfarbe einer ListView via GuiControl, +BackgroundDefault, MeineListView wiederhergestellt werden.

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

Checked: Zeigt auf der linken Seite jeder Zeile eine CheckBox an. Fügt man eine Zeile via LV_Add hinzu, kann das Wort Check in den Optionen angegeben werden, um die CheckBox zu Beginn 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 Leistung beim Hinzufügen neuer Zeilen deutlich verbessert (und zu einem gewissen Grad auch beim Sortieren). Um die Leistung noch weiter zu verbessern, verwenden Sie GuiControl, -Redraw, MeineListView, bevor Sie eine große Anzahl von Zeilen hinzufügen. Verwenden Sie anschließend GuiControl, +Redraw, MeineListView, um die Neuzeichnung wieder zu aktivieren (wodurch auch das Steuerelement neu gezeichnet wird).

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, welche die Spaltenüberschriften enthält, zu verstecken. Um sie später wieder sichtbar zu machen, verwenden Sie GuiControl, +Hdr, MeineListView.

LV: Geben Sie die Zeichenkette LV an, unmittelbar gefolgt von der Nummer eines erweiterten ListView-Styles. Diese Styles sind etwas völlig anderes als die generischen erweiterten Styles. -E0x200 beispielsweise bewirkt, 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 zum Beispiel ganz nach rechts verschoben hat.

LV0x20: Geben Sie -LV0x20 an, um zu bewirken, dass 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 bietet 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, dass beim Anklicken einer Spaltenüberschrift eine automatische Sortierung erfolgt. Die Spaltenüberschrift verhält sich jedoch weiterhin visuell wie eine Schaltfläche (es sei denn, es wurde NoSortHdr angegeben). Darüber hinaus erhält das g-Label weiterhin die ColClick-Benachrichtigung, um zum Beispiel eine benutzerdefinierte Sortierung oder andere Aktionen durchzuführen.

ReadOnly: Geben Sie -ReadOnly (minus ReadOnly) an, um dem Benutzer zu erlauben, den Text in der ersten Spalte zu editieren. Um eine Zeile zu editieren, wählen Sie sie aus und drücken Sie F2 (weitere Informationen finden Sie unter WantF2). Alternativ können Sie eine Zeile einmal anklicken, um sie auszuwählen, mindestens eine halbe Sekunde warten und dann die gleiche Zeile erneut anklicken, 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. R10 beispielsweise macht das Steuerelement 10 Zeilen hoch. 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: Fügt man Symbole in den Zeilen einer ListView ein, 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 [v1.0.44+]: Geben Sie -WantF2 (minus WantF2) an, um den Benutzer daran zu hindern, mithilfe von F2 die aktuell fokussierte Zeile zu editieren. Diese Einstellung wird ignoriert, wenn -ReadOnly ebenfalls wirksam ist. Unabhängig von dieser Einstellung erhält das g-Label weiterhin F2-Benachrichtigungen.

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

Ansichtsmodi

Eine ListView hat fünf Ansichtsmodi, von denen der gebräuchlichste Modus die Report-Ansicht ist (Standardeinstellung). Um eine der anderen Ansichten zu nutzen, fügen Sie den entsprechenden Namen in die Optionsliste ein. Die Ansicht kann auch nach dem Erstellen des Steuerelements noch geändert werden; zum Beispiel: GuiControl, +IconSmall, MeineListView.

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 diesem Modus darzustellen, muss der ListView eine Große-Symbole-ImageList zugewiesen werden.

Tile: Große-Symbole-Ansicht, aber mit ergonomischen Unterschieden - so zum Beispiel wird der Text von jedem Element auf der rechten statt unteren Seite des Symbols dargestellt. Checkboxen funktionieren nicht in dieser Ansicht. Zudem wird der Versuch, diese Ansicht in Betriebssystemen älter als Windows XP anzuzeigen, keine Wirkung haben.

IconSmall: Kleine-Symbole-Ansicht.

List: Kleine-Symbole-Ansicht im Listenformat, in der die Symbole in Spalten dargestellt werden. Die Spaltenanzahl richtet sich nach der Breite des Steuerelements und der Breite des breitesten darin enthaltenen Textelements.

Report: Wechselt zurück zur Report-Ansicht, was die Standardeinstellung für jede neue ListView ist. Zum Beispiel: GuiControl, +Report, MeineListView.

Interne ListView-Funktionen

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 aufweist, agieren die Funktionen standardmäßig mit dem zuletzt hinzugefügten Steuerelement. Um das zu ändern, verwenden Sie Gui, ListView, ListViewName - hierbei ist ListViewName entweder der Name der zugeordneten Variable, die ClassNN-Bezeichnung (wie vom internen Tool Window Spy gezeigt) oder [in v1.1.04+] die HWND-Nummer (eindeutige ID) der ListView. 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 "Zeilennummer" bezieht sich auf die aktuelle Position einer Zeile innerhalb der ListView. Die oberste Zeile ist 1, die zweite Zeile ist 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, LV_GetText() in einer Schleife zu verwenden, um bestimmte Zeilen auf Basis ihres Inhalts zu lokalisieren.

Zeilen hinzufügen, ändern und löschen

Spalten-Funktionen

Daten aus einer ListView abrufen

Symbole setzen

LV_Add

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

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

Die Parameter Feld1 und so weiter sind die Spalten der neuen Zeile, die textuell oder numerisch sein können (einschließlich numerische Ergebnisse von Ausdrücken). Um ein beliebiges Feld leer zu machen, geben Sie "" oder ähnliches an. Verwendet man zu wenig Parameter, um den Inhalt jeden Feldes zu setzen, werden die restlichen Felder leer gelassen. Verwendet man zu viele Parameter, werden die überschüssigen Parameter ignoriert.

Bei Misserfolg gibt LV_Add() eine 0 zurück. Bei Erfolg gibt die Funktion 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.

Zeilen-Optionen

Der Optionen-Parameter ist eine Zeichenkette bestehend aus null oder mehr Wörtern von der unteren Liste (nicht Groß-/Kleinschreibung-sensitiv). Trennen Sie alle Wörter jeweils mit einem 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 mit der Anwendung der Parameter Spalte1 und so weiter begonnen werden soll. Diese Option wird häufig in Verbindung mit LV_Modify() verwendet, um einzelne Felder in einer Zeile zu ändern, ohne die Felder auf der linken Seite 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 entfernt werden.

Icon: Geben Sie das Wort Icon an, unmittelbar gefolgt von der Nummer eines Symbols, das auf der linken Seite der ersten Spalte dieser Zeile angezeigt werden soll. Fehlt diese Option, wird das erste Symbol in der ImageList verwendet. Um ein leeres Symbol darzustellen, geben Sie eine Nummer 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 dafür Platz reserviert.

Select: Wählt die Zeile aus. Mit LV_Modify(ZeileNummer, "-Select") kann die Zeile später 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 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 mit Focus und Check oben.

Vis [v1.0.44+]: Stellt sicher, dass die Zeile vollständig sichtbar ist, gegebenenfalls durch Scrollen der ListView. Diese Option funktioniert nur mit LV_Modify(); zum Beispiel: LV_Modify(ZeileNummer, "Vis").

LV_Insert

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

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

Verhält sich identisch zu LV_Add(), abgesehen vom ersten Parameter, der die Zeilennummer für die neu eingefügte Zeile festlegt. 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, wird die neue Zeile am Ende der Liste hinzugefügt. Für Optionen können die Zeilen-Optionen verwendet werden.

LV_Modify

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

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

Diese Funktion gibt bei Erfolg eine 1 und bei Misserfolg eine 0 zurück. Wenn ZeileNummer eine 0 ist, werden alle Zeilen im Steuerelement geändert (in diesem Fall gibt die Funktion nur eine 1 zurück, wenn die Operation bei jeder Zeile erfolgreich war). Verwendet man nur die ersten zwei Parameter, werden nur die Attribute der Zeile geändert, nicht der Inhalt ihrer Felder. Verwendet man zu wenig Parameter, um den Inhalt jeden Feldes zu ändern, werden die restlichen Felder unverändert gelassen. Mit der ColN-Option können bestimmte Felder geändert werden, ohne die anderen zu beeinflussen. Weitere Optionen finden Sie unter Zeilen-Optionen.

LV_Delete

Löscht eine bestimmte Zeile oder alle Zeilen.

LV_Delete(ZeileNummer)

Lässt man den Parameter weg, werden alle Zeilen in der ListView gelöscht. Ansonsten wird nur ZeileNummer gelöscht. Diese Funktion 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(SpalteNummer, Optionen, SpalteTitel)

Die erste Spalte hat die Nummer 1 (nicht 0). Lässt man alle Parameter weg, wird die Breite jeder Spalte an den Inhalt der Zeilen angepasst. Verwendet man nur den ersten Parameter, wird die Breite der angegebenen Spalte an den Inhalt der Zeilen angepasst. Die automatische Größenanpassung funktioniert nur in der Report-Ansicht. Diese Funktion gibt bei Erfolg eine 1 und bei Misserfolg eine 0 zurück.

Spalten-Optionen

Der Optionen-Parameter ist eine Zeichenkette bestehend aus null oder mehr Wörtern von der unteren Liste (nicht Groß-/Kleinschreibung-sensitiv). Trennen Sie alle Wörter jeweils mit einem 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.

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: LV_ModifyCol(1, 50), LV_ModifyCol(1, "50 Integer").

Auto: Passt die Breite der Spalte an den Inhalt ihrer Felder an. Diese Option 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. Wendet man diese Option auf die letzte Spalte an, wird sie mindestens so breit wie der gesamte verbleibende Platz in der ListView gemacht. In diesem Fall ist es ratsam, die Option erst anzuwenden, nachdem die Zeilen hinzugefügt wurden, um sicherzustellen, dass die Breite des vertikalen Scrollbalkens mit in die Größenberechnung einbezogen wird. Diese Option funktioniert nur in der Report-Ansicht.

Icon: Geben Sie das Wort Icon an, unmittelbar gefolgt von der Nummer eines Symbols aus der ImageList, 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 die rechte statt linke Seite der Spalte.

Spalten-Optionen: Datentyp

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. Um eine korrekte Sortierung zu gewährleisten, 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 beginnen mit einer Zahl, dann wird diese herangezogen). 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 von Bedeutung (es sei denn, die Logical-Option wird verwendet, dann liegt das Limit bei 4094).

Spalten-Optionen: Ausrichtung

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 für Integer- und Float-Spalten nicht angegeben werden, da diese standardmäßig rechtsbündig sind. Um diese Standardeinstellung zu überschreiben, können Sie zum Beispiel "Integer Left" oder "Float Center" angeben.

Spalten-Optionen: Sortierung

Case: Die Sortierung der Spalte erfolgt Groß-/Kleinschreibung-sensitiv (betrifft nur Text-Spalten). Lässt man die Optionen Case, CaseLocale und Logical weg, werden die Großbuchstaben 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", die Bindestriche und Apostrophe so behandelt, dass Wörter wie "coop" und "co-op" zusammen bleiben.

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

Logical [v1.0.44.12+]: Das gleiche wie CaseLocale, außer dass alle Ziffernfolgen im Text als echte Zahlen und nicht als gewöhnliche Zeichen behandelt werden. Die Zeichenkette "T33" beispielsweise wäre in diesem Fall größer als "T4". Logical benötigt Windows XP oder höher (bei älteren Betriebssystemen wird stattdessen CaseLocale automatisch verwendet). Darüber hinaus schließen sich Logical und Case gegenseitig aus - es gilt nur die zuletzt festgelegte Option.

NoSort: Verhindert, dass der Klick eines Benutzers die Spalte automatisch sortiert. Um die Sortierung nicht nur für einzelne, sondern für alle Spalten zu deaktivieren, fügen Sie NoSort in den Optionen der ListView ein. Das g-Label, sofern vorhanden, erhält weiterhin die ColClick-Benachrichtigung, wenn 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 die gleiche Spalte die Sortierrichtung umkehrt.

LV_InsertCol

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

LV_InsertCol(SpalteNummer , Optionen, SpalteTitel)

Erstellt eine neue Spalte auf der angegebenen SpalteNummer (alle anderen Spalten werden nach rechts verschoben, um Platz zu schaffen). Die erste Spalte ist 1 (nicht 0). Wenn SpalteNummer größer als die Anzahl der im Steuerelement befindlichen Spalten ist, wird die neue Spalte am Ende der Liste hinzugefügt. Der Inhalt der neu eingefügten Spalte ist zunächst 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. Die Attribute der neuen Spalte (z. B. Integer-Sortierung) verwenden zu Beginn ihre Standardwerte, die via Optionen geändert werden können. Diese Funktion gibt bei Erfolg die Positionsnummer der neuen Spalte und bei Misserfolg eine 0 zurück. Eine ListView kann maximal 200 Spalten enthalten.

LV_DeleteCol

Löscht eine bestimmte Spalte und den gesamten darin befindlichen Inhalt.

LV_DeleteCol(SpalteNummer)

Diese Funktion gibt bei Erfolg eine 1 und bei Misserfolg eine 0 zurück. 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. Auf Betriebssystemen älter als Windows XP könnte der Versuch, die originale erste Spalte zu löschen, fehlschlagen und 0 zurückgeben.

LV_GetCount

Gibt die Anzahl aller Zeilen oder Spalten zurück, oder nur die Anzahl der ausgewählten Zeilen.

LV_GetCount(Modus)

Lässt man den Parameter weg, wird die Funktion die Anzahl aller Zeilen im Steuerelement zurückgeben. Wenn der Parameter "S" oder "Select" ist, wird die Funktion nur die Anzahl der ausgewählten/markierten Zeilen zurückgeben. Wenn der Parameter "Col" oder "Column" ist, wird die Funktion die Anzahl der Spalten im Steuerelement zurückgeben. Die Funktion gibt diese Werte immer ohne Verzögerung zurück, weil das Steuerelement diese stets zwischenspeichert.

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")  ; Jede Zeile auswählen, deren erstes Feld den Filtertext enthält.
}

Das folgende Beispiel zeigt, wie die Breiten der Spalten einer ListView abgerufen werden können, um sie z. B. zwecks Wiederverwendung in eine INI-Datei zu speichern:

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

LV_GetNext

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

LV_GetNext(StartZeileNummer, ZeileTyp)

Wenn keine gefunden wird, gibt die Funktion eine 0 zurück. Wenn StartZeileNummer weggelassen wird oder kleiner als 1 ist, beginnt die Suche bei der ersten Zeile in der Liste. Ansonsten beginnt die Suche bei der Zeile nach StartZeileNummer. Lässt man ZeileTyp weg, wird die Funktion die nächste ausgewählte/markierte Zeile suchen. Geben Sie ansonsten "C" oder "Checked" an, um die nächste abgehakte Zeile zu finden; oder "F" oder "Focused", um die fokussierte Zeile zu finden (es gibt nie mehr als eine fokussierte Zeile in der gesamten Liste, und manchmal gibt es überhaupt keine). 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
    LV_GetText(Text, 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, mit der man herausfinden kann, ob eine bestimmte Zeilennummer abgehakt ist:

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

LV_GetText

Ruft den Text auf der angegebenen ZeileNummer und SpalteNummer ab und speichert ihn in AusgabeVar.

LV_GetText(AusgabeVar, ZeileNummer , SpalteNummer)

Lässt man SpalteNummer weg, wird standardmäßig 1 (der Text der ersten Spalte) verwendet. Wenn ZeileNummer 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 ändern sich nicht, wenn der Benutzer die Spalten via Drag-and-Drop verschiebt. Zum Beispiel wäre die originale erste Spalte auch dann noch Nummer 1, wenn der Benutzer sie ganz nach rechts ziehen würde.

LV_SetImageList

Setzt oder ersetzt die ImageList der ListView.

LV_SetImageList(ImageListID , SymbolTyp)

Diese Funktion ruft man normalerweise auf, bevor man Zeilen hinzufügt. Sie weist der ListView eine ImageList zu und ermöglicht es so, Symbole in den Zeilen (und optional in den Spaltenüberschriften) darzustellen. ImageListID ist die Nummer, die von einem vorherigen IL_Create()-Aufruf zurückgegeben wurde. Lässt man SymbolTyp weg, werden die Symbole in der ImageList automatisch als groß oder klein erkannt. Geben Sie ansonsten eine 0 für große Symbole, eine 1 für kleine Symbole und eine 2 für Zustandssymbole an (Zustandssymbole werden noch nicht direkt unterstützt, aber können via SendMessage verwendet werden).

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 zu wechseln. Um der ListView mehr als eine ImageList zuzuweisen, rufen Sie LV_SetImageList() ein zweites Mal auf und geben Sie für ImageListID die eindeutige ID der zweiten ImageList an. 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 die gleiche 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, ist es möglich, dies zu überschreiben, indem man eine Große-Symbole-ImageList an LV_SetImageList() übergibt und 1 (kleines Symbol) für den zweiten Parameter angibt. Dies führt auch dazu, dass die Höhe jeder Zeile in der ListView erhöht wird, um Platz für das große Symbol zu schaffen.

Bei Erfolg gibt LV_SetImageList() die ImageListID zurück, die vorher mit der ListView verknüpft war (oder 0, wenn nicht). Jede nicht mehr verwendete ImageList sollte normalerweise 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 zu ermitteln, welches Fenster und welche ListView für das Ereignis verantwortlich war. Noch wichtiger ist, dass sie zudem auf A_GuiEvent zugreifen kann. Diese interne Variable enthält eine der folgenden Zeichenketten oder Buchstaben (aus Gründen der Kompatibilität mit zukünftigen Versionen sollte ein Skript nicht davon ausgehen, dass dies die einzigen möglichen Werte sind):

DoubleClick: Der Benutzer hat im Steuerelement einen Doppelklick gemacht. Die Variable A_EventInfo enthält die Nummer der fokussierten Zeile. Mit LV_GetNext() kann stattdessen die Nummer der ersten ausgewählten Zeile abgerufen werden (die Nummer ist 0, wenn der Benutzer eine leere Fläche doppelt angeklickt hat).

R: Der Benutzer hat im Steuerelement einen doppelten Rechtsklick gemacht. Die Variable A_EventInfo enthält die Nummer der fokussierten Zeile.

ColClick: Der Benutzer hat eine Spaltenüberschrift angeklickt. Die Variable A_EventInfo enthält die Nummer der Spalte, der ihr ursprünglich bei ihrer Erstellung zugewiesen wurde; das heißt, dass die Nummer nicht unbedingt die aktuelle Position der Spalte widerspiegelt, wenn der Benutzer diese via Drag-and-Drop verschoben hat. Eine mögliche Reaktion auf einen Spaltenklick ist die Sortierung gemäß den Daten einer versteckten Spalte (mit einer Breite von 0), die in einem sortierfreundlichen Format sind (z. B. ein Datum im YYYYMMDD-Format). Eine versteckte Spalte dieser Art spiegelt eine andere Spalte wider, die dieselben Daten in einem lesbaren Format (z. B. DD.MM.YY) anzeigt. Ein Skript könnte zum Beispiel 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. Anschließend würde das Skript in Reaktion auf die ColClick-Benachrichtigung für Spalte 2 die ListView gemäß den Daten der versteckten Spalte via LV_ModifyCol(3, "Sort") sortieren.

D: Der Benutzer hat den Versuch gestartet, eine Zeile oder ein Symbol via Drag-and-Drop zu verschieben (es gibt derzeit keine interne Unterstützung für das Verschieben von Zeilen oder Symbolen). Die Variable A_EventInfo enthält die Nummer der fokussierten Zeile. [v1.0.44+]: Diese Benachrichtigung tritt auch ohne AltSubmit auf.

d (kleines D): Das gleiche wie oben, außer dass beim Drag-and-Drop die rechte statt linke Maustaste verwendet wurde.

e (kleines E): Der Benutzer hat aufgehört, das erste Feld einer Zeile zu editieren (der Benutzer kann das Feld nur editieren, wenn -ReadOnly in den Optionen der ListView vorhanden ist). Die Variable A_EventInfo enthält die Nummer der Zeile.

G-Label-Benachrichtigungen (Sekundär)

Wenn die ListView das Wort AltSubmit in ihren Optionen verwendet, wird ihr g-Label öfters gestartet und A_GuiEvent folgende zusätzliche Werte enthalten:

Normal: Der Benutzer hat eine Zeile mit der linken Maustaste angeklickt. Die Variable A_EventInfo enthält die Nummer der fokussierten Zeile.

RightClick: Der Benutzer hat eine Zeile mit der rechten Maustaste angeklickt. Die Variable A_EventInfo enthält die Nummer der fokussierten Zeile. In den meisten Fällen ist es ratsam, kein Popup-Menü in Reaktion auf dieses Ereignis anzuzeigen. Verwenden Sie stattdessen das GuiContextMenu-Label, da es auch die MENÜ-Taste erkennt. Zum Beispiel:

GuiContextMenu:  ; Startet bei einem Rechtsklick oder MENÜ-Tastendruck.
if (A_GuiControl != "MeineListView")  ; Diese Überprüfung ist optional. Das Menü wird nur bei einem Klick innerhalb der ListView angezeigt.
    return
; Das Menü auf den Koordinaten A_GuiX und A_GuiY anzeigen. Diese Koordinaten
; sind auch dann korrekt, wenn der Benutzer die MENÜ-Taste drückt:
Menu, MeinKontextmenü, Show, %A_GuiX%, %A_GuiY%
return

A: Eine Zeile wurde aktiviert, was standardmäßig geschieht, wenn sie doppelt angeklickt wurde. Die Variable A_EventInfo enthält die Nummer der Zeile.

C: Die ListView hat die Mauserfassung freigegeben.

E: Der Benutzer hat begonnen, das erste Feld einer Zeile zu editieren (der Benutzer kann das Feld nur editieren, wenn -ReadOnly in den Optionen der ListView vorhanden ist). Die Variable A_EventInfo enthält die Nummer der Zeile.

F: Die ListView hat den Tastaturfokus erhalten.

f (kleines F): Die ListView hat den Tastaturfokus verloren.

I: Der Zustand einer Zeile hat sich in irgendeiner Form geändert; zum Beispiel weil sie ausgewählt, abgewählt, abgehakt usw. wurde. Wenn der Benutzer eine neue Zeile auswählt, empfängt die ListView mindestens zwei solcher Benachrichtigungen: eine für das Abwählen der vorherigen Zeile und eine für das Auswählen der neuen Zeile. [v1.0.44+]: Die Variable A_EventInfo enthält die Nummer der Zeile. [v1.0.46.10+]: ErrorLevel enthält null oder mehr der folgenden Buchstaben, um mitzuteilen, 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). SF beispielsweise bedeutet, dass die Zeile ausgewählt und fokussiert wurde. Um festzustellen, ob ein bestimmter Buchstabe vorhanden ist, verwenden Sie eine Parsende Schleife oder die GroßKleinSensitiv-Option von InStr(); zum Beispiel: InStr(ErrorLevel, "S", true). Hinweis: Aus Gründen der Kompatibilität mit zukünftigen Versionen sollte ein Skript nicht davon ausgehen, das "SsFfCc" die einzigen möglichen Buchstaben sind. Außerdem können Sie Critical in der ersten Zeile von g-Label einfügen, um sicherzustellen, dass alle "I"-Benachrichtigungen empfangen werden (andernfalls könnten einige davon verloren gehen, wenn das Skript nicht mit ihnen Schritt halten 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 in ein Zeichen übersetzt werden. Zum Beispiel Taste := GetKeyName(Format("vk{:x}", A_EventInfo)). Bei den meisten Tastaturlayouts können die Tasten A bis Z via Chr(A_EventInfo) in das entsprechende Zeichen übersetzt werden. F2-Tastendrücke werden unabhängig von WantF2 erfasst. Enter-Tastendrücke hingegen werden nicht erfasst; um sie dennoch zu erfassen, können Sie, wie unten beschrieben, eine Standardschaltfläche nutzen.

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

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

s (kleines S): Der Benutzer hat aufgehört, 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, dabei wird jedem Symbol eine fortlaufende Nummer zugewiesen, beginnend bei 1. Mithilfe dieser Nummer kann das Skript ein bestimmtes Symbol in einer Zeile oder Spaltenüberschrift darstellen. Hier sehen Sie ein funktionierendes Skript, das zeigt, wie Symbole in den Zeilen einer ListView eingefügt werden können:

Gui, 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 (zwecks Vorführung für jedes Symbol eine Zeile).
    LV_Add("Icon" . A_Index, A_Index, "n/a")
LV_ModifyCol("Hdr")  ; Spaltenbreiten automatisch anpassen.
Gui Show
return

GuiClose:  ; Skript beenden, wenn der Benutzer die GUI der ListView schließt.
ExitApp

IL_Create

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

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

AnfänglicheAnzahl ist die Anzahl der Symbole, die Sie voraussichtlich sofort in die Liste aufnehmen werden (lässt man diesen Parameter weg, wird standardmäßig 2 verwendet). WachsendeAnzahl ist die Anzahl der Symbole, um die die Liste jedes Mal erweitert werden soll, wenn ihre Kapazität überschritten wird (lässt man diesen Parameter weg, wird standardmäßig 5 verwendet). GroßeSymbole sollte ein numerischer Wert sein: Wenn dieser Parameter ungleich 0 ist, wird die ImageList große Symbole enthalten. Wenn dieser Parameter 0 ist, wird die ImageList kleine Symbole enthalten (Standardeinstellung, wenn der Parameter weggelassen wird). 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 zur angegebenen ImageListID hinzu und gibt dessen Indexnummer zurück (1 ist das erste Symbol, 2 das zweite und so weiter).

IL_Add(ImageListID, Dateiname , SymbolNummer, NichtSymbolSkalieren)

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, geben Sie für SymbolNummer die entsprechende Nummer an. Wenn SymbolNummer negativ ist, wird dessen absoluter Wert 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 angegeben werden, um ein korrektes Verhalten zu gewährleisten: SymbolNummer sollte die Nummer der Farbmaske/Transparenzfarbe sein (0xFFFFFF, also weiß, ist für die meisten Bilder am besten geeignet); und NichtSymbolSkalieren sollte ungleich 0 sein, um das Bild auf die Größe eines Symbols zu skalieren, oder 0, um das Bild in so viele Symbole wie möglich 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 1 bei Erfolg und 0 bei Misserfolg zurück.

IL_Destroy(ImageListID)

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, explizit die alte zerstören.

ListView-Bemerkungen

Der Befehl Gui Submit funktioniert nicht mit einem ListView-Steuerelement. Demzufolge kann das Skript die zugeordnete Variable der ListView (falls vorhanden) zum Speichern anderer Daten verwenden, ohne befürchten zu müssen, dass diese jemals überschrieben werden.

Nachdem eine Spalte sortiert wurde - z. B. durch Anklicken der Spaltenüberschrift oder Aufrufen von LV_ModifyCol(1, "Sort") - werden alle danach hinzugefügten Zeilen am unteren Ende der Liste erscheinen, anstatt die aktuelle Sortierreihenfolge zu berücksichtigen. Es sei denn, man verwendet die Styles Sort und SortDesc, dann werden neu hinzugefügte 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:

Gui, Add, Button, Hidden Default, OK
...
ButtonOK:
GuiControlGet, FokussiertesStrlmnt, FocusV
if (FokussiertesStrlmnt != "MeineListView")
    return
MsgBox % "Sie haben ENTER gedrückt. Die Nummer der fokussierten Zeile ist " . LV_GetNext(0, "Focused")
return

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. Dies führt dazu, dass die Auswahl zur nächst passenden Zeile springt.

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 Leistung 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 (um die ListView quasi einzurahmen). Um das zu realisieren, erstellen Sie nach der ListView ein Picture-Steuerelement und fügen Sie 0x4000000 (WS_CLIPSIBLINGS) in dessen Optionen ein.

Ein Skript kann mehr als eine ListView pro Fenster erstellen. Informationen darüber, wie man mit einer anderen als der Standard-ListView agiert, finden Sie unter interne Funktionen.

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 Spalten-Funktionen.

Um eine ListView zum Beispiel größer/kleiner zu machen, zu verstecken, oder um die Schrift einer ListView zu ändern, verwenden Sie GuiControl.

Um Texte aus externen ListViews (das sind solche, die nicht zum Skript gehören) zu extrahieren, verwenden Sie ControlGet List.

Siehe auch

TreeView, Andere Steuerelemente, Gui, GuiContextMenu, GuiControl, GuiControlGet, ListView-Styles

Beispiele

#1

; Geben Sie 0 als Zeilennummer an, um alle Zeilen aus- oder abzuwählen:
LV_Modify(0, "Select")   ; Alle auswählen.
LV_Modify(0, "-Select")  ; Alle abwählen.
LV_Modify(0, "-Check")  ; Die Häkchen von allen Checkboxen entfernen.

; Die Breite der Spalten an den Inhalt der Zeilen anpassen:
LV_ModifyCol()  ; Es gibt keine Parameter in diesem Modus.

#2: Das folgende Beispiel ist ein funktionierendes Skript, das umfangreicher als das Beispiel ganz oben ist. 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 einen Rechtsklick auf eine oder mehrere Dateien machen, um ein Kontextmenü anzuzeigen:

; Dem Benutzer erlauben, das Fenster zu maximieren oder dessen Größe anzupassen:
Gui +Resize

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

; ListView und ihre Spalten via Gui Add erstellen:
Gui, Add, ListView, xm r20 w700 vMeineListView gMeineListView, 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 sie später die Symbole anzeigen kann:
LV_SetImageList(ImageListID1)
LV_SetImageList(ImageListID2)

; Ein Popup-Menü erstellen, das als Kontextmenü verwendet wird:
Menu, MeinKontextmenü, Add, Öffnen, KontextDateiÖffnen
Menu, MeinKontextmenü, Add, Eigenschaften, KontextEigenschaften
Menu, MeinKontextmenü, Add, Aus der ListView entfernen, KontextZeilenLöschen
Menu, MeinKontextmenü, Default, Öffnen  ; "Öffnen" in fetter Schrift darstellen, um zu kennzeichnen, dass ein Doppelklick dasselbe bewirkt.

; Das Fenster anzeigen und in den Leerlauf gehen. Das System wird das Skript
; jedes Mal benachrichtigen, wenn der Benutzer eine gültige Aktion durchführt:
Gui, Show
return


ButtonOrdnerLaden:
Gui +OwnDialogs  ; Benutzer zwingen, das folgende Dialogfenster zu schließen, bevor er das Hauptfenster nutzen kann.
FileSelectFolder, Ordner,, 3, Wählen Sie einen Ordner aus, das eingelesen werden soll:
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 Doppel-Schrägstrich zu verhindern.
LetztesZeichen := SubStr(Ordner, 0)
if (LetztesZeichen = "\")
    Ordner := SubStr(Ordner, 1, -1)  ; Schrägstrich am Ende entfernen.

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

; Eine Liste von Dateinamen zusammenstellen und zur ListView hinzufügen:
GuiControl, -Redraw, MeineListView  ; Leistung verbessern durch Abschalten von Redraw beim Laden.
Loop %Ordner%\*.*
{
    DateiName := A_LoopFileFullPath  ; Muss für den Gebrauch unten in eine beschreibbare Variable gespeichert werden.

    ; Eindeutige Endungs-ID erstellen, um Zeichen zu vermeiden, die in Variablennamen
    ; 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  ; Endung der Datei ermitteln.
    if DateiEndung in EXE,ICO,ANI,CUR
    {
        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 als andere sind.
        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 | (Asc(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 Ladeleistung
        ; deutlich verbessert werden, besonders bei Ordnern mit sehr vielen Dateien:
        SymbolNummer := SymbolArray%EndungID%
    }
    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\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  ; Eine Nummer außerhalb des gültigen Bereichs setzen, um ein leeres Symbol anzuzeigen.
        else ; Symbol erfolgreich geladen.
        {
            ; Das hIcon-Element in der Struktur extrahieren:
            hIcon := NumGet(sfi, 0)
            ; 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 worden ist, sollte das Original zerstört werden:
            DllCall("DestroyIcon", "Ptr", hIcon)
            ; Symbol zwischenspeichern, um Speicherbedarf zu reduzieren und Ladeleistung zu verbessern:
            SymbolArray%EndungID% := SymbolNummer
        }
    }

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


ButtonLeeren:
LV_Delete()  ; ListView leeren, aber den Symbol-Cache intakt lassen.
return

ButtonAnsichtWechseln:
if not IconView
    GuiControl, +Icon, MeineListView    ; Zur Symbolansicht wechseln.
else
    GuiControl, +Report, MeineListView  ; Zur Detailansicht zurückwechseln.
IconView := not IconView             ; In Vorbereitung für das nächste Mal umkehren.
return

MeineListView:
if (A_GuiEvent = "DoubleClick")  ; Es können noch andere Werte überprüft werden.
{
    LV_GetText(DateiName, A_EventInfo, 1) ; Text des ersten Feldes abrufen.
    LV_GetText(DateiVerz, A_EventInfo, 2)  ; Text des zweiten Feldes abrufen.
    Run %DateiVerz%\%DateiName%,, UseErrorLevel
    if ErrorLevel
        MsgBox "%DateiVerz%\%DateiName%" konnte nicht geöffnet werden.
}
return

GuiContextMenu:  ; Startet bei einem Rechtsklick oder MENÜ-Tastendruck.
if (A_GuiControl != "MeineListView")  ; Das Menü nur bei einem Klick innerhalb der ListView anzeigen.
    return
; Das Menü auf den Koordinaten A_GuiX und A_GuiY anzeigen. 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.
; Nur mit der fokussierten Zeile agieren, nicht mit allen ausgewählten Zeilen:
FokussierteZeileNr := LV_GetNext(0, "F")  ; Die fokussierte Zeile finden.
if not FokussierteZeileNr  ; Keine Zeile fokussiert.
    return
LV_GetText(DateiName, FokussierteZeileNr, 1) ; Text des ersten Feldes abrufen.
LV_GetText(DateiVerz, FokussierteZeileNr, 2)  ; Text des zweiten Feldes abrufen.
if InStr(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

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 abziehen, 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.
}
return

GuiSize:  ; ListView kleiner/größer machen, wenn Benutzer die Fenstergröße ändert.
if (A_EventInfo = 1)  ; Das Fenster wurde minimiert. Keine Aktion notwendig.
    return
; Ansonsten wurde das Fenster kleiner/größer gemacht oder maximiert. ListView-Größe anpassen.
GuiControl, Move, MeineListView, % "W" . (A_GuiWidth - 20) . " H" . (A_GuiHeight - 40)
return

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