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 laufzeitupdate und an der listen position bleiben? (https://www.delphipraxis.net/52341-listview-laufzeitupdate-und-der-listen-position-bleiben.html)

Arnulf 28. Aug 2005 11:33


ListView laufzeitupdate und an der listen position bleiben?
 
Hi
Ich mach in laufzeit mittels timer immerwieder updates auf einem ListView.
Ich ruf hier daten von einem Server ab und die Daten können sich komplett ändern oder auch nicht.

Jedenfalls würde ich gerne an der scroll position bleiben oder wieder zurück springen.
Bis jetzt mach ich das so:
Merken der Position
Delphi-Quellcode:
     ListItem := fMain.List.TopItem;
     if ListItem = nil then i := 0
     else i := ListItem.Index;
     fMain.List.Clear;
List View mit neuen Daten füllen.
Delphi-Quellcode:
     fMain.List.ItemIndex := i;
     fMain.List.Selected.MakeVisible(True);
Das funktioniert aber nicht ganz richtig, weil topItem das oberste item ist und MakeVisible in die mitte zentriert. Das bedeutet die Position verschiebts sich immer wieder.

Bevor ich groß daten abgleiche oder umständlich versuche das ListView mit Dten zu überschreiben und die restlichen einträge lösche bzw. neu hinzufüge ( also ohne .Clear ) wollte ich fragen wie sowas üblicherweise gemacht wird, bzw. wie ich auf die gleich position springen kann?

Arnulf

Arnulf 30. Aug 2005 09:33

Re: ListView laufzeitupdate und an der listen position bleib
 
da ich unbeantwortete threads nicht leiden kann schreib ich hald selbst was dazu.
Ich habs nicht geschafft auf die gleiche position zu springen, aber ich hab das problem einfach manuell umgangen.
Ich lösche das listview nur noch wenn ich komplett neue daten erwarte ( wechselnd des servers ).
Ansonsten überschreibe ich nur noch die alten.

Delphi-Quellcode:
  ItemCount := 0;      
          if (ItemCount >= fMain.List.Items.Count)
          then begin
               ListItem := fMain.List.Items.Add;
               ListItem.SubItems.Add(' ');
               end
               else ListItem := fMain.List.Items.Item[ItemCount];
nach dem schreibe einer zeile nur noch
Delphi-Quellcode:
inc (ItemCount);
Das alles in eine schleife und schon hab ich mein update ohne das verschieben der position.
Eigentlich müsste ich am ende noch die übrig bleibenden zeilen löschen, aber dazu bin ich mal zu faul und so genau muß es auch ned sein :)

Arnulf

alzaimar 30. Aug 2005 09:48

Re: ListView laufzeitupdate und an der listen position bleib
 
Gibts bei der Listview nicht sowas wie 'BeginUpdate / 'EndUpdate'? Genauergesagt bei den Items.
Probiers doch so:

Delphi-Quellcode:
ListView.items.beginupdate;
MyPos := ListView.ItemIndex;
Try
  .... items neu erstellen etc.
Finally
  ListView.ItemIndex := MyPos;
  ListView.Items.EndUpdate;
  End;
Kann sein, das das Merken vom Index überflüssig ist. Wenn Du Items wegschmeisst, musst Du natürlich MyPos entsprechend ändern. Alternativ kannst Du dir auch die 'Caption' von der aktuellen Position merken, und vor dem 'EndUpdate' diese Caption suchen. Oder sonst irgendwas.

generic 30. Aug 2005 11:33

Re: ListView laufzeitupdate und an der listen position bleib
 
ich empfehlt die einen unstieg auf den virtualstringtree von mike liscke.

an diesen kannst du objekte hängen. wenn der tree sich dann "malt" werden die objekt ausgelesen und der inhalt angezeigt.
der vorteil: du brauchst du die objekt ändern. die anzeige erfolgt automatisch.

alzaimar 30. Aug 2005 12:07

Re: ListView laufzeitupdate und an der listen position bleib
 
Wozu empfehlen? Kann die normale Listview doch genausogut. Wie wird denn der Inhalt angezeigt? Als Pointer? String? Lustig. Zeig mal, wie das geht.

Arnulf 30. Aug 2005 22:19

Re: ListView laufzeitupdate und an der listen position bleib
 
Zitat:

Gibts bei der Listview nicht sowas wie 'BeginUpdate / 'EndUpdate'? Genauergesagt bei den Items.
hm weiß nicht genau. - kenn begin update noch nicht :).

Aber ich überschreib ja eh immer alles, deshalb hab ich ja vorher .clear gemacht.
Das ist natürlich auszuprobieren, aber ich hab damit nicht gespielt, weil ich davon ausgehe, daß der user nur den scroll balken benutzt.
und itemindex bezieht sich glaub ich auf das ausgewählte item ( bin mir da garnicht sicher ).
Und ich will ja mit dem scroll balken wieder auf die gleiche stelle.

Aber ich probier mal herum damit.
@generic
du meinst damit, daß ich das objekt neu beschreibe und angezeigt wird es dann, wenn beim view graphisch ein update gemacht wird? - damit verhindert man das blinken oder wie jetzt ?

Arnulf

generic 31. Aug 2005 15:46

Re: ListView laufzeitupdate und an der listen position bleib
 
deim ms control kopierst du die daten von etwas in das control. das control zeichnet sich dann immer neu (wenn notwendig) mit der kopie der daten.

wenn die daten sich nun aktualisieren, dann muss du erneut die daten in das control kopieren, damit das control die neuen daten anzeigen kann.

normal hast du im speicher ein object/record welche die daten hält.
aus diesem kopierst du die daten ins das control.

stop

hier ist der vst interesant - eine kopie der daten ist nicht notwendig
sondern einfach nur ein zeiger auf ein object/record
wenn der vst sich zeichnen will nimmt er immer die aktuellen daten aus dem object bzw. record.

SirThornberry 31. Aug 2005 16:20

Re: ListView laufzeitupdate und an der listen position bleib
 
theoretich funktioniert es so
Delphi-Quellcode:
LPos := GetScrollPos(Listview1.Handle, SB_VERT);
//Listview-Daten ändern
SetScrollPos(Listview1.Handle, SB_VERT, LPos, True);
in der Praxis wird der Listview inhalt dann allerdings falsch gezeichnet.


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