Die Listbox in unserem Beispielprogramm gestattet die Auswahl mehrerer Einträge. Auch hier wäre eine Fehlerkorrektur empfehlenswert: zuerst sollte man feststellen, wie viele Einträge markiert sind. Dann sucht man den Index des jeweiligen Eintrages und den Text selbst heraus. Das Beispielprogramm enthält eine entsprechende Prozedur, die durch einen Button aufgerufen wird.
Zuerst finden wir mit Hilfe der Nachricht "LB_GETSELCOUNT" die Anzahl der markierten Einträge heraus:
CountItems := SendMessage(hwndListbox, LB_GETSELCOUNT, 0, 0);
Auf die Weise müssen wir nicht mühsam alle Einträge auf ihren Status prüfen. Wir nutzen stattdessen die Nachricht "LB_GETSELITEMS" und übergeben den eben ermittelten Wert als ersten Parameter. Der zweite ist ein Integer-Array, dass die Indexwerte der markierten Einträge aufnehmen soll. Dieses Array muss groß genug sein. Im Beispielprogramm ist er auf 100 Einträge begrenzt.
SendMessage(hwndListbox, LB_GETSELITEMS, CountItems, Integer(@SelItems));
Der Rest ist eine for-Schleife, in der wir die Indexes durchlaufen, den zugehörigen Text ermitteln und in das Eingabefeld eintragen lassen. Zum Auslesen eines Eintrages nutzen wir die Nachricht "LB_GETTEXT". Diese Nachricht benötigt zwei Parameter. Der erste ist der Index, dessen Text wir ermitteln wollen, und der zweite ist ein Zeiger auf den Puffer, der den Text aufnehmen soll. Das Prinzip ähnelt dabei dem Auslesen eines Editfeldes.
for i := 0 to CountItems-1 do begin SendMessage(hwndListbox, LB_GETTEXT, SelItems[i], Integer(@buffer)); lstrcat(buffer1, buffer); lstrcat(buffer1, '; '); SetWindowText(hwndEditSelItems, buffer1); end;
Eine elegantere Methode wäre ein dynamisches Array, das sich nach der Anzahl der markierten Einträge richtet und damit auf keine feste Größe (wie 100, in dem Fall) beschränkt ist. Die Umsetzung ist auch recht einfach. Das Array wird wie folgt deklariert:
var SelItems : array of integer;
Wenn wir nun die Anzahl der markierten Einträge ermittelt haben, dann setzen wir die Länge dieses Arrays entsprechend:
SetLength(SelItems,CountItems);
Der einzige Unterschied zwischen dynamischem und festem Array ist nun der, dass das dynamische Array noch dereferenziert werden muss, damit auch auf das erste Element (mit dem Index Null) zugegriffen wird. Es gibt dafür zwei Möglichkeiten:
SendMessage(hwndListbox, LB_GETSELITEMS, CountItems, LPARAM(@SelItems[0]));SendMessage(hwndListbox, LB_GETSELITEMS, CountItems, LPARAM(pointer(@SelItems)^));
Würden wir das nicht tun, wäre eine Zugriffsverletzung die Folge. Und am Ende müssen wir den belegten Speicher des Arrays wieder freigeben:
SetLength(SelItems,0);