Newsgroup: it.comp.lang.delphi
Titolo: Access violation

Scusate perchè questo codice mi da un errore di "Access violation at address
ecc. ecc."??
procedure TForm1.EliminaLista(IP: string);
var
  i: integer;
begin
  for i := 0 to listview1.Items.Count-1 do
    begin
      if listview1.Items.Item[i].subitems[0] = IP then
            listview1.Items.Item[i].Delete;
<-------- Qui mi da errore
    end;
end;
Devo liberare qualche istanza di ListItem con Free?!?

 Scusate perchč questo codice mi da un errore di "Access violation at

Perché quando si cancellano degli elementi da una lista con un for..to..do, č sempre
meglio partire dall'ultimo e arrivare al primo.
Se provi ad immaginare lo svolgimento della tua funzione, scoprirai che cancellando un
elemento all'interno del ciclo, lo scombussoli perché cambi ListView1.Items.Count.
Prova con for i := ListView1.Items.Count - 1 downto 0 do.....
--
Jax

 meglio partire dall'ultimo e arrivare al primo.
Oppure semplicemente, usare una tecnica come nello
pseudocodice che segue:
while (items.count > 0)
{
      items[0].delete;      
}
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 }
Pardon, ma questa tecnica, oltre che inutile (c'č Items.Clear), serve solo se si vogliono
cancellare tutti gli item, e non determinati item.
--
Jax

 e non determinati item.
E' un esempio ed e' comunque adattabile, nel caso ci
sia una condizione particolare, da rispettare:
procedure TForm1.Button1Click(Sender: TObject);
var
  OpCount, Count: Integer;
  I: Integer;
begin
  Count := ListBox1.Items.Count;
  I := 0;
  for OpCount := 0 to Count-1 do
  begin
    if ListBox1.Items[I][1] = 'P' then
      ListBox1.Items.Delete(I)
    else
      Inc(I);
  end;
end;


 sia una condizione particolare, da rispettare:
Non mi pare che c'azzecchi molto con il tuo esempio precedente :)
Comunque, converrai con me che un downto sia molto + semplice... e qui mi fermo perché
stiamo facendo accademia su una cavolata :)
--
Jax

 Comunque, converrai con me che un downto sia molto + semplice...
Un downto non mi sembra ti sollevi dagli stessi controlli.
Comunque, salendo verso l'alto, hai uno slittamento degli elementi.


 Comunque, salendo verso l'alto, hai uno slittamento degli elementi.
Sbagliato. Prova a mettere in una form una ListView con dentro i numeri da 0 a 9, poi una
funzione che fa
 for i := ListView1.Items.Count - 1 downto 0 do
  if odd(i) then ListView1.Items.Delete(i);
e un'altra che fa
 for i := 0 to ListView1.Items.Count - 1 do
  if odd(i) then ListView1.Items.Delete(i);
I fatti parlano: sbaglio o con il downto funziona, mentre l'altro da' un access violation?
--
Jax

 da' un access violation?
Il metodo dall'alto verso il basso da' access violation, se
usi l'Items.Count (perche' varia di volta in volta).  Devi
contare, invece, il numero di operazioni (come nel mio esempio).
Dal basso verso l'alto e' piu' semplice, perche' c'e' sempre
slittamento degli elementi, ma di quelli gia' elaborati, anziche'
di quelli da elaborare.
Quindi, mentre nel caso dall'alto verso il basso devi considerare
che, cancellando il 3^ elemento, nella sequenza seguente:
1 Acquario
2 Libro
3 Computer
4 Fotografia
5 Penna
avrai lo slittamento:
1 Acquario
2 Libro
3 Fotografia
4 Penna
e quindi considerare che l'indice non deve aumentare (ma restare
fisso sul 3^), nel caso dal basso verso l'alto avresti, invece,
sempre lo slittamento precedente verso l'alto, ma il prossimo
indice da considerare e' sempre il 2, quindi in definitiva non
devi occuparti di fare gli stessi controlli.


 Comunque, converrai con me che un downto sia molto + semplice...
Ehm... e io cosa dicevo? :)
Evidentemente non mi sono espresso bene.
--
Jax passo e chiudo

 Evidentemente non mi sono espresso bene.
Infatti stavo confermando.
