Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi KillDuplicates gibt Fehler mit CoolTrayIcon? (https://www.delphipraxis.net/58006-killduplicates-gibt-fehler-mit-cooltrayicon.html)

RavenIV 30. Nov 2005 09:31

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
Zitat:

Zitat von lucius
List index out of Bounds(1).

Da hast du doch die Fehlermeldung.
was ist da so schwer zu verstehen?

Zitat:

Zitat von lucius
Dann wieder die Message zum oeffnen van der CoolTrayIcon.pas was ich getan habe da gibt er an:

Delphi-Fehler sind nicht immer verlässlich.
Oft liegt der Fehler auch einige Anweisungen vorher.

Beachte doch mal mein letztes Posting und versuch's dann nochmal.

*** liesst denn keiner meine Postings? ***

lucius 30. Nov 2005 09:49

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
RavenIV, ich habe die Anzahl neu gesetzt nachdem Killduplicates ausgefuehrt wurde, aber das will auch nicht so.
Wenn ich jetzt Killdublicates weg lasse, laeuft alles wunderbar ausser das wenn ich jetzt die Listview neu laden moechte mit
Delphi-Quellcode:
Var Sl:Tstringlist;
    i,Anzahl:integer;
    Listitem:Tlistitem;
begin
  //speedbutton1.Visible := false;
  Screen.Cursor := crHourGlass;
  Listview.Items.BeginUpdate;
  Listview.items.clear;
  sl:=TStringList.Create;
  try
    sl.LoadFromFile(label2.caption +  '\torrents.db'); <---- hierdrin koennen doppelte sitzen
    //anzahl lesen
    anzahl:=strtoint(sl[0]);
    for i:=0 to anzahl do
      begin
        listitem:=listview.Items.add;
        //caption des items lesen
        listitem.Caption := sl[i*2+1];
        //alle subitems des items mit einmal lesen
        listitem.SubItems.CommaText := sl[i*2+2];
      end;
  finally
  Groupbox2.Caption := 'Anzahl torrents: ' + IntTostr(Listview.Items.count);
    sl.free;
    Listview.Items.EndUpdate;
  end;
Screen.Cursor := crDefault;
end;
Dan werden die (doppelte) Eintraege mit in der Listview angezeigt und das moechte ich beheben.
Zitat:

Da hast du doch die Fehlermeldung.
was ist da so schwer zu verstehen?
Weil egal was ich mache ich jedesmal Index out of bounds bekomme, wenn ich Killdublicates in den oberen Code setze.

mumu 30. Nov 2005 09:52

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
warum debuggst du das ganze nicht einfach mal durch. irgendwo in der KillDuplicates Funktion wird wohl was irgendwas über den index hinauslaufen...

RavenIV 30. Nov 2005 09:58

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
Zitat:

for i:=0 to anzahl do
lass doch mal bis "anzahl - 1" laufen...
daher, dass du bei "0" anfängst, laufst du einmal zuviel durch.

marabu 30. Nov 2005 10:10

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
Moin Lucius,

wie hast du denn deine Datei torrents.db aufgebaut? Ist das eine CSV-Datei?

Code:
Datum,Category
2005-11-28,Muziek
oder ist es eine folded CSV-Datei?

Code:
Datum=2005-11-28,Category=Muziek
oder ist es ein ganz anderes Format? Steht wirklich eine Anzahl in der ersten Zeile?

Die Prozedur KillDuplicates() hatte ich ursprünglich für etwas anderes entworfen. Wenn du sie in deinem Projekt verwendest, dann musst du sie verstehen und an deine Bedürfnisse anpassen. Sie funktioniert unverändert, wenn du eine folded CSV-Datei verwendest, aber sie stellt die Gleichheit anhand aller Spaltenwerte fest und nicht aufgrund der Übereinstimmung nur eines bestimmten Spaltenwertes.

Grüße vom marabu

lucius 30. Nov 2005 10:17

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
RaveIV, leider, ich habe deine Variante probiert, downto etc.
Ich denke ich muss schon die TStringList in Ruhe lassen in der LoadFunction, das bringt so nichts, habe gestern bis 03.00 dran gessen und bin noch keinen Schritt weiter.
Gibt es denn eine Function die doppelte Eintraege in einer Listview loescht?
Dann gehe ich eben die Listview an den Kragen.
Ich moechte dan in einer bestimmten Spalte gucken ob da doppelte drin stehen und dan loeschen.
In etwa so?
Delphi-Quellcode:
for i := Listview.Items.Count -1 downto 0 do
   if Listview.Items[i].SubItems[2] = ... then
      Listview.Items[i].Delete..
Hi marabu die Datei ist so aufgebaut:
Zitat:

2005-11-28,"Films - DVDr","End of Days","4.36 GB", ........

dahead 30. Nov 2005 10:50

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
Hi Lucius!

so müsste es hoffentlich funktionieren:

Delphi-Quellcode:
procedure KillDuplicates(SL: TStringList);
var
  I, F: integer;
begin
  for I := SL.Count - 1 downto 0 do
  for F := SL.Count - 1 downto 0 do
  if I <> F then
  if SL[I] = SL[F] then
   begin
    SL.Delete(F);
    Break;
   end;
end;
Edit: Alternativ könntest du auch beim Hinzufügen der Einträge zu deiner Stringliste die Eigenschaft Duplicates := dupIgnore setzen. Damit werden gleiche Items nicht mehr Hinzugefügt, und du sparst dir das KillDuplicates mit den zwei Schleifen.

Edit2:
Zitat:

Gibt es denn eine Function die doppelte Eintraege in einer Listview loescht?
Das halte ich pers. nicht für sinnvoll, du solltest die Daten (wie du es ja bereits machst) vor dem Anzeigen in der Listview auf Duplikate prüfen und ggf. löschen. Außerdem nicht sich das von der Funktion her egtl. nicht viel, sei es ListView oder StringList.

Da ich annehme, dass du die Torrents in einer Listview dem Benutzer anzeigen willst, plädiere ich für die erste Version (also vorher Duplikate raus, dann anzeigen), da es den Benutzer ja nicht zu interessieren braucht, ob da Duplikate drin sind oder waren. Außerdem dürfte es schneller gehen.

marabu 30. Nov 2005 10:57

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
Mein Vorschlag wäre:

Delphi-Quellcode:
procedure KillDuplicatesEx(s: TStrings; index: integer);
var
  iLow, iHigh: integer;
  sLow, sHigh: TStringList;
begin
  sLow := TStringList.Create;
  sHigh := TStringList.Create;
  for iLow := 0 to s.Count - 2 do
    for iHigh := Pred(s.Count) downto Succ(iLow) do
    begin
      sLow.CommaText := s[iLow];
      sHigh.CommaText := s[iHigh];
      if sLow[index] = sHigh[index] then
        s.Delete(iHigh);
    end;
  sLow.Free;
  sHigh.Free;
end;
marabu

lucius 30. Nov 2005 11:08

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
Hi marabu,
Delphi-Quellcode:
procedure KillDuplicatesEx(s: TStrings; index: integer);
was soll ich denn den Indexwert uebergeben?

MFG, Lucius.

marabu 30. Nov 2005 11:13

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
Hi Lucius,

du musst 2 übergeben, wenn du die Gleichheit anhand des Wertes im dritten Feld der CSV-Datei feststellen möchtest.

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 Uhr.
Seite 2 von 4     12 34      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz