Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Access violation beim Löschen von Listview-Einträgen (https://www.delphipraxis.net/109402-access-violation-beim-loeschen-von-listview-eintraegen.html)

dazar_t 29. Feb 2008 17:19


Access violation beim Löschen von Listview-Einträgen
 
Guten Tag

Immer wen ich diesen Code ausführe :
Delphi-Quellcode:
procedure TForm4.DLT_BTNClick(Sender: TObject);
var
I,L,CNT:Integer;
begin
if Not( ListView.ItemIndex = -1 ) then
for I := 0 to ListView.Items.Count - 1 do
  Try
    if ListView.Items[I].Selected then
    CNT := CNT+1;
  Finally
    for L := 0 to CNT do
    ListView.Items[ListView.ItemIndex].Delete;
  End;
end;
Bekomme ich immer diese Fehlermeldung : Access violation ar adress 0046EC17 in module 'Project3.exe'.

Funkotinieren tut der Code aber komischer weise Optimal

Help pls

[edit=Luckie]Titel "Bekomme einen Fehler" verbessert. Mfg, Luckie[/edit]

mkinzler 29. Feb 2008 17:21

Re: Bekomme immer Fehlermeldung
 
Delphi-Quellcode:
for I := 0 to ListView.Items.Count-1 do

dazar_t 29. Feb 2008 17:22

Re: Bekomme immer Fehlermeldung
 
Hmmm aber die Fehlermeldung kommt leider immer noch

mkinzler 29. Feb 2008 17:23

Re: Bekomme immer Fehlermeldung
 
Delphi-Quellcode:
for L := 0 to T.Count-1 do

dazar_t 29. Feb 2008 17:24

Re: Bekomme immer Fehlermeldung
 
Auch dieses verhindert die fehlermedeldung nicht. Ich habe oben auch mal einen veränderten code hingesetzt der allerdings immer doch diese Fehlermeldung hervorruft.

mkinzler 29. Feb 2008 17:27

Re: Bekomme immer Fehlermeldung
 
Delphi-Quellcode:
ListView.Items[L].Delete;
Du versuchstest ja immer den markierten zu Löschen

dazar_t 29. Feb 2008 17:31

Re: Bekomme immer Fehlermeldung
 
Dieses kommt im Oben NEUEN Code nicht auf aber die fehlermeldung schon!

mkinzler 29. Feb 2008 17:34

Re: Bekomme immer Fehlermeldung
 
Was soll der Code genau machen?

dazar_t 29. Feb 2008 17:35

Re: Bekomme immer Fehlermeldung
 
Er löscht alle makierten TListView einträge

bluesbear 29. Feb 2008 17:36

Re: Bekomme immer Fehlermeldung
 
Mir erschließt sich der Zweck des Codes nicht so ganz. Gegenüber dem ersten Post ist die Stringlist verschwunden. Was soll der eigentlich tun?

EDIT: schon wieder zu langsam :(

Der.Kaktus 29. Feb 2008 17:38

Re: Bekomme immer Fehlermeldung
 
Hallo,

probiers mal so...



Delphi-Quellcode:
procedure TForm4.DLT_BTNClick(Sender: TObject);
var
I,L,CNT:Integer;
begin
 if Not( ListView.ItemIndex = -1 ) then
 for I := 0 to ListView.Items.Count - 1 do
// Try mal weggelassen
  if ListView.Items[I].Selected then ListView.Items[i].Delete
end;
Gruss

mkinzler 29. Feb 2008 17:39

Re: Bekomme immer Fehlermeldung
 
Delphi-Quellcode:
for I := ListView.Items.Count - 1 downto o do
    if ListView.Items[I].Selected then if ListView.Items[I].Delete;

dazar_t 29. Feb 2008 17:40

Re: Bekomme immer Fehlermeldung
 
Danke so habe ich es schon ausprobiert aber dies funktioniert nicht da die funktion ja irgendwann Einträge überprüft (i) die garnicht existieren da man ja immer welche löscht

EDIT: Danke mkinzler das funktioniert.

mkinzler 29. Feb 2008 17:41

Re: Bekomme immer Fehlermeldung
 
Zitat:

Zitat von dazar_t
Danke so habe ich es schon ausprobiert aber dies funktioniert nicht da die funktion ja irgendwann Einträge überprüft (i) die garnicht existieren da man ja immer welche löscht

Deshalb ja auch die umgekehrte Schleife

bluesbear 29. Feb 2008 17:42

Re: Bekomme immer Fehlermeldung
 
Nenee, mit ner for Schleife geht das nicht, weil sich der Count doch ändert, wenn man was löscht.

mkinzler 29. Feb 2008 17:47

Re: Bekomme immer Fehlermeldung
 
Zitat:

Zitat von bluesbear
Nenee, mit ner for Schleife geht das nicht, weil sich der Count doch ändert, wenn man was löscht.

Die Grenzen einer laufenden Schleife werden aber nicht angetastet

Union 29. Feb 2008 17:49

Re: Bekomme immer Fehlermeldung
 
Wie wär's mit diesem Versuch
Delphi-Quellcode:
i := 0;
while i < ListView.Items.Count-1 do
begin
  if ListView.Items[i].Selected then
    ListView.Items[i].Delete
  else
     inc(i);
end;

mkinzler 29. Feb 2008 17:50

Re: Bekomme immer Fehlermeldung
 
Der Code von oben geht doch

Union 29. Feb 2008 17:52

Re: Bekomme immer Fehlermeldung
 
Zitat:

Zitat von mkinzler
Der Code von oben geht doch

Streng genommen nicht wenn man downto o schreibt ;)

bluesbear 29. Feb 2008 17:55

Re: Bekomme immer Fehlermeldung
 
@mkinzler:
Naja eben. Ich mache das sowas mit "while EintragSelektiert do LöscheDen". Auf eine absteigende for schleife war ich noch nicht gekommen. Gefällt mir ehrlich gesagt auch weniger, aber das ist reine Geschmackssache.
Da warst du auch schneller http://www.delphipraxis.net/internal...=852551#852551 - ich gebs auf für heute mit dem Quiz :lol:

Der.Kaktus 29. Feb 2008 17:59

Re: Bekomme immer Fehlermeldung
 
das geht, habs probiert..
Delphi-Quellcode:
procedure TForm1.BitBtn1Click(Sender: TObject);
var i,i1:integer;
SArray:Array[0..20] of byte;  //nur mal als Bsp. die 21 Bytes
begin
 i1:=0;
 for i:=0 to 20 do SArray[i]:=0; //loeschen
 for I := 0 to ListView1.Items.Count - 1 do
 begin
// Try mal weggelassen
  if ListView1.Items[I].Selected then
  begin
   SArray[i1]:=i;
   inc(i1);
  end;
 end;
 For i:=i1-1 downto 0  do ListView1.Items[SArray[i]].delete;
end;
gruss

Union 29. Feb 2008 18:01

Re: Bekomme immer Fehlermeldung
 
Delphi-Quellcode:
SArray:Array[0..20] of byte
Und wenn die ListView mehr als 256 Einträge hat?

Der.Kaktus 29. Feb 2008 18:04

Re: Bekomme immer Fehlermeldung
 
da steht doch "als Bsp."..kannst auch Array[0..4096] machen :-D
ging doch erstmal um nen Ansatz :idea:

DeddyH 29. Feb 2008 18:11

Re: Bekomme immer Fehlermeldung
 
Der Ansatz mit der absteigenden Schleife ist doch OK (solange nur ein Eintrag je Durchlauf gelöscht wird), Ihr braucht Euch nicht mehr zu streiten :D

Union 29. Feb 2008 19:13

Re: Bekomme immer Fehlermeldung
 
@der.Kaktus
Zitat:

Zitat von Union
Delphi-Quellcode:
SArray:Array[0..20] of byte
Und wenn die ListView mehr als 256 Einträge hat?

Die Anzahl der Elemente ist kein Problem, aber die Speicherung des Itemindex in einem Byte schon - das läuft dann nämlich über. Und das sogar schob evtl. beim ersten Element, wenn das erste selektierte Item > 256 ist. Die Folge wäre die Löschung von falschen Elementen!

Der.Kaktus 29. Feb 2008 19:15

Re: Bekomme immer Fehlermeldung
 
dann koennte ich Array of Integer empfehlen.

Larsi 29. Feb 2008 19:33

Re: Bekomme immer Fehlermeldung
 
Nur so als Frage: Kann man nicht gleich Items.Destroy sagen? Er will doch alle Items löschen, oder???

mkinzler 29. Feb 2008 19:34

Re: Bekomme immer Fehlermeldung
 
Zitat:

Zitat von Larsi
Nur so als Frage: Kann man nicht gleich Items.Destroy sagen? Er will doch alle Items löschen, oder???

Nein, nur die selektierten

Muetze1 29. Feb 2008 20:25

Re: Bekomme immer Fehlermeldung
 
/EDIT: Delphi-Referenz durchsuchenTListView.DeleteSelected() ?

DeddyH 29. Feb 2008 20:34

Re: Bekomme immer Fehlermeldung
 
*Pah* wie langweilig, da find ich die ganze (unnötige) Diskussion spannender :D

bluesbear 29. Feb 2008 20:42

Re: Bekomme immer Fehlermeldung
 
Zitat:

Zitat von DeddyH
*Pah* wie langweilig, da find ich die ganze (unnötige) Diskussion spannender :D

:lol: :cheers:

Luckie 3. Mär 2008 11:33

Re: Access violation beim Löschen von Listview-Einträgen
 
"Fehlermeldung" ist wohl kaum ein aussagekräftiger Titel, ich habe ihn mal geändert. Beim nächsten Mal bitte selber drauf achten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz