Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   FMX Listview Einträge durchgehen (https://www.delphipraxis.net/201633-fmx-listview-eintraege-durchgehen.html)

jacky213 8. Aug 2019 21:45

FMX Listview Einträge durchgehen
 
Ich versuche alle Listview Einträge durchzugehen und einen Eintrag zu Löschen sofern ein Element im Item sichtbar ist. Das funktioniert mit folgendem Code auch, allerdings bleiben beim ersten durchgang noch einige Items die gelöscht werden sollten in der Listview vorhanden. Sie verschwinden erst nach dem zweiten oder dritten durchgang.

Delphi-Quellcode:
   for Item in LVEinkauf.Items do
       if Item.Objects.FindObjectT<TListItemImage>('LineImage').Visible = true
       then LVEinkauf.Items.Delete(Item.Index);
woran kann es liegen und wie bekomme ich das ganze ohne Repeat hin?

Danke

Incocnito 9. Aug 2019 07:46

AW: FMX Listview Einträge durchgehen
 
Hi Jacky,

vielleicht macht Delphi intern davon
Delphi-Quellcode:
for iPos := 0 to (LVEinkauf.Items.Count - 1) do
Begin
  Item := LVEinkauf.Items[iPos];
  if Item.Objects.FindObjectT<TListItemImage>('LineImage').Visible{ = true} then
  Begin
    LVEinkauf.Items.Delete(Item.Index);
  End;
End;

Dann würde er beispielsweise den 3 löschen, alle würden aufrücken (der 4te wird der 3te usw.)
und im nächsten Durchlauf würde er den 5ten nehmen, da dieser an der Position ist
wo zuvor der 4te war und somit den 4ten, der auf die gelöschte 3te Position gerutscht ist,
nicht mehr prüfen.
Wundert mich aber, dass Delphi so läuft.
Notfalls probier es von Hand, indem du die Schleife umdrehst:
Delphi-Quellcode:
for iPos := (LVEinkauf.Items.Count - 1) downto 0 do
Begin
  Item := LVEinkauf.Items[iPos];
  if (Item.Objects.FindObjectT<TListItemImage>('LineImage').Visible) then
  Begin
    LVEinkauf.Items.Delete(Item.Index);
  End;
End;

Das "if X = True then" kannst du dir übrigens sparen und direkt "if X then" schreiben.
Ist aber natürlich (wie so oft) Geschmackssache.

Liebe Grüße
Incocnito

Schokohase 9. Aug 2019 08:12

AW: FMX Listview Einträge durchgehen
 
Zitat:

Zitat von Incocnito (Beitrag 1440427)
Wundert mich aber, dass Delphi so läuft.

Wie sollte er/es denn sonst laufen?

Der Iterator geht vom ersten bis zum letzten Element durch die Liste.
Code:
a,b,c,d
^
Wenn der Iterator beim ersten Element ist, man dieses löscht, dann rutscht das eben noch zweite Element vor auf den Platz des ersten Elements.
Code:
b,c,d
^
Jetzt fordert man vom Iterator das nächste Element an
Code:
b,c,d
  ^
und landet beim anfänglich dritten Element.

In .net wirft der Iterator eine Exception wenn sich die zugrunde liegende Collection verändert hat. Das ist eine sehr praktische Sache.

Und ja, das Rückwärtslaufen über den Index ist hier das Mittel der Wahl.

jacky213 9. Aug 2019 19:09

AW: FMX Listview Einträge durchgehen
 
Das mit dem Downto loop hatte ich auch versucht, bekomme allerdings eine Zugriffsverletzung

Schokohase 9. Aug 2019 21:02

AW: FMX Listview Einträge durchgehen
 
Zitat:

Zitat von jacky213 (Beitrag 1440598)
Das mit dem Downto loop hatte ich auch versucht, bekomme allerdings eine Zugriffsverletzung

Oh, das ist aber nicht schön.

Wenn du den Code zeigen würdest, wäre auch mehr als nur ein „Oh“ drin.

jacky213 9. Aug 2019 21:15

AW: FMX Listview Einträge durchgehen
 
Manch Einer sieht den Wald vor lauter Bäumen nicht mehr....

Delphi-Quellcode:
for I := (LVEinkauf.Items.Count - 1) downto 0 do
Hatte vergessen die Listview einzuklammern :oops:

Vielen dank für die Hilfe


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 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