Listview ScrollBar springt immer nach oben
Ich übertrage Daten aus einer TList in eine ListView. An der Listview wird permanent ein vertikaler ScrollBar angezeigt.
Wenn ich nun die Scrollbar über die Mouse nach unten bewege ohne einen Eintrag zu markieren und die Einträge der ListView aktualisiere, springt der Scrollbar wieder nach oben. Wenn nun viele Einträge in der ListView vorhanden sind, ist es fast unmöglich die ListView durchzuscrollen, da die ScrollBar immer nach oben zum Ersten Eintrag springt. Das ist sehr unschön :( Wie kann ich verhindern das der Scrollbar immer nach oben springt? bzw. mir die alte Position merken und nach dem aktualisieren die Position wiederherstellen. Ich hab es schon mit GetScrollPos und SetScrollPos versucht, aber dann werden die Einträge in der ListView völlig zerissen dargestellt. Für einen guten Tip wäre ich Euch dankbar. Gruss Alois ;) Ich verwende folgendes Beispiel aus dem Internet: Auf der Form befindet sich eine Listview mit 4 Spalten. Folgende Eigenschaften sind gesetzt: OwnerData:=True; ViewSyle:=vsReport;
Delphi-Quellcode:
unit ListViewTest;
interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls; type PMyRec=^TMyRec; TMyRec=record Text1, Text2 :String; Zahl1, Zahl2 :Integer; end; // TMyRec TMyRecList=class(TList) private function GetDaten(aIndex:Integer):PMyRec; procedure SetDaten(aIndex:Integer; aRec:PMyRec); public procedure AddRec(const aRec:TMyRec); procedure Clear; override; property Daten[aIndex:Integer]:PMyRec read GetDaten write SetDaten; end; // TMyRecList TForm1 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure ListView1Data(Sender: TObject; Item: TListItem); private { Private-Deklarationen } fMyRecList:TMyRecList; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.DFM} // ----- TMyRecList procedure TMyRecList.AddRec(const aRec:TMyRec); var r:PMyRec; begin r:=AllocMem(SizeOf(TMyRec)); r^:=aRec; Add(r); end; // TMyRecList.AddRec procedure TMyRecList.Clear; var r:PMyRec; i:Integer; begin for i:=0 to Count-1 do begin r:=Daten[i]; if (r<>nil) then FreeMem(r, SizeOf(TMyRec)); end; // for i inherited Clear; end; // TMyRecList.Clear function TMyRecList.GetDaten(aIndex:Integer):PMyRec; begin if ((aIndex>=0) and (aIndex<Count)) then Result:=PMyRec(Items[aIndex]) else Result:=nil; end; // TMyRecList.GetDaten procedure TMyRecList.SetDaten(aIndex:Integer; aRec:PMyRec); begin if ((aIndex>=0) and (aIndex<Count)) then PMyRec(Items[aIndex])^:=aRec^; end; // TMyRecList.SetDaten // ----- TForm1 procedure TForm1.FormCreate(Sender: TObject); var i:Integer; r:TMyRec; begin fMyRecList:=TMyRecList.Create; for i:=1 to 2000 do begin with r do begin Text1:=Format('Text %d, Spalte 1', [i]); Text2:=Format('Text %d, Spalte 2', [i]); Zahl1:=i; Zahl2:=i+1; end; // with fMyRecList.AddRec(r); end; // for i // der Listview mitteilen, wieviele Einträge existieren ListView1.Items.Count:=fMyRecList.Count; ListView1.Repaint; end; procedure TForm1.FormDestroy(Sender: TObject); begin fMyRecList.Free; end; procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem); var r:PMyRec; begin if (Item=nil) then Exit; r:=fMyRecList.Daten[Item.Index]; if (r<>nil) then with Item do begin Caption:=r^.Text1; SubItems.Add(r^.Text2); SubItems.Add(IntToStr(r^.Zahl1)); SubItems.Add(IntToStr(r^.Zahl2)); end; // if end; end. |
Re: Listview ScrollBar springt immer nach oben
Hallo Alois,
du kannst dir das oberste angezeigte Item (TopItem) merken und später wieder dorthin scrollen. Hier das Prinzip:
Delphi-Quellcode:
Grüße vom marabu
type
TDemoForm = class(TForm) ListView: TListView; SaveButton: TButton; ReposButton: TButton; procedure FormCreate(Sender: TObject); procedure SaveButtonClick(Sender: TObject); procedure ReposButtonClick(Sender: TObject); private topIndex: Integer; end; var DemoForm: TDemoForm; implementation {$R *.dfm} function RandomStr(size: Integer): string; var i: Integer; begin SetLength(Result, size); for i := 1 to Length(Result) do Result[i] := Chr(Ord('A') + Random(26)); end; procedure TDemoForm.FormCreate(Sender: TObject); begin with ListView.Items do while Count < 100 do Add.Caption := RandomStr(5); end; procedure TDemoForm.SaveButtonClick(Sender: TObject); begin topIndex := ListView.TopItem.Index; end; procedure TDemoForm.ReposButtonClick(Sender: TObject); var itemHeight, index: Integer; r: TRect; begin with ListView do begin index := TopItem.Index; r := TopItem.DisplayRect(drBounds); itemHeight := r.Bottom - r.Top; Scroll(0, itemHeight * (topIndex - index)); end; end; |
Re: Listview ScrollBar springt immer nach oben
Hi @marabu,
Vielen Dank für Deine Hilfe. Gruss Alois ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:41 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