PDA

Ver la Versión Completa : Indice incorrecto


VolaRe
21-02-2004, 20:35:43
Hola,
haber si alguien me puede explicar porque este codigo, despues de correr, me indica "indice incorrecto". Este el el codigo:

var
Cadena : String;
J, I : Integer;
begin
OpenDialog1.Title := 'Borrar dia ...';
If OpenDialog1.Execute Then
begin
I := Pos(',',OpenDialog1.FileName) - 3;
Cadena := Copy(OpenDialog1.FileName,I,20);
Label2.Caption := Cadena;
If MessageDlg('Estas a punto de borrar un dia, ¡estas seguro!',mtConfirmation,
[mbYes,mbNo],0) = IdYes Then
For J := 0 To TreeView1.Items.Count - 1 Do
If (Cadena = TreeView1.Items[J].Text) Then
Begin
DeleteFile(OpenDialog1.FileName);
TreeView1.Items[J].Selected := True;
TreeView1.Selected.Delete;
MessageDlg('El archivo ha sido borrado con exito',mtInformation,[mbOk],0)
End;
end;
end;
Exactamente, me corre el codigo perfectamente, pero cuando acaba y borro el archivo deseado me indica "Incorrecto indice", y me indica esta sentencia If (Cadena = TreeView1.Items[J].Text) Then.

Alguien me puede explicar porque, porque no lo entiendo, gracias de antemano

__cadetill
21-02-2004, 23:58:27
Y por qué en lugar de

TreeView1.Items[J].Selected := True;
TreeView1.Selected.Delete;

no haces directamente

TreeView1.Items[J].Delete;

????

PD: te aconsejo el uso de la etiqueta CODE para poner código

VolaRe
22-02-2004, 12:20:59
Pues tambien tienes razon, para que poner dos lineas de codigo si con una me hace lo mismo. Pero me sigue saliendo el mismo error "Indice invalido".

If Cadena = TreeView1.Items[J].Text Then

Me señala exactamente esta sentencia, y no se que tiene esa sentencia de mal, si me lo pudieras aclarar te lo agradeceria

__cadetill
22-02-2004, 15:16:57
Bueno, el error te lo marca por culpa del bucle for. Es decir, tu incrementas el contador J hasta TreeView1.Items.Count - 1, que en un bucle for (si no voy equivocado) lo tomará como una constante (5, 6, 7, los que sean). Al hacer un delete durante la iteración del mismo, llega un momento en que te pasarás de rango.

Cambia el bucle for por uno while (en el que, por cada iteración, se evaluará la expresión) y nos comentas.

PD: bien por la etiqueta CODE!!! ;)

VolaRe
22-02-2004, 18:36:46
cadetill, pues si te digo la verdad no tengo ni idea de como ponerlo en un bucle while, porque qeu le pongo:

while cadena = TreeView1.Items.Item[J].Text Do

o este...

while Cadena <> TreeView1.Items.Item[J].Text Do

y todo esto, inicializando "J" fuera del bucle. ¿Y como le digo uqe pase al siguiente registro?. Ahi un metodo en Item[J] que es getnext, pero si lo uso tambien me da "Invalido indicd".

Asi que nano, no tengo ni puta idea de como resolver este problemilla, si me hechases una mano te lo agradeceria un monton, y eso sin contar lo que habre aprendido con esa manilla que me has hechao, sea lo que sea muchas gracias por tu interes

jplj
22-02-2004, 18:50:17
Prueba a realizar el bucle en sentido inverso, es decir, empenzado por el último elemento.

__cadetill
22-02-2004, 19:56:09
Bueno, puedes probar tambien lo que comenta jplj, es decir


for j := TreeView1.Items.Count - 1 downto 0 to


o bien con el while que te comentaba


J := 0;
while J <= TreeView1.Items.Count - 1 do
begin
if (Cadena = TreeView1.Items[J].Text) Then
begin
DeleteFile(OpenDialog1.FileName);
TreeView1.Items[J].Delete;
MessageDlg('El archivo ha sido borrado con exito',mtInformation,[mbOk],0);
end
else
inc(J);
end;

La diferencia del while con el for, es que cada iteración se evalua la expresión y, aunque borres un Item, al evaluarse la expresión sabrá si continuar o no. Fíjate que sólo se ha de incrementar el contador J si no se borra ningún Item

VolaRe
22-02-2004, 20:22:24
Muchas gracias a los dos.

Como habreis comprovado soy un pardillo en esto, asi que no sabeis los quebraderos de cabeza que tenia ya con esto, gracias nuevamente :D

VolaRe
22-02-2004, 20:34:45
Prueba a realizar el bucle en sentido inverso, es decir, empenzado por el último elemento.


gracias jplj por tu consejo, va a la perfeccion