Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Listboxen vergleichen (https://www.delphipraxis.net/170708-listboxen-vergleichen.html)

Paulh 29. Sep 2012 19:26

Listboxen vergleichen
 
Hallo,

ich sitze in letzter Zeit an einem Program, dass Backup löschen soll, es soll immer ein Backup pro Tag behalten werden.
Das sortieren klappt so weit, heisst ich weiss welche Backups ich behalten will, dafür habe ich zwei Listboxen, eine
die die zubehaltenden Backups anzeigt[Listbox1] und eine die alle Backups anzeigt[Listbox2].

Das Problem besteht darin, dass ich es nicht hin bekomme heraus zufinden welches Backup jetzt gelöscht werden soll oder
nicht. Hier ist der Code den ich dafür vorgesehen hatte:

Delphi-Quellcode:
for I := 0 to Listbox2.Items.Count-1 do
begin
  for Ia := 0 to Listbox1.Items.Count-1 do
    begin

      if NOT (Listbox2.Items[i]=Listbox1.Items[ia]) then
      begin
           //Die sollen gelöscht werden
      end;
    end;
end;
Vielen Dankt im vorraus !

Captnemo 29. Sep 2012 19:33

AW: Listboxen vergleichen
 
Versuchs doch mal mit Listbox1.Items.IndexOf(Listbox2.Items[i])

Result ist gleich der Index des gesuchten Elements, oder, wenn es diese nicht gibt, -1

Das hilft dir bestimmt weiter.

Paulh 29. Sep 2012 19:36

AW: Listboxen vergleichen
 
Meinst du so ?

Delphi-Quellcode:
if NOT (Listbox1.Items.IndexOf(Listbox2.Items[i])=-1) then

Captnemo 29. Sep 2012 19:37

AW: Listboxen vergleichen
 
Oder mit ein bischen Quelltext:

Delphi-Quellcode:
for i := Listbox1.items.count-1 downto 0 do begin
  if Listbox2.items.indexof(Listbox1.items[i])=-1 then begin
    if DeleteFile(Listbox1.items[i]) then
      Listbox1.delete(i);
  end;
end;
Hier gehe ich die Listbox1 von unten nach oben durch. Wenn das jeweilige Element in der Listbox2 nicht vorhanden ist, dann wird das Backup gelöscht. Ist das Löschen erfolgreich, wird das Element aus Listbox1 auch auch gleich entfernt.

Captnemo 29. Sep 2012 19:39

AW: Listboxen vergleichen
 
Zitat:

Zitat von Paulh (Beitrag 1184993)
Meinst du so ?

Delphi-Quellcode:
if NOT (Listbox1.Items.IndexOf(Listbox2.Items[i])=-1) then

Ich hätte jetzt geschieben:

Delphi-Quellcode:
if Listbox1.items.IndexOf(Listbox2.Items[i])>-1 then
ist aber im Grunde das gleiche. Möglicherweise ist der verzicht auf NOT etwas schnellen, aber das wird ggf. auch vom Compiler optimiert, wäre aber auch bei dieser Operation zu vernachlässigen, da die Rechner heute so schnell sind, dass das eh nicht auffallen würde. (Meine Meinung ;-) )

Captnemo 29. Sep 2012 19:43

AW: Listboxen vergleichen
 
Zitat:

Zitat von Captnemo (Beitrag 1184994)
Oder mit ein bischen Quelltext:

Delphi-Quellcode:
for i := Listbox1.items.count-1 downto 0 do begin
  if Listbox2.items.indexof(Listbox1.items[i])=-1 then begin
    if DeleteFile(Listbox1.items[i]) then
      Listbox1.delete(i);
  end;
end;
Hier gehe ich die Listbox1 von unten nach oben durch. Wenn das jeweilige Element in der Listbox2 nicht vorhanden ist, dann wird das Backup gelöscht. Ist das Löschen erfolgreich, wird das Element aus Listbox1 auch auch gleich entfernt.

Achso, noch eine kleine Ergänzung:

das "downto" würde ich diese Stelle verwenden, weil wenn du es anders herum macht, also "for i:=0 to Listbox1.items.count-1" dann kommst du ja irgendwann an eine Stelle, wo aus Listbox1 ein Element löscht. Nach dem Löschen ist Listbox1.Items.count ja kleiner, und die Schleife will am Ende irgendwann auf ein Element zugreifen, was ja gar nicht mehr existiert. Dann hagelt es eine Exception.

sx2008 29. Sep 2012 19:50

AW: Listboxen vergleichen
 
Du kannst das Problem reduzieren, indem du nicht die Listboxen anschaust sondern die Items[] Properties.
Dabei handelt es sich um TStrings-Objekte. (bzw. von der Klasse TStrings abgeleitet).

Also willst du zwei Stringlisten "vergleichen".
Vergleichen ist auch nicht das richtige Wort, sondern es dreht sich eher um Mengenlehre.
Man kann die Schnittmenge zweier Stringlisten bilden oder die Vereinigungsmenge oder auch die Restmenge (Menge A ohne B).

siehe auch Code-Library: http://www.delphipraxis.net/20262-me...inglisten.html

Wenn man mal das Prinzip der Mengenlehre begriffen hat, dann braucht man nicht im Nebel stochern sondern kann gezielt das Richtige tun.
Und somit hoffe ich, dass alle die hier schnell aus der Hüfte mit etwas Code geschossen haben noch etwas dazulernen.

Paulh 29. Sep 2012 19:52

AW: Listboxen vergleichen
 
Habe es jetzt mit einer 3. Listbox versucht und es kommt aber immer noch ein mischmasch raus :(

Delphi-Quellcode:
for i := Listbox1.items.count-1 downto 0 do begin
  if NOT (Listbox2.items.indexof(Listbox1.items[i])=-1) then begin
    //if DeleteFile(Listbox1.items[i]) then
      Listbox3.Items.Add(Listbox2.Items[i]);
  end;
end;

Captnemo 29. Sep 2012 19:52

AW: Listboxen vergleichen
 
Zitat:

Du kannst das Problem reduzieren, indem du nicht die Listboxen anschaust sondern die Items[] Properties.
Dabei handelt es sich um TStrings-Objekte. (bzw. von der Klasse TStrings abgeleitet).

Also willst du zwei Stringlisten "vergleichen".
Vergleichen ist auch nicht das richtige Wort, sondern es dreht sich eher um Mengenlehre.
Man kann die Schnittmenge zweier Stringlisten bilden oder die Vereinigungsmenge oder auch die Restmenge (Menge A ohne B).

siehe auch Code-Library: Mengenoperationen mit Stringlisten

Wenn man mal das Prinzip der Mengenlehre begriffen hat, dann braucht man nicht im Nebel stochern sondern kann gezielt das Richtige tun.
Und somit hoffe ich, dass alle die hier schnell aus der Hüfte mit etwas Code geschossen haben noch etwas dazulernen.


Und was ist jetzt daran einfacher?

Popov 29. Sep 2012 19:53

AW: Listboxen vergleichen
 
Zitat:

Zitat von Captnemo (Beitrag 1184999)
das "downto" würde ich diese Stelle verwenden, weil ...

Auch wenn es die Höflichkeit gebietet in der Kommunikation immer die Ich-Form zu wählen um den Gegenüber nicht vor den Kopf zu stoßen, wie z. B. "würde ich", ändert es nichts daran, dass hier ein "musst du" angebracht ist, denn es gibt nur die eine Variante. Alles andere führt zum Knall ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 Uhr.
Seite 1 von 3  1 23      

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 by Thomas Breitkreuz