Entwickler-Ecke

Windows API - Selektion in einer Listbox ändern


Tweafis - So 22.06.03 17:31
Titel: Selektion in einer Listbox ändern
Ich dachte das geht über


Delphi-Quelltext
1:
SendMessage(hwnd, LB_SETSEL, Integer(True), Index);                    


In der Hifle zu LB_SETSEL steht
Zitat:
LB_SETSEL
wParam = (WPARAM) (BOOL) fSelect; // selection flag
lParam = (LPARAM) (UINT) index; // item index


Das funzt aber überhaupt nicht :( also wenn ich jetzt z.B.

Delphi-Quelltext
1:
SendMessage(hwndListbox, LB_SETSEL, Integer(True), 1);                    

mache selektiert er überhaupt nix bzw nix anderes. Was mache ich falsch?


Tweafis - Mo 23.06.03 12:18

Sorry, dass ich hier doppelposte, aber das dürfte doch für euch Profis kein Problem sein :(


Delete - Mo 23.06.03 13:20

Auszug aus Luckies Listbox-Demo (Prozedur "SelAll"):

Delphi-Quelltext
1:
2:
3:
4:
5:
  CountItems := SendMessage(hwndListbox, LB_GETCOUNT, 00);
  if CountItems = 0 then exit;

  for i := 0 to CountItems do
    SendMessage(hwndListbox, LB_SETSEL, Integer(true), i);

Geht. :)


Tweafis - Mo 23.06.03 14:41

Hmm, die hab ich schon gelesen aber wenn ich jetzt direkt nach dem erstellen die letzte Zeile einfüge und das i durch 1 ersetze müsste doch das 2 Item Selektioert werden, oder? und das wird es eben nicht...


Delete - Mo 23.06.03 17:04

Nochmals ein Auszug aus der angesprochenen Demo, wenn auch leicht verändert. Das soll beweisen, dass es auch gleich nach dem Erstellen der Listbox und der Items funktioniert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
case uMsg of
  WM_CREATE:
    begin
      { ... }

      {Listbox erstellen}
      hwndListBox := CreateWindowEx(WS_EX_CLIENTEDGE, 'LISTBOX'nil, WS_CHILD
        or WS_VISIBLE or LBS_STANDARD or LBS_EXTENDEDSEL, 1010200230,
        hWnd, IDC_LB, hInstance, nil);

      {Listbox füllen}
      buffer := 'Peter';
      SendMessage(hwndListbox, LB_ADDSTRING, 0, Integer(@buffer));
      buffer := 'Dieter';
      SendMessage(hwndListbox, LB_ADDSTRING, 0, Integer(@buffer));
      buffer := 'Uli';
      SendMessage(hwndListbox, LB_ADDSTRING, 0, Integer(@buffer));
      buffer := 'Norbert';
      SendMessage(hwndListbox, LB_ADDSTRING, 0, Integer(@buffer));
      buffer := 'Otto';
      SendMessage(hwndListbox, LB_ADDSTRING, 0, Integer(@buffer));

      { 2. Item auswählen }
      SendMessage(hwndListbox, LB_SETSEL, integer(true), 1);

      { ... }
    end;
end;

Geht auch. Ich weiß nicht mehr weiter, @Tweafis. Sorry, dass ich dir nicht helfen kann, aber ich sehe keinen Fehler. :(


Tweafis - Mo 23.06.03 18:39


Delphi-Quelltext
1:
2:
3:
4:
5:
        hwndListbox := CreateWindowEx(WS_EX_CLIENTEDGE or WS_EX_STATICEDGE, 'LISTBOX'nil, WS_VISIBLE or
          WS_CHILD, 88200200,
          hWnd, IDC_LISTBOX, hInstance, nil);

        SendMessage(hwndListbox, LB_SETSEL, Integer(True), 1);


So sieht mein Code aus. Warum geht das nicht???


an den Styles Standard und Extsel liegt es nicht, hab ich getestet.


Delete - Di 24.06.03 07:00

Doch, an den Stilattributen liegt es. :wink:
Schau mal ins PSDK:
PSDK hat folgendes geschrieben:
LB_SETSEL
An application sends an LB_SETSEL message to select a string in a multiple-selection list box.

Du brauchst LB_SETCURSEL, wenn man nur ein Item auswählen kann. Eigentlich hätte ich da wohl auch gestern drauf kommen können. :oops:


Tweafis - Di 24.06.03 15:35

Thx, werde ich gleich testen, und mich dann melden :D


Tweafis - Di 24.06.03 16:13


Delphi-Quelltext
1:
2:
3:
4:
5:
        hwndListbox := CreateWindowEx(WS_EX_CLIENTEDGE or WS_EX_STATICEDGE, 'LISTBOX'nil, WS_VISIBLE or
          WS_CHILD, 88200200,
          hWnd, IDC_LISTBOX, hInstance, nil);

        SendMessage(hwndListbox, LB_SETCURSEL, 10);


Warum geht das nicht?


Tweafis - Di 24.06.03 16:15

Argggg...... Ich bin soooo schlau... Ich hab die Items erst nachdem ich sie selektieren wollte erstellt :autsch: :autsch: :autsch:

hat sich erledigt ;)


Delete - Di 24.06.03 17:03

Ab! Zur Strafe in die Ecke und schämen! :)


Tweafis - Di 24.06.03 17:26

Ich hab schon meinen Kopf gegen die Wand geschlagen, dass muss reichen ;)