![]() |
KillDuplicates gibt Fehler mit CoolTrayIcon?
Hallo Leute etwas seltsames ist mir passiert und ich weiss nicht weiter.
Ich benutze ein CoolTrayIcon fuer mein Programm. Jetzt wollte ich ueber der Function KillDuplicates doppelte Eintraege aus einer TStringListe entfernen aber dabei gibt das CoolTrayIcon einen Fehler aus.
Delphi-Quellcode:
Der Fehler:
procedure TDemoForm.SpeedButton1Click(Sender: TObject);
Var Sl:Tstringlist; i,Anzahl:integer; Listitem:Tlistitem; begin Screen.Cursor := crHourGlass; Listview.Items.BeginUpdate; Listview.clear; sl:=TStringList.Create; try sl.LoadFromFile(label2.caption + '\torrents.db'); //anzahl lesen anzahl:=strtoint(sl[0]); KillDuplicates(sl); <---------------------- 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 := 'Aantal torrents: ' + IntTostr(Listview.Items.count); sl.free; Listview.Items.EndUpdate; end; Screen.Cursor := crDefault; end; Zitat:
Kan mir bitte einer helfen? Danke im voraus. |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Hallo,
bevor ich dir auf eine egtl. Frage antworten kann, muss ich selbst ein paar Dinge wissen: was liest du mit "anzahl:=strtoint(sl[0]);" aus? bzw. bist du sicher, dass die auswertung stimmt. du gehst mit "for i:=0 to anzahl do " eine Schleife durch. Bist du sicher, dass da kein - 1 hin kommt? Das verstehe ich nicht: Zitat:
an welcher code-stelle tritt der Out-Of-Bounds Fehler auf? |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Hi dahead,
Zitat:
Bei der schleife kommt keine -1 for. Zitat:
Aber der Sinn der Sache ist eigentlich um doppelte Eintraege ob nun in der TStringListe oder direct aus der Listview zu entfernen. |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
ahja, dann nehme ich mal an, dass killduplicates die menge der einträge kürzt. du aber mit der variable anzahl noch auf die alte menge zugreifst.
du musst also entweder die variable neu zuweisen (anzahl := SL.Count-1) oder aber in der for schleife for I := 0 to SL.Count - 1 verwenden. |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Hmmm dahead funzt nicht richtig, bekomme immer noch out of bounds.
Gibt es denn ne Function womit man doppelte Eintraege aus der Listview loeschen kann? Meine Listview hat 4 Spalten und das ich dann zum Beispiel nach der 3en Spalte gucke ob da doppelte Eintraege vorhanden sind. |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
also ich kenne keine direkte funktion. du könntest dir eine selber basteln (z.b. zwei for-schleifen, die den text der stringliste vergleichen und bei gleichheit löschen. das könntest du mit "for I := SL.Count - 1 downto 0 do for F := SL.Count - 1 downto 0 do ..." lösen).
aber ich denke, dass deine killdupes funktion/routine das schon macht, oder? wie sieht die denn aus, bzw. was passiert, wenn du diese ausklammerst, geht dann alles reibungslos? |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Morgen dahead, so sieht die Killduplicates aus.
Delphi-Quellcode:
Gruss Lucius.
procedure KillDuplicates(s: TStrings);
var iLow, iHigh: integer; begin for iLow := 0 to s.Count - 2 do for iHigh := Pred(s.Count) downto Succ(iLow) do if s[iLow] = s[iHigh] then s.Delete(iHigh); |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
da liegt der Fehler:
du löschst in KillDuplicates ein Element aus der Liste. beim Durchgehen der Liste beachtest du dies aber nicht und läufst bis zur Original-Länge der Liste. => Du muss also nach dem Duplikat-Löschen noch mal die Länfe ermitteln (anzahl := ...) |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
das müsste funktionieren:
Delphi-Quellcode:
procedure KillDuplicates(s: TStrings);
var iLow, iHigh: integer; begin for iLow := s.Count-1 downto 0 do for iHigh := s.Count-1 downto 0 do if s[iLow] = s[iHigh] then begin s.Delete(iLow); break; end; |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Leider mumu, funzt auch nicht richtig.
List index out of Bounds(1). Dann wieder die Message zum oeffnen van der CoolTrayIcon.pas was ich getan habe da gibt er an:
Delphi-Quellcode:
Ich raff es auch nicht mehr.
// Pass the message on
Msg.Result := CallWindowProc(OldWndProc, (Owner as TWinControl).Handle, <------- Zeile wird markiert Msg.Msg, Msg.wParam, Msg.lParam); Irgendwas stoert CoolTrayIcon an den KillDublicates. |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Zitat:
was ist da so schwer zu verstehen? Zitat:
Oft liegt der Fehler auch einige Anweisungen vorher. Beachte doch mal mein letztes Posting und versuch's dann nochmal. *** liesst denn keiner meine Postings? *** |
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:
Dan werden die (doppelte) Eintraege mit in der Listview angezeigt und das moechte ich beheben.
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; Zitat:
|
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...
|
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Zitat:
daher, dass du bei "0" anfängst, laufst du einmal zuviel durch. |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Moin Lucius,
wie hast du denn deine Datei torrents.db aufgebaut? Ist das eine CSV-Datei?
Code:
oder ist es eine folded CSV-Datei?
Datum,Category
2005-11-28,Muziek
Code:
oder ist es ein ganz anderes Format? Steht wirklich eine Anzahl in der ersten Zeile?
Datum=2005-11-28,Category=Muziek
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 |
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:
Hi marabu die Datei ist so aufgebaut:
for i := Listview.Items.Count -1 downto 0 do
if Listview.Items[i].SubItems[2] = ... then Listview.Items[i].Delete.. Zitat:
|
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Hi Lucius!
so müsste es hoffentlich funktionieren:
Delphi-Quellcode:
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.
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; Edit2: Zitat:
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. |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Mein Vorschlag wäre:
Delphi-Quellcode:
marabu
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; |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Hi marabu,
Delphi-Quellcode:
was soll ich denn den Indexwert uebergeben?
procedure KillDuplicatesEx(s: TStrings; index: integer);
MFG, Lucius. |
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 |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Marabu, list index out of bounds(2)
wobei ich die Anzahl neu definieren muss denke ich mal? dan ist das Problem geloesst, hoffe ich, oder?
Delphi-Quellcode:
MFG, Lucius.
try
sl.LoadFromFile(label2.caption + '\torrents.db'); //anzahl lesen KillDuplicatesEx(sl, 2); anzahl:=strtoint(sl[0]); <---- list index out of bounds(2) 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 |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Lucius, du hast doch gar keine Anzahl in der ersten Zeile von torrents.db stehen - oder? Und deine Indexberechnung in der Schleife kann nicht funktionieren. Wenn der Aufbau der Datei so ist, wie du es weiter oben behauptest, dann musst du es so probieren:
Delphi-Quellcode:
Hoffentlich habe ich mich nicht zu oft verschrieben...
var
FieldList: TStringList; begin FieldList := TStringList.Create; // ... try sl.LoadFromFile(label2.caption + '\torrents.db'); KillDuplicatesEx(sl, 2); for i := 0 to Pred(sl.Count) do begin FieldList.CommaText := sl[i]; with ListView.Items.Add do begin Caption := FieldList[0]; FieldList.Delete(0); SubItems.Assign(FieldList); end; end; finally FieldList.Free; // ... end; // ... end; marabu |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
So ich werde mich erstmal ein Sueppchen essen und dann deine Function ausprobieren marabu, denn ich brauche erstmal ne kleine Pauze mir kwalmt schon der Kopf. :wall:
MFG, Lucius. |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
So marabu, habe deine Function ausprobiert aber nog immer Listindex out of Bounds(2).
Delphi-Quellcode:
So sieht die torrents.db vor dem laden aus.
try
sl.LoadFromFile(label2.caption + '\torrents.db'); //anzahl lesen KillDuplicatesEx(sl, 2); for i := 0 to Pred(sl.Count) do <------ out of bounds(2) begin FieldList.CommaText := sl[i]; with ListView.Items.Add do begin Caption := FieldList[0]; FieldList.Delete(0); SubItems.Assign(FieldList); end; end; finally FieldList.Free; Zitat:
MFG, Lucius. |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Jetzt wo du satt bist, solltest du mal nachsehen, ob da Leerzeilen zwischen den Datenzeilen in der Textdatei sind.
marabu |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Ja es gibt Leerzeilen in der Datei, siehe Zitat.
|
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Raus damit. Wofür sollen die gut sein?
marabu |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Das ist die Speicher Function die verursacht die Leerzeilen.
Delphi-Quellcode:
Var Sl:Tstringlist;
i:integer; begin sl:=TStringList.Create; try //anzahl schreiben sl.Add(inttostr(ListView.Items.count-1)); for i:=0 to ListView.Items.count-1 do begin //caption des items schreiben sl.Add(ListView.Items[i].Caption); //alle subitems des items mit einmal reinschreiben sl.Add(ListView.Items[i].SubItems.CommaText) end; sl.SaveToFile(label2.caption + '\torrents.db'); finally sl.free; end; |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Lucius, du darfst die Anzahl nicht mit rausschreiben - es ist dann keine CSV-Datei mehr und du bekommst die Zahl ja später problemlos wieder, wenn du die Datei mit LoadFromFile() einliest. Außerdem müssen alle Spaltenwerte in einer Zeile stehen, damit der Code zum Einlesen funktioniert, den ich dir weiter oben (#22) gegeben habe.
Delphi-Quellcode:
marabu
var
slLines, slFields: TStringList; i: integer; begin slFields := TStringList.Create; slLines := TStringList.Create; try with ListView do for i := 0 to Pred(Items.Count) do begin slFieldsl.Assign(Items[i].SubItems); slFields.Insert(0, Items[i].Caption); slLines.Add(sfFields.CommaText); slFields.Clear; end; slLines.SaveToFile(label2.caption + '\torrents.db'); finally slLines.Free; slFields.Free; end; end; |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Na marabu,
Nachdem ich alles eingebaut habe wie du es sagtest funktioniert es, aber er laedt die Daten nicht mehr so schnell dan die andere Function in der Listview, eigentlich Schade. Das war ne schwere Geburt aber es klappt. Herzlichen Dank an alle die geholfen haben insbesondere marabu. MFG, Lucius. |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Hi Lucius,
Zitat:
marabu |
Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
Hi marabu ja ich verwende Items.BeginUpdate und Items.EndUpdate, die Liste wird auch vorher geleert.
Delphi-Quellcode:
var
FieldList: TStringList; begin Listview.Items.BeginUpdate; <------------ Listview.Clear; <------------ FieldList := TStringList.Create; // ... try sl.LoadFromFile(label2.caption + '\torrents.db'); KillDuplicatesEx(sl, 2); for i := 0 to Pred(sl.Count) do begin FieldList.CommaText := sl[i]; with ListView.Items.Add do begin Caption := FieldList[0]; FieldList.Delete(0); SubItems.Assign(FieldList); end; end; finally Listview.Items.EndUpdate; <-------------- FieldList.Free; // ... end; // ... end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:53 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-2025 by Thomas Breitkreuz