Błąd "list of items out of bounds(-1)" po kliknięciu na item ListBoxa

0

mam listboxa który domyślnie jest pusty, i mam znaleźć numer zaznaczonego myszką wiersza(ale już po załadowaniu danych).

 
procedure TForm1.Button11Click(Sender: TObject);
          var i: integer;
begin
 i := ListBox1.ItemIndex;
 if ListBox1.Selected[i] then
ShowMessage('Item number '+IntToStr(i)+' has been selected'); 

end;

po zastosowaniu powyższego cały czas wyskakuje błąd jak w temacie. jak skorygować kod, aby działało?

1
if (i<0)or(i>=ListBox1.Items.Count) then ShowMessage('No one item has been selected'); 
else if ListBox1.Selected[i] then ShowMessage('Item number '+IntToStr(i)+' has been selected');
2

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1