![]() |
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:
Vielen Dankt im vorraus !
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; |
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. |
AW: Listboxen vergleichen
Meinst du so ?
Delphi-Quellcode:
if NOT (Listbox1.Items.IndexOf(Listbox2.Items[i])=-1) then
|
AW: Listboxen vergleichen
Oder mit ein bischen Quelltext:
Delphi-Quellcode:
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.
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; |
AW: Listboxen vergleichen
Zitat:
Delphi-Quellcode:
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 ;-) )
if Listbox1.items.IndexOf(Listbox2.Items[i])>-1 then
|
AW: Listboxen vergleichen
Zitat:
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. |
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 ![]() Man kann die Schnittmenge zweier Stringlisten bilden oder die Vereinigungsmenge oder auch die Restmenge (Menge A ohne B). siehe auch Code-Library: ![]() 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. |
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; |
AW: Listboxen vergleichen
Zitat:
Und was ist jetzt daran einfacher? |
AW: Listboxen vergleichen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:58 Uhr. |
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