Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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)

lucius 29. Nov 2005 22:41


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:
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;
Der Fehler:
Zitat:

EStringListError List index out of Bounds(813);
Dan fragt er um die.pas file vom Cooltrayicon.
Kan mir bitte einer helfen?
Danke im voraus.

dahead 29. Nov 2005 23:08

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:

Dan fragt er um die.pas file vom Cooltrayicon.
meinst du, er markiert die CoolTrayIcon.pas?

an welcher code-stelle tritt der Out-Of-Bounds Fehler auf?

lucius 29. Nov 2005 23:21

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
Hi dahead,
Zitat:

was liest du mit "anzahl:=strtoint(sl[0]);" aus?
Damit lese ich die Anzahl der Zeilen in de TStringListe(sl) aus., und die Auswertung stimmt(810).
Bei der schleife kommt keine -1 for.
Zitat:

an welcher code-stelle tritt der Out-Of-Bounds Fehler auf?
An der Stelle mit dem Pfeil.
Aber der Sinn der Sache ist eigentlich um doppelte Eintraege ob nun in der TStringListe oder direct aus der Listview zu entfernen.

dahead 29. Nov 2005 23:48

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.

lucius 29. Nov 2005 23:56

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.

dahead 30. Nov 2005 00:05

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?

lucius 30. Nov 2005 08:41

Re: KillDuplicates gibt Fehler mit CoolTrayIcon?
 
Morgen dahead, so sieht die Killduplicates aus.
Delphi-Quellcode:
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);
Gruss Lucius.

RavenIV 30. Nov 2005 08:45

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 := ...)

mumu 30. Nov 2005 08:47

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;

lucius 30. Nov 2005 09:16

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:
// Pass the message on
Msg.Result := CallWindowProc(OldWndProc, (Owner as TWinControl).Handle, <------- Zeile wird markiert
              Msg.Msg, Msg.wParam, Msg.lParam);
Ich raff es auch nicht mehr.
Irgendwas stoert CoolTrayIcon an den KillDublicates.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:49 Uhr.
Seite 1 von 4  1 23     Letzte »    

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