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 TListItem markieren ohne Bildlauf, wenn nicht notwendig (https://www.delphipraxis.net/116278-tlistitem-markieren-ohne-bildlauf-wenn-nicht-notwendig.html)

hoika 26. Jun 2008 10:00


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:
       
        ListItem.Focused := True;
        ListItem.Selected := True;
        ListItem.MakeVisible(False); // True bringt auch nix
Da ich aber durch das Neufüllen wieder am Anfang der Liste bin,
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

marabu 26. Jun 2008 11:16

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:
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;
Freundliche Grüße

hoika 26. Jun 2008 12:57

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 17:19 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