AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi TListItem markieren ohne Bildlauf, wenn nicht notwendig
Thema durchsuchen
Ansicht
Themen-Optionen

TListItem markieren ohne Bildlauf, wenn nicht notwendig

Ein Thema von hoika · begonnen am 26. Jun 2008 · letzter Beitrag vom 26. Jun 2008
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#1

TListItem markieren ohne Bildlauf, wenn nicht notwendig

  Alt 26. Jun 2008, 10:00
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
Heiko
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: TListItem markieren ohne Bildlauf, wenn nicht notwendig

  Alt 26. Jun 2008, 11:16
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
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: TListItem markieren ohne Bildlauf, wenn nicht notwendig

  Alt 26. Jun 2008, 12:57
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
Heiko
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:35 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