![]() |
TListItem markieren ohne Bildlauf, wenn nicht notwendig
Hallo,
folgende Situation bereitet mit ein paar Kopfschmerzen (jaja, und vom Fussball gestern brummt mir der Kopf auch;) ). Ich habe ein ListView (vsReport) mit vielen Einträgen, so dass der Scrollbar angezeigt wird. Jetzt scrolle ich etwas runter (nicht bis zum letzten Element), markiere einen Eintrag, klicke nen Button, der Eintrag soll verschwinden. Soweit kein Problem. Das Verschwnden mache ich durch Löschen aus der zugrunde liegenden Liste (TList) und neufüllen des ListViews. Das Neufüllen hat interne Gründe, kann ich also nicht vermeiden. Jetzt will ich aber, dass der Nutzer nicht wieder den Anfang der Liste sieht, sondern "etwa" dort steht, wo er vor dem Löschen war. Dazu merke ich mir die List-Position (ItemIndex), und markiere das ListItem, was jetzt an der Stelle steht. mit folgenden Code:
Delphi-Quellcode:
Da ich aber durch das Neufüllen wieder am Anfang der Liste bin,ListItem.Focused := True; ListItem.Selected := True; ListItem.MakeVisible(False); // True bringt auch nix benutze ich ListItem.MakeVisible. Dummerweise macht das MakeVisible aber genau das, was es soll, es bringt das ListItem nur in den Vordergrund. Die genaue Position ist aber immer verschieden. Für den Nutzer sieht es jetzt so aus, als ob der Fokus ständig springt, wenn er mehrere Einträge hintereinander löscht. Wie kann ich das denn verhindern ? Ich habe da was mit dem TopItem gelesen, komme damit aber nicht so richtig weiter, weil ja auch das TopItem gelöscht werden könnte. Danke im voraus Edit: TopItem kann ich nicht setzen, ist "Nur Lesen" Heiko |
Re: TListItem markieren ohne Bildlauf, wenn nicht notwendig
Hallo Heiko,
wenn das eine Option für dich ist, dann virtualisiere die ListView einfach - dein Problem löst sich dann wie von selbst. Code aus einer Demo von mir:
Delphi-Quellcode:
Freundliche Grüße
procedure TMainForm.ItemRemoveExecute(Sender: TObject);
var i, n: integer; begin n := ListView.ItemIndex; for i := Pred(ListItems.Count) downto 0 do if ListItems[i].Selected then begin Values.Delete(i); n := i; end; ListItems.Count := Values.Count; ListView.Invalidate; ListView.ItemIndex := n; end; |
Re: TListItem markieren ohne Bildlauf, wenn nicht notwendig
Hallo,
mein Problem ist aber, dass ich bisher die ListView neu fülle, hm, muss mal sehen, vielleicht geht es ja auch mit dem direkten Löschen. es ist halt nicht schön, dass ich das TopItem nicht selber setzen kann. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz