Die List-View mit Inhalt füllen


Für das Füllen benötigen wir ein weiteres Record, LVItem. Als Beispiel soll ein Auszug aus der entsprechenden Prozedur unseres Programms dienen. Man erzeugt eine Maske, die den Typ (Text) bestimmt

lvi.mask     := LVIF_TEXT;

Dann legt man den Item- und SubItem-Index fest

lvi.iItem    := Loop;
lvi.iSubItem := 0;

weist den Text zu (in dem Fall: der Name der gefundenen Datei)

lvi.pszText  := finddata.cFileName;

Damit können wir den Eintrag mit der Nachricht "LVM_INSERTITEM" in die Liste einfügen, wobei der lParam-Wert der Zeiger auf das eben gefüllte Record ist:

SendMessage(hLV,LVM_INSERTITEM,0,Integer(@lvi));

Alternative

Alternativ dazu können Sie auch "ListView_InsertItem" verwenden, das nur eine Kapselung der Nachricht ist:

ListView_InsertItem(hLV,lvi);

Für unseren zweiten Eintrag lesen wir zunächst die Dateigröße in einen Textpuffer. Weil es sich nun um den Eintrag in der zweiten Spalte handelt, müssen wir die iSubItem-Membervariable des Records entsprechend ändern:

lvi.iSubItem := 1;

Wir weisen den Textpuffer mit der Dateigröße zu

lvi.pszText  := buf;

und benutzen diesmal die Nachricht "LVM_SETITEM" bzw. das Makro "ListView_SetItem"

ListView_SetItem(hLV,lvi);

Der Unterschied ist, dass "LVM_INSERTITEM" ein neues Item einfügt, während wir mit "LVM_SETITEM" die Möglichkeit haben, weitere Angaben zum aktuellen Item (wie eben Einträge in anderen Spalten) zu treffen.


Den Dateityp bestimmen

Eine kleine Besonderheit ist die Anzeige des Dateityps. Diese Namen werden vom System zur Verfügung gestellt, und wir kommen mit Hilfe der Funktion "SHGetFileInfo" an sie heran. Die Funktion benötigt neben dem Dateinamen eine Variable vom Typ "TSHFileInfo". Da wir an der Typenbezeichnung interessiert sind, benutzen wir das Flag SHGFI_TYPENAME, so dass der Aufruf wie folgt aussieht:

SHGetFileInfo(finddata.cFilename,0,fi,sizeof(TSHFileInfo),SHGFI_TYPENAME);

Nach dem Aufruf enthält die szTypeName-Membervariable die Bezeichnung. Der Rest entspricht der o.g. Vorgehensweise: Sie wählen den Index des Sub-Items, damit die passende Spalte gefüllt wird, dann Sie weisen den ausgelesenen Typennamen zu und fügen das neue Item in die List-View ein.

lvi.mask     := LVIF_TEXT;
lvi.iSubItem := 2;
lvi.pszText  := fi.szTypeName;
ListView_SetItem(hLV,lvi);