AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Zwei Listviews parallel scrollen

Ein Thema von v2afrank · begonnen am 6. Okt 2014 · letzter Beitrag vom 7. Okt 2014
Antwort Antwort
v2afrank
Online

Registriert seit: 9. Mai 2005
Ort: Bocholt
573 Beiträge
 
Delphi XE2 Professional
 
#1

Zwei Listviews parallel scrollen

  Alt 6. Okt 2014, 09:52
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 ?
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Zwei Listviews parallel scrollen

  Alt 6. Okt 2014, 13:02
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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
v2afrank
Online

Registriert seit: 9. Mai 2005
Ort: Bocholt
573 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Zwei Listviews parallel scrollen

  Alt 7. Okt 2014, 07:33
Danke. Ist genau das was ich gescuht habe
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Zwei Listviews parallel scrollen

  Alt 7. Okt 2014, 07:43
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#5

AW: Zwei Listviews parallel scrollen

  Alt 7. Okt 2014, 08:06
Wie überträgt man z.B. das Topitem? Das ist eine Read-Only Property.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Zwei Listviews parallel scrollen

  Alt 7. Okt 2014, 09:16
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#7

AW: Zwei Listviews parallel scrollen

  Alt 7. Okt 2014, 09:51
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Zwei Listviews parallel scrollen

  Alt 7. Okt 2014, 11:21
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 )
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#9

AW: Zwei Listviews parallel scrollen

  Alt 7. Okt 2014, 12:37
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:57 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