@Stevie
Danke für die Hilfe! Es funktioniert aber irgendwie ungenau. Die ListView scrollt bereits, bevor den Mauszeiger den untensten oder obersten Item erreicht hat.
Ich habe auf einer russischen Seite eine Funktion gefunden.
Code:
var
d: integer = 0;
procedure Move;
var
NewIndex: integer;
begin
with Form1.ListView1 do if Assigned(Selected) then begin
NewIndex := Selected.Index + d;
if NewIndex < 0
then NewIndex := 0
else if NewIndex >= Items.Count
then NewIndex := Items.Count - 1;
if NewIndex <> Selected.Index then begin
Selected := Items[NewIndex];
ItemFocused := Selected;
Selected.MakeVisible(true);
end;
end;
end;
procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
SetCapture(ListView1.Handle);
end;
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
li: TListItem;
begin
if ssLeft in Shift then with ListView1 do begin
li := GetItemAt(10, Y);
if Assigned(li) then begin
Timer1.Enabled := false;
Selected := li;
ItemFocused := ListView1.Selected;
end else begin
if Y >= ListView1.ClientHeight
then d := (Y - ListView1.ClientHeight) div 20 + 1
else d := Y div 20 - 1;
if Timer1.Enabled = false then begin
Move;
Timer1.Enabled := true;
end;
end;
end;
end;
procedure TForm1.ListView1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
Timer1.Enabled := false;
ReleaseCapture;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Move;
end;
Funktioniert super. Nur wenn ich
ListView.MultiSelect auf
True setze, scrollt es nur nach oben. Wie kann ich die obere Code so optimieren, dass es bei
MultiSelect := true auch genauso gut funktioniert? Danke!