Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   borrar los items de listbox1 que no existan en listbox2 (https://www.clubdelphi.com/foros/showthread.php?t=79775)

danyfebrero 09-08-2012 16:05:17

borrar los items de listbox1 que no existan en listbox2
 
Hola, me pudieran ayudar?
Tengo el ListBox1 con varios items que voy a borrar, pero no quiero que se me borren los que existan en el ListBox2.
Ej:
en el Listbox1 tengo:
a
b
c
d
e
en el ListBox2 tengo:
a
c
d

entonces se deberian borrar
b y e.
pero no logro hacerlo con bucles, ni con nada de lo que he probado.
saludos y gracias de antemano.
dany

Neftali [Germán.Estévez] 09-08-2012 16:12:18

Debes hacer un bucle que recorra la primera lista:

Código Delphi [-]
for j := 0 to (Listbox1.Items.Count - 1) do begin
   ...

Para cada item de la primera lista buscarlo en la segunda; Para ello usa en método IndexOf o Find de la segunda lista (en la ayuda tienes los parámetros):

Código Delphi [-]
  ListBox2.Items.IndexOf  ...

  ListBox2.Items.Find ...

Por ultimo, si lo encuentras, lo borras de la primera con el método Delete de Items.

Prueba y si te da error, ya dirás...

danyfebrero 09-08-2012 16:18:29

ok gracias, voy a probar. saludos

Caro 09-08-2012 16:28:28

Hola, solo añadir que al borrar algunos items, tu ciclo debe comenzar desde ultimo.

Código Delphi [-]
 for i:=ListBox1.Count-1 downto 0  do
  begin
   if ListBox2.Items.IndexOf(ListBox1.Items[i])=-1 then
    ListBox1.Items.Delete(i);
  end;

Saluditos

Neftali [Germán.Estévez] 09-08-2012 16:37:44

Cita:

Empezado por Caro (Mensaje 439206)
Código Delphi [-]
 for i:=ListBox1.Count-1 downto 0  do
  begin
   if ListBox2.Items.IndexOf(ListBox1.Items[i])=-1 then
    ListBox1.Items.Delete(i);
  end;

Yo que estaba intentando que lo hiciera él... :o
Ahora perdió la gracia...;)

danyfebrero 10-08-2012 01:10:10

hola gracias por todo Caro y a ti también Neftali en especial porque querias que me superara.... por cierto por qué debe comenzar desde el final?. saludos y gracias

Casimiro Notevi 10-08-2012 01:15:49

Cita:

Empezado por danyfebrero (Mensaje 439279)
hola gracias por todo Caro y a ti también Neftali en especial porque querias que me superara.... por cierto por qué debe comenzar desde el final?. saludos y gracias


Pruébalo desde el principio y verás el resultado :), así se aprende :D

danyfebrero 10-08-2012 01:15:57

disculpen, y si quisiera que se borraran del listbox1 los que se repiten en el listbox2, cómo haría?
gracias otra vez

danyfebrero 10-08-2012 01:42:52

hola
casimiro graciasm pero sigo sin enterder, porque normal no hace nada o me da un error de desbordamiento....
jejeje
probe poniendo = o cero al codigo que me dio Cairo pero solo me borra un item sigo sin lograr que me borre los existentes en el listbox2
disculoenme, saludos y gracias

ecfisa 10-08-2012 01:48:50

Cita:

Empezado por danyfebrero (Mensaje 439281)
disculpen, y si quisiera que se borraran del listbox1 los que se repiten en el listbox2, cómo haría?
gracias otra vez

Hola.

No me queda claro si deseas borrar del ListBox1 aquellos datos que existen mas de una vez en ListBox2, o si te refieres a aquellos datos de ListBox1 que existen en ListBox2.

Saludos.

danyfebrero 10-08-2012 01:58:26

hola
me refiero a aquellos datos de ListBox1 que existen en ListBox2.
traté con este codigo pero si no me borra los item que estan repetido si hay dos Pedro solo me borra 1

Código Delphi [-]
for i:=ListBox2.Count-1 downto 0  do
  begin
    ListBox2.ItemIndex:=I;
    with ListBox1.Items do Delete (IndexOf(ListBox2.Items[ListBox2.ItemIndex]));
  end;

ufff es muy complicado programar, que sería sin ayuda????
saludos y muchas gracias

danyfebrero 10-08-2012 02:14:36

hola
probé con este codigo y funcionó pero no sé si está del todo bien:

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
var I,Y:integer;
begin

for i:=ListBox2.Count-1 downto 0  do
  for y:=ListBox1.Count-1 downto 0  do
    with ListBox1.Items do Delete (IndexOf(ListBox2.Items[i]));
end;

si me pudieran decir
gracias y saludos

ecfisa 10-08-2012 02:38:20

Cita:

Empezado por danyfebrero (Mensaje 439279)
hola gracias por todo Caro y a ti también Neftali en especial porque querias que me superara.... por cierto por qué debe comenzar desde el final?. saludos y gracias

Hola.

El error sucede por que el for recorre ListBox1 desde 0 a ListBox1.Count-1, pero cuando un ítem es borrado ya no existen ListBox1.Count-1 ítems, si no menos. Por lo que en algún punto, ListBox1.Items[i] estará referenciando a una posición que ya no existe.


Saludos.

ecfisa 10-08-2012 02:51:11

Cita:

me refiero a aquellos datos de ListBox1 que existen en ListBox2.
Hola.
Código Delphi [-]
 for i:=  ListBox1.Count-1 downto 0 do
   if ListBox2.Items.IndexOf(ListBox1.Items[i]) <> -1 then 
    ListBox1.Items.Delete(i);

Saludos.

danyfebrero 10-08-2012 03:20:40

gracias Ecfisa es usted muy amable me funcionó perfecto
saludos y gracias una vez más


La franja horaria es GMT +2. Ahora son las 00:07:33.

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