Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi ListView scrollen??? (https://www.delphipraxis.net/30655-listview-scrollen.html)

romber 27. Sep 2004 16:10


ListView scrollen???
 
Hallo!

Wie kann ich es so machen, dass ListView scrollt, wenn ich die Maustase drucke und den Mauszeiger nach unten bzw. nach oben ziehe?

Stevie 27. Sep 2004 17:00

Re: ListView scrollen???
 
Entweder so:
Delphi-Quellcode:
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
  const Speed = 3;
begin
  if (ssLeft in Shift) then
  begin
    if (Y - Pos.Y > 3) then
    begin
      ListView1.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
      Pos.Y := Y;
    end
    else if (Y - Pos.Y < -3) then
    begin
      ListView1.Perform(WM_VSCROLL, SB_LINEUP, 0);
      Pos.Y := Y;
    end;
  end;
end;

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Pos.Y := Y;
end;
oder so:
Delphi-Quellcode:
procedure TForm1.ListView1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  Now.Y := Y;
end;

procedure TForm1.ListView1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Pos.Y := Y;
  Timer1.Enabled := True;
end;

procedure TForm1.ListView1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Timer1.Enabled := False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
  const Speed = 3;
var
  i: Integer;
begin
  for i := 1 to ((Now.Y - Pos.Y) div Speed) do
    ListView1.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
  for i := -1 downto ((Now.Y - Pos.Y) div Speed) do
    ListView1.Perform(WM_VSCROLL, SB_LINEUP, 0);
end;

romber 27. Sep 2004 17:44

Re: ListView scrollen???
 
Was sind dabei Pos und Now?

Stevie 28. Sep 2004 07:47

Re: ListView scrollen???
 
Das sind Elemente vom Typ TPoint.

romber 28. Sep 2004 13:30

Re: ListView scrollen???
 
@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!

Stevie 28. Sep 2004 13:44

Re: ListView scrollen???
 
Zitat:

Zitat von romber
@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.

Ist ja auch klar, weil ich überhaupt nicht festgelegt habe, dass er das machen soll! (War ja auch nicht nach gefragt, gell?) :zwinker:
Zitat:

Zitat von romber
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!

Auf den ersten Blick überhaupt nicht, weil diese Methode mit Selected arbeitet, und das bei MultiSelect nicht funktioniert. Ist ja auch klar, welches Element soll denn auch zurückgegeben werden, wenn mehrere ausgewählt sind!?

romber 28. Sep 2004 14:19

Re: ListView scrollen???
 
[quote="Stevie"]Ist ja auch klar, weil ich überhaupt nicht festgelegt habe, dass er das machen soll! (War ja auch nicht nach gefragt, gell?) :zwinker:[quote]

Aso... Und wie kann ich den die Werte festlegen??? Danke!

Stevie 28. Sep 2004 14:31

Re: ListView scrollen???
 
Dafür musst du meine zweite Lösung heranziehen:
Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
  const Area = 25;
begin
  if Now.Y < Area then
    ListView1.Perform(WM_VSCROLL, SB_LINEUP, 0);
  if (ListView1.Height - Now.Y) < Area then
    ListView1.Perform(WM_VSCROLL, SB_LINEDOWN, 0);
end;
Wenn du in den Bereich der unteren oder oberen 25 Pixel kommst, dann wird gescrollt.

romber 28. Sep 2004 14:39

Re: ListView scrollen???
 
Danke! Probiere ich gleich aus. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:51 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz