Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Eliminación Selectiva en ListView (https://www.clubdelphi.com/foros/showthread.php?t=52808)

MaMu 31-01-2008 19:09:47

Eliminación Selectiva en ListView
 
Tengo un problema, yo quiero eliminar los items de un ListView segun se cumpla la condicion que establezco, siendo por ejemplo, un string en un subitem determinado; lo que hago es lo siguiente:

Código Delphi [-]
if ListView2.Items.Count>0
            then begin
              for w:=0 to ListView2.Items.Count-1 do
                begin
                  if ((LowerCase(ListView2.Items.Item[w].SubItems.Strings[8]))=ruta) 
// lo verifique y ambas cadenas de strings son identicas, 
//cumple la condicion perfectamente, pero al eliminar......
                    then begin
                          ListView2.Items.Delete(ListView2.Items.Item[w].Index);
                          //Tira error Access Violation...etc.
                    end;
                end;
            end;

Que estoy haciendo mal?

maeyanes 31-01-2008 19:51:31

Hola...

Por que no usas directamente el valor de w para referenciar el Item que quieres eliminar?

Código Delphi [-]
if ListView2.Items.Count > 0 then
  for w := 0 to Pred(ListView2.Items.Count) do
    if LowerCase(ListView2.Items[w].SubItems[8]) = Ruta then
      ListView2.Items.Delete(w)


Saludos...

MaMu 31-01-2008 20:06:08

Cita:

Empezado por maeyanes (Mensaje 262414)
Hola...

Por que no usas directamente el valor de w para referenciar el Item que quieres eliminar?


Código Delphi [-]
if ListView2.Items.Count > 0 then
for w := 0 to Pred(ListView2.Items.Count) do
if LowerCase(ListView2.Items[w].SubItems[8]) = Ruta then
ListView2.Items.Delete(w)






Saludos...

Me tirar error access violation, otra vez

maeyanes 31-01-2008 20:11:31

Hola...

El código que pusiste es exactamente el que usas? Por que ese código no muestra nada que pueda provocar ese error...



Saludos...

keyboy 31-01-2008 20:13:50

Me parece que debes recorrer la lista alrevés. En lugar de

Código Delphi [-]
for w := 0 to Pred(ListView2.Items.Count) do

prueba con

Código Delphi [-]
for w := Pred(ListView2.Items.Count) downto 0 do

Bye

ixMike 31-01-2008 20:16:51

Iba sugerirte lo mismo que keyboy, a mí me pasaba lo mismo con TStrings, hasta que me di cuenta de que si si recorro del 0 al 10, cuando he borrado los cinco primeros, después no hay elemento 6, ni 7....

por eso hay que ir desde el último hasta el primero.


Salu2.

maeyanes 31-01-2008 20:20:13

Hola...

Cierto, cierto... pasé en alto ese aspecto... xDDD

Prueba a cambiar el ciclo for como ya te han recomendado y tu problema debería solucionarse...



Saludos...

jhonny 31-01-2008 20:20:21

Tambien es quizá, porque el Item que esta en la posicion involucrada realmente no existe, según lo que entiendo, lo que quiere mamu es eliminar el SubItem 8 de un Item... lo cual se lograría asi, tomando como referencia el codigo de maeyanes y de keyboy:

Código Delphi [-]
if ListView2.Items.Count > 0 then
  for w := Pred(ListView2.Items.Count) downto 0 do
     if LowerCase(ListView2.Items[w].SubItems[8]) = Ruta then
       ListView2.Items[w].SubItem.Delete(8);

Bueno, eso es lo que creo que se necesita, espero que asi sea y que funcione :).

maeyanes 31-01-2008 20:23:31

Hola...

Cita:

Empezado por jhonny (Mensaje 262427)
Quizá es porque el Item que esta en la posicion involucrada realmente no existe, según lo que entiendo, lo que quiere mamu es eliminar el SubItem 8 de un Item... lo cual se lograría asi, tomando como referencia el codigo de maeyanes:

Código Delphi [-]
if ListView2.Items.Count > 0 then
  for w := 0 to Pred(ListView2.Items.Count) do
    if LowerCase(ListView2.Items[w].SubItems[8]) = Ruta then
      ListView2.Items[w].SubItem.Delete(8);

Bueno, eso es lo que creo que se necesita, espero que asi sea y que funcione :).

Bueno, lo que yo entiendo es que quiere eliminar el Item en el que el SubItem con índice 8 tenga un valor igual a la variable Ruta...



Saludos...

jhonny 31-01-2008 20:27:37

Cita:

Empezado por maeyanes (Mensaje 262428)
Hola...



Bueno, lo que yo entiendo es que quiere eliminar el Item en el que el SubItem con índice 8 tenga un valor igual a la variable Ruta...



Saludos...

Si, esa es una duda que me ronda en la cabeza desde que leí la pregunta :D, no se si la cosa es como yo la entendí o como ustedes la han entendido :(, si mamu necesita lo que ustedes han comentado, bastaria con lo que tu y keyboy han sugerido :), si no, solo hay que hacerle ese ajustecito.

maeyanes 31-01-2008 20:29:10

Cita:

Empezado por jhonny (Mensaje 262430)
Si, esa es una duda que me ronda en la cabeza desde que leí la pregunta :D, no se si la cosa es como yo la entendí o como ustedes la han entendido :(, si mamu necesita lo que ustedes han comentado, bastaria con lo que tu y keyboy han sugerido :), si no, solo hay que hacerle ese ajustecito.

Bueno... que no se diga que en este Club no se dan varias soluciones para un problema... :D



Saludos...

ixMike 31-01-2008 20:30:42

Cita:

Empezado por jhonny (Mensaje 262427)
Tambien es quizá, porque el Item que esta en la posicion involucrada realmente no existe, según lo que entiendo, lo que quiere mamu es eliminar el SubItem 8 de un Item... lo cual se lograría asi, tomando como referencia el codigo de maeyanes y de keyboy:

Código Delphi [-]if ListView2.Items.Count > 0 then for w := Pred(ListView2.Items.Count) downto 0 do if LowerCase(ListView2.Items[w].SubItems[8]) = Ruta then ListView2.Items[w].SubItem.Delete(8);


Bueno, eso es lo que creo que se necesita, espero que asi sea y que funcione :).


¿No saldría un error tipo "List index out of bounds (8)" o algo así?

MaMu 31-01-2008 20:37:30

Cita:

Empezado por keyboy (Mensaje 262422)
Me parece que debes recorrer la lista alrevés. En lugar de


Código Delphi [-]
for w := 0 to Pred(ListView2.Items.Count) do





prueba con


Código Delphi [-]
for w := Pred(ListView2.Items.Count) downto 0 do





Bye

SOLUCIONADO

Aplicando el razonamiendo de keyboy

jhonny 31-01-2008 20:48:53

Cita:

Empezado por ixMike (Mensaje 262432)
¿No saldría un error tipo "List index out of bounds (8)" o algo así?

Si, pero me supuse que de alguna manera todos los Items tienen el SubItem 8, o que mamu lo ha puesto como ejemplo, ya que desde antes se evalua en esta linea :p.

Código Delphi [-]
if LowerCase(ListView2.Items[w].SubItems[8]) = Ruta then

Bueno, pero de todas formas, por lo visto la cosa funciono bien :).


La franja horaria es GMT +2. Ahora son las 22:51:36.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi