Można krócej, bo jeśli ItemIndex = -1
to nie ma zaznaczonego żadnego elementu, a jeśli jest większy to jest zaznaczony:
if ListBox.ItemIndex = -1 then
ShowMessage('nie zaznaczono')
else
ShowMessage('zaznaczono');
Samo sprawdzanie zakresów przydaje się, jeśli zawartość komponentu może się zmienić przed sprawdzeniem wartości zmiennej i
; Natomiast nie potrzeba sprawdzać gdy np. w zdarzeniu OnMouseDown
sami ustawiamy ItemIndex
według pozycji kursora podczas wciśnięcia LPM, np. tak:
procedure TForm1.ListBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ListBox1.ItemIndex := ListBox1.ItemAtPos(Point(X, Y), True);
end;
i przy zwolnieniu LPM:
procedure TForm1.ListBox1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ListBox1.ItemIndex = -1 then
Edit1.Text := 'nie zaznaczono'
else
Edit1.Text := 'zaznaczono';
end;
Dzięki temu po kliknięciu na pusty obszar komponentu ItemIndex
zostanie ustawiony na -1
; Przy systemowym odrysowywaniu komponentów będzie mylić ramka focusa, ale samo podświetlenie będzie działać prawidłowo, a właściwość ItemIndex
będzie zawsze zawierać poprawne wartości;
Problem ramki focusa można rozwiązać przez ustawienie właściwości Style
na lbOwnerDrawFixed
i własnoręcze malowanie itemów.