![]() |
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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