Ich habe in einer ListBox-Ableitung die relevanten Windows-Nachrichten abgefangen (ich hoffe alle?). Mir ist kein Weg bekannt, das Selektieren selbst abzufangen, was eigentlich das sauberste wäre, daher der umständliche Weg über Maus und Tastatur.
Binde die folgende
Unit im entsprechenden Formular
nach StdCtrls ein. Dann verhält sich Deine Listbox so wie Du es beschrieben hast. Man könnte noch ein Property einbauen, welches dieses Verhalten ein- bzw. ausschaltet, dann kann man auch normale Listboxen verwenden.
Delphi-Quellcode:
unit lb_new;
interface
Uses StdCtrls, Windows, Messages, Types;
Type TListBox=class(StdCtrls.TListBox)
Procedure WndProc(
var Message: TMessage);
override;
end;
implementation
{ TListBox }
Procedure TListBox.WndProc(
var Message: TMessage);
Var ClickedItem: Integer;
NumVisibleItems: Integer;
Begin
Case Message.Msg
Of
WM_KEYDOWN:
Begin
Case TWMKEYDOWN(
Message).CharCode
Of
VK_UP:
Begin
If ItemIndex=1
Then
TopIndex := 0
Else
Inherited;
End;
VK_HOME:
Begin
TopIndex := 0;
ItemIndex := 1;
End;
VK_PRIOR:
Begin
NumVisibleItems := ClientHeight
Div ItemHeight;
If ItemIndex-NumVisibleItems+1<=0
Then Begin
TopIndex := 0;
ItemIndex := 1;
End
Else
Inherited;
End;
Else
Inherited;
End;
End;
WM_LBUTTONDOWN:
Begin
ClickedItem := ItemAtPos(Point(TWMLBUTTONDOWN(
Message).xPos,TWMLBUTTONDOWN(
Message).yPos),True);
If ClickedItem>0
Then
Inherited;
End;
Else
Inherited;
End;
End;
end.