TListBox.Items.Delete() - vorher Selektion entfernen

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

TListBox.Items.Delete() - vorher Selektion entfernen

Beitrag von shokwave »

Hallo,

ich wollte mal eure Meinung, ob ich's im Bugtracker melden sollte, oder eher nicht.

Ich durchsuche eine ListBox nach markierten Einträgen und lösche diese aus der Liste:

Code: Alles auswählen

while i<LiBo_Files.Items.Count do
  begin
    if LiBo_Files.Selected[i] then
    begin
      LiBo_Files.Items.Delete(i);
    end
    else
      inc(i);
  end;
Das Problem: wenn ich die Funktion auführe, ist die Liste, ab der ersten Markierung leer.
Der Grund: die Selektion "auf der ich stehe" wird nicht aufgehoben.
Die Lösung: vor dem "LiBo_Files.Items.Delete(i);" ein "LiBo_Files.Selected:=False;"

Unter Delphi funktionierte der ursprüngliche Code. Offenbar wurde die Selektion automatisch aufgehoben.

Bugtracker oder nicht?

Fast vergessen: WinXP SP2; Lazarus 9.24.1; FPC 2.2.0;
mfg Ingo

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Bugtracker, ich wüsste zwar aus dem stehgreif nicht ob das n Fehler ist aber wenn sich delphi dort anders verhält sollte es berichtet werden.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Kleiner Hinweis: LiBo_Files.Items.Count-1 währe richtig.....
und gelöscht wird immer so:
// Rückwärtzt.....
for i:=iBo_Files.Items.Count-1 downto 0
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

@Pluto: W.M.k.A.h.e.m.F.h. ;-)

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

;)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

hä ? verstehe ich jetzt nicht....
MFG
Michael Springwald

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

eben
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

pluto hat geschrieben:Kleiner Hinweis: LiBo_Files.Items.Count-1 währe richtig.....
"y<=x-1" = "y<x" oder nich? ;)

und gelöscht wird immer so:
// Rückwärtzt.....
for i:=iBo_Files.Items.Count-1 downto 0
Naja, wenn man den Count vorher in eine Variable liest könne die for-Schleife schneller sein, da er nicht jedesmal zählen muss. Aber ansonsten...
mfg Ingo

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Noch sone Nase, wenn ihr euch unbedingt Access Violations ohne ende einhandeln wollt versucht das bitte so, aber hört auf anderen helfen zu wollen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

Das ich nicht der Starprogrammierer des 21. Jhd's bin weiss ich auch, aber warum solls da bitte AV's hageln? Der Count ist doch nur für den Start interessant. Oder hab ich 'n Denkfehler?
aber hört auf anderen helfen zu wollen.
Sorry, aber sonderlich hilfreich war das bis jetzt auch noch nicht.
mfg Ingo

Benutzeravatar
theo
Beiträge: 10927
Registriert: Mo 11. Sep 2006, 19:01

Beitrag von theo »

shokwave hat geschrieben: Naja, wenn man den Count vorher in eine Variable liest könne die for-Schleife schneller sein, da er nicht jedesmal zählen muss. Aber ansonsten...
Tut der sowieso nicht. Wenn er erst in den for-loop eingetreten ist, wertet er den Ausruck nicht nochmal aus.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Unter Delphi habe ich immer AV bekommen, wenn ich for i:=0 listbox1,count-1 gesagt um was zu löschen....

Aber ist ja auch egal.
MFG
Michael Springwald

shokwave
Beiträge: 475
Registriert: Do 15. Nov 2007, 16:58
OS, Lazarus, FPC: Win11/Ubuntu Budgie (L 3.0 FPC 3.2.2)
CPU-Target: i386, x64
Wohnort: Gera

Beitrag von shokwave »

theo hat geschrieben:Wenn er erst in den for-loop eingetreten ist, wertet er den Ausruck nicht nochmal aus.
Jetzt wo du's sagst... :roll:
pluto hat geschrieben:Unter Delphi habe ich immer AV bekommen, wenn ich "for i:=0 to listbox1.count-1" gesagt um was zu löschen....
Das erklärt sich durch Theos Beitrag.
mfg Ingo

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

for i:=0 listbox1,count-1
Die AV kam dann aber vom Compiler und nicht erst bei der ausführung des Programms :) Der kann halt noch kein Plutoreanisch zu seiner verteidigung muss man aber sagen, das fpc das auch nicht kann.
Das ich nicht der Starprogrammierer des 21. Jhd's bin weiss ich auch, aber warum solls da bitte AV's hageln? Der Count ist doch nur für den Start interessant. Oder hab ich 'n Denkfehler?
Wie theo schon sagte wird die Endbedingung einer for schleife eh gebuffert also .Count wird nicht bei jedem Schleifendurchlauf neu überprüft.

Nun überlegen wir mal was passiert:

i = 0
Delete(i), ok alles schön

i = 1
Delete(i), ok alles schön

i = (Count-1) div 2
Delete(i) -> Access Violation

Warum ? Weil kein Listboxeintrag mit nem Index (Count-1) div 2 mehr existiert der wurde bereits gelöscht.

Mit der downto Methode geht das solange ich alle Einträge löschen will.
Wenn man nun aber nur bestimmte Einträge löschen will, geht das genauso in die Hose.

Solang ihr so etwas nicht bedenkt und die für diesen Fall perfekte Lösung des Threaderstellers auch noch durch wesentlich fehlerträchtigere Methoden ersetzen wollt solltet ihr besser nicht versuchen zu helfen.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Beitrag von pluto »

Nagut in diesem Punkt gebe ich dir Recht, Wenn man ein bestimmten eintrag löschen möchte oder mehrer müssten man das meiner Erfahrung nach auch mit einer downto forschleife machen.... z.b. um alle Markierten zu löschen ich meine unter Delphi gab es sogar eine Fertig Funktion.
MFG
Michael Springwald

Antworten