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/)
-   -   Zwei Listviews parallel scrollen (https://www.delphipraxis.net/182158-zwei-listviews-parallel-scrollen.html)

v2afrank 6. Okt 2014 08:52

Zwei Listviews parallel scrollen
 
Hallo, ich habe hier zwei Listviews die Daten anzeigen, die der Benutzer miteinander vergleichen möchte. Zuerst hatte jede Listview eine vertikale Scollbar. Nun habe ich über ShowScrollBar(EntladeListview.Handle, SB_VERT, false); die Scrollbar an einer Box ausgeschaltet. Nun soll ein bewegen an der anderen Scrollbar beide Listviews paralllel scrollen. Ist so was möglich ?

Stevie 6. Okt 2014 12:02

AW: Zwei Listviews parallel scrollen
 
Musst einfach das Event abgreifen und es an das andere Control schicken:

Delphi-Quellcode:
type
  TListView = class(ComCtrls.TListView)
  private
    fLinked: TListView;
  protected
    procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
  public
    property Linked: TListView read fLinked write fLinked;
  end;

procedure TListView.WMVScroll(var Message: TWMVScroll);
var
  vpos1, vpos2: Integer;
begin
  inherited;
  if Assigned(fLinked) then
  begin
    vpos1 := GetScrollPos(Handle, SB_VERT);
    vpos2 := GetScrollPos(fLinked.Handle, SB_VERT);
    if vpos1 <> vpos2 then
      fLinked.Perform(LVM_SCROLL, 0, vpos1 - vpos2);
  end;
end;
Das behandelt aber nun nur das Scrollen über den Scrollbalken und nicht über Tastatur oder Mausrad.

v2afrank 7. Okt 2014 06:33

AW: Zwei Listviews parallel scrollen
 
Danke. Ist genau das was ich gescuht habe

Sir Rufo 7. Okt 2014 06:43

AW: Zwei Listviews parallel scrollen
 
Eine weitere Möglichkeit ist das Auswerten von Delphi-Referenz durchsuchenTListView.TopItem und Delphi-Referenz durchsuchenTListView.ItemIndex um das dann auf die anderen ListViews zu übertragen.

Dejan Vu 7. Okt 2014 07:06

AW: Zwei Listviews parallel scrollen
 
Wie überträgt man z.B. das Topitem? Das ist eine Read-Only Property.

Sir Rufo 7. Okt 2014 08:16

AW: Zwei Listviews parallel scrollen
 
Zitat:

Zitat von Dejan Vu (Beitrag 1275048)
Wie überträgt man z.B. das Topitem? Das ist eine Read-Only Property.

Es würde nichts bringen das TopItem zu übertragen, denn das verweist ja auf eine Instanz. Aber man bekommt darüber auch den Index des TopItem und kann dann die andere(n) ListViews dahingehend bewegen, bis die ein TopItem mit dem gleichen Index anzeigen.

Die Reihenfolge ist dabei auch wichtig. Erst ItemIndex setzen und dann positionieren.

Dieses Geraffel lässt man dann am Besten in Delphi-Referenz durchsuchenTApplicationEvents.OnIdle ablaufen.

Dejan Vu 7. Okt 2014 08:51

AW: Zwei Listviews parallel scrollen
 
Izmir schon klar, das man das Item nicht zuweisen kann. Mich hätte nur interessiert, wie ich die zweite Listview so scrollen kann, das das TopItem 'das gleiche' ist. Offenbar muss man das wohl per Hand mit ScrollBy machen, bis der Index vom TopItem passt.

Sir Rufo 7. Okt 2014 10:21

AW: Zwei Listviews parallel scrollen
 
Zitat:

Zitat von Dejan Vu (Beitrag 1275062)
Izmir schon klar, das man das Item nicht zuweisen kann. Mich hätte nur interessiert, wie ich die zweite Listview so scrollen kann, das das TopItem 'das gleiche' ist. Offenbar muss man das wohl per Hand mit ScrollBy machen, bis der Index vom TopItem passt.

Nee mit ScrollBy geht das nicht, das geht mit dem Code von Stevie (gut das TopItem wird da nicht benötigt :stupid:)

Dejan Vu 7. Okt 2014 11:37

AW: Zwei Listviews parallel scrollen
 
Wieso nicht? Wenn dieses 'ScrollBy' oder einer der Scroll-Methoden es erlaubt, um ein paar Pixel in vertikaler Richtung im Report-Modus zu scrollen, sollte das doch gehen...

Delphi-Quellcode:
Procedure Synchronize (lvMaster, lvSlave : TListView);
var
  topIndex,
  curIndex, delta : Integer;
begin
  topIndex := lvMaster.Items.IndexOf(lvMaster.TopItem);
  curIndex := lvSlave.Items.IndexOf(lvSlave.TopItem);
 
  delta := Math.Sign(topIndex-curIndex); //

  while lvSlave.Items.IndexOf(lvSlave.TopItem)<>topIndex do
    lvSlave.Scroll(0,delta);
End;
Wenn die Items alle gleich hoch sind, kann man auch gleich direkt dorthin scrollen, so etwa.
Delphi-Quellcode:
// Ich weiß nicht genau, ob 'Scroll' absolut oder relativ scrollt. Relativ wäre so
lvSlave.Scroll (0, lvSlave.ItemHeight*(topIndex - curIndex));
// Absolut so
lvSlave.Scroll (0, lvSlave.ItemHeight*topIndex);
Habs abern nicht probiert, nur gelesen.

Die Methode kann man per Timer aufrufen oder im OnIdle.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 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