Delphi - Get-und Set-Scrollbar Position einer ListView
Es mag wie eine dumme & einfache Frage, und doch, ich habe nicht in der Lage eine befriedigende Antwort darauf finden. Im Grunde genommen habe ich eine TListview (style = vsReport) mit Daten. Manchmal meine ich, ihn zu aktualisieren, und deshalb habe ich auf deaktivieren Sie das listview-Steuerelement und füllen es wieder mit den aktualisierten Daten.
Allerdings, wenn ich tun, dass die scrollbar-position wird zurückgesetzt auf 0. Ich möchte in der Lage sein, um die scrollbar-position, bevor Sie die Lichtung, und legen Sie es zurück zu dem, was es vorher war. Wenn die aktualisierten Daten, hat genau die gleiche Menge an Zeilen wie die alten Daten, ich brauche Sie die Bildlaufleiste, um an der exakt gleichen position wie zuvor; wenn nicht, brauche ich nur mehr-oder-weniger an der gleichen Stelle wie zuvor.
Scheint einfach, richtig? Doch, alle die ich gefunden habe, sind hacks oder tweaks mit TopItem und MakeVisible. Gibt es eine entsprechende Methode, das zu tun?
Dank!
Es schien mir logischer, da die aktualisierten Daten, möglicherweise mehr oder weniger Zeilen als die alten Daten. Bin ich falsch?
Was ist, wenn die Anzahl der Elemente in der Liste steigt? Was ist, wenn das alte Element ist "stillgelegt" (dh, nicht in die "aktualisierte" Liste)?
Ihre Frage war "Wenn die aktualisierten Daten, hat genau die gleiche Menge an Zeilen wie die "alten Daten". Wenn es weniger Zeilen sind, aktualisieren Sie einfach die, die Sie brauchen, und löschen Sie den rest (nacheinander). Wenn es "ausgemusterten" Gegenständen, ersetzen Sie einfach den aktuellen Inhalt mit dem neuen Inhalt, den es sein sollte, anstatt jetzt. Clearing/Neuerstellung der Elemente der Liste ist ein teurer Vorgang.
Ich habe nie gesagt, "Artikel löschen, halten Sie die Bildlaufleiste an der gleichen Stelle" irgendwo in dem, was ich schrieb. In der Tat, riet ich das Gegenteil (nicht das löschen von Elementen, wenn Sie nicht haben, dies zu tun). Bitte Lesen, was ich schrieb wieder.
InformationsquelleAutor Allain McCain | 2013-12-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Speichern Sie den obersten Eintrag vor dem löschen,
Nach dem Update, das scrollen der listview, so dass die gespeicherten top-Punkt ' s 'y' - position 0 (+ header Höhe):
Tatsächlich, da sind Sie wieder-Auffüllen der listview, Sie entwickeln einen Mechanismus zu finden, welches Element Sie wollen an der Spitze anstelle von speichern eine Referenz darauf.
Wenn Sie nicht wie die ändern die scroll-position durch 'top-Punkt', da Funktionen wie
SetScrollInfo
,SetScrollPos
nicht aktualisieren Sie die client-Bereich des Steuerelements, die Sie verwenden könnenGetScrollInfo
um die 'nPos' derTScrollInfo
vor dem löschen der Liste und dann schicken Sie, dass vieleWM_VSCROLL
Nachrichten mit 'SB_LINEDOWN`, nach dem Auffüllen.Speichern Sie die scroll-position:
Nach dem Auffüllen, Blättern (vorausgesetzt, die scroll-position ist 0):
oder,
Verwenden Sie 'commctrl'
Wow, wie schlampig. Ich würde das
TopItem
, außer in meinem Fall habe ich die Liste aufzufrischen, denn kann ein Benutzer verwendet (und damit entfernt) ein Element aus der Liste - und wenn das oberste Element war die, die der user wählte, um zu entfernen, es würde nicht funktionieren. Also ich denke, ich bin stecken mit die schlampige Lösung senden Bildlauf-Nachrichten X-mal und hoffe, es wird die genaue position, an der es vorher war.InformationsquelleAutor Sertac Akyuz
InformationsquelleAutor BRTH1