Delphi-PRAXiS
Seite 1 von 2  1 2      

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 TListView - Eintrag löschen hinterlässt "Loch" (https://www.delphipraxis.net/186074-tlistview-eintrag-loeschen-hinterlaesst-loch.html)

Daniel 31. Jul 2015 17:25

TListView - Eintrag löschen hinterlässt "Loch"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,

die Situation ist albern - und zu meinem Leidwesen kann ich das Problem aktuell nicht besser artikulieren. Mein ListView hat einfach ein Loch.
:oops:

Gegeben ist ein ListView mit beispielsweise sechs Einträgen. Nun lösche ich den vorletzten Eintrag via ListView1.Items.Delete(4) raus.
Nun erwarte ich, dass der Listview den untersten Eintrag artig nach oben verschiebt, um die entstandene Lücke zu schliessen. Das tut er in meinem Fall aber nicht. Der unterste Eintrag bleibt stehen, wo er ist.
Zuerst glaubte ich an ein Update-Problem in dem Sinne, dass die neue Situation nicht gezeichnet wird. Nein. Der ListView kann mit der Lücke umgehen - und das überraschend souverän. Selektiere ich den Eintrag VOR der Lücke und gehe mit dem Cursor nach unten, springt der Fokus völlig korrekt über die Lücke und selektiert den letzten Eintrag.
Selbst eine Größenänderung des Formulars (der Listview ist mit Align = alClient ausgerichtet) übersteht die Lücke unbeschadet. Bis hin zu den Scrollbalken, die die Lücke korrekt einberechnen, wenn ich das Form entsprechend verkleinere.

Es bleibt dabei, nach dem Löschen hat er ein Loch. Und ich dachte, der sei noch gut, den könne man noch verwenden. :stupid:

Anbei ein Screenshot der verschiedenen Phasen.
Anhang 43651


Vielleicht hatte ich bisher nur Glück - aber so habe ich das bisher noch nie erlebt. Kennt das jemand?


//edit:
Items.Count ist nach dem Löschen korrekt reduziert, .Invalidate/.Refresh./Paint etc. habe ich durchprobiert, .BeginUpdate und .EndUpdate ebenfalls - ohne Erfolg.

haentschman 31. Jul 2015 18:25

AW: TListView - Eintrag löschen hinterlässt "Loch"
 
Hallo Daniel,

Ich gehe auf Grund der Optik von FMX aus. Oder ist das VCL? :P Hast du vergessen zu erwähnen. :zwinker:

Luckie 31. Jul 2015 19:29

AW: TListView - Eintrag löschen hinterlässt "Loch"
 
Die Items sind mehrzeilig, wenn ich das richtig sehe. Zeichnest du die selbst? Wenn ja, nimm den Code mal raus.

Daniel 31. Jul 2015 22:29

AW: TListView - Eintrag löschen hinterlässt "Loch"
 
Pure VCL, nichts selbstgezeichnet.
Das sind die Listview-Tiles. Den Code dafür habe ich aus Deinen Tutorials, Michael. ;-)

Luckie 31. Jul 2015 22:41

AW: TListView - Eintrag löschen hinterlässt "Loch"
 
Wie verhält er sich im Reportstil?

alda 31. Jul 2015 22:42

AW: TListView - Eintrag löschen hinterlässt "Loch"
 
In solchen Fällen baue ich persönlich die GUI grundsätzlich immer neu auf (sprich über Clear() und Add()).
Allerdings weiß ich nicht wie performant die TListView an dieser Stelle ist - Deinem Screenshot nach zu urteilen sollte das zumindest für deinen Anwendungsfall problemlos funktionieren :P

Daniel 1. Aug 2015 10:23

AW: TListView - Eintrag löschen hinterlässt "Loch"
 
@Michael:
Vermutlich würde es im Report-Modus gehen, aber das hilft mir nur eingeschränkt.

@alda:
So mache ich es jetzt auch, bei < 20 Einträgen ist die zusätzliche Zeit zu vernachlässigen.

Luckie 1. Aug 2015 10:29

AW: TListView - Eintrag löschen hinterlässt "Loch"
 
Würde es vermutlich. Aber man könnte so gucken, wo der Fehler ist.

hathor 1. Aug 2015 11:23

AW: TListView - Eintrag löschen hinterlässt "Loch"
 
DisposeOf

Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender: TObject);
var j : Integer;
begin
with ListView1 do
 for j := 0 to Items.Count - 1 do
  if j < Items.Count then
    if Items[j].Selected then
     Items[j].DisposeOf;
end;

Dejan Vu 2. Aug 2015 06:55

AW: TListView - Eintrag löschen hinterlässt "Loch"
 
Moinsen

Das standard TListView verhält sich beim ViewStyle 'vsIcon' und 'vsSmallIcon' wie Du es beschreibst: Es bleibt eine Lücke. Bei vsList und vsReport *nicht*, da ist es so wie erwartet.

Bei mir klappt das hier:
Delphi-Quellcode:
Procedure RemoveFromListView (LV : TListView; Index : Integer);
Var
  oldViewStyle : TViewStyle;

begin
  oldViewStyle := LV.ViewStyle;
  LV.Items.BeginUpdate;
  try
    LV.Items.Delete(Index);
    LV.ViewStyle := vsReport;
  finally
    LV.ViewStyle := oldViewStyle;
    LV.Items.EndUpdate;
  End;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:04 Uhr.
Seite 1 von 2  1 2      

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