Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Tstrings vergleichen und String löschen
Tristan - So 27.11.05 21:32
Titel: Tstrings vergleichen und String löschen
Nabend,
Ich möchte zwei Stringlisten miteinander vergleichen und wenn ein Eintrag aus der ersten Liste in der Zweiten steht, diesen dort entfernen. Leider kommt es dabei immer zu einer "Überschreitung des Maximas" oder ähnlichem. Kann ich den string erst nach der Schleife entfernen oder warum gibt es diesen Fehler?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| For Zeile:=0 to DisAllowed.Count-1 do Begin For I:=0 to Allowed.Count-1 do Begin Eintrag aus verbotenen Tasks If Disallowed.Strings[Zeile]=Allowed.Strings[I] then disallowed.Delete(zeile); End; End; |
Danke ;-)
Moderiert von
Christian S.: Quote- durch Delphi-Tags ersetzt
Keldorn - So 27.11.05 21:55
Hallo
bei der For-schleife wird das Schleifenende einmalig beim Éintritt festgelegt und nicht aktualisiert. Verwende eine While-Konstruktion oder laß die Forschleife per downto rückwärts laufen.
Mfg Frank
Tristan - So 27.11.05 22:58
Vielen Dank, :D ich habe die Vermutung schon fast gehabt dass es an der Änderung des Indexes lag
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| For Zeile:=DisAllowed.Count-1 downto 0 do Begin For I:=0 to Allowed.Count-1 do Begin verbotenen Tasks If Disallowed.Strings[Zeile]=Allowed.Strings[I] then disallowed.Delete(zeile);
End;
End; |
Moderiert von
Christian S.: Quote- durch Delphi-Tags ersetzt
alzaimar - So 27.11.05 23:03
Um einen String in einer TStringList zu suchen, verwendet man auch die Methode 'IndexOf'. Damit würde dein Code übersichtlicher werden:
Delphi-Quelltext
1: 2: 3:
| For i:= DisAllowed.Count - 1 downto 0 do If Allowed.IndexOf (DisAllowed[i])<>-1 Then DisAllowed.Delete (i) |
Weiterhin wird dein Code genau dann nicht funktionieren, wenn der letzte String in Disallowed nicht gültig ist. Er wird dann entfernt, ein Zugriff auf Disallowed{Zeile] wäre dann nicht mehr gültig, da Zeile ja nun = DisAllowed.Count wäre. Du müsstest nach dem Entfernen die innere Schleife per break verlassen.
Tristan - So 27.11.05 23:30
alzaimar hat folgendes geschrieben: |
Weiterhin wird dein Code genau dann nicht funktionieren, wenn der letzte String in Disallowed nicht gültig ist. Er wird dann entfernt, ein Zugriff auf Disallowed{Zeile] wäre dann nicht mehr gültig, da Zeile ja nun = DisAllowed.Count wäre. Du müsstest nach dem Entfernen die innere Schleife per break verlassen. |
Die Methode IndexOf könnte man fast mit Pos vergleichen oder?
Durch das Löschen ändert sich ja der Index - kann man die downto Schleife dann in eine while Schleife integrieren? Allerdings müsste ich ja dann den Index neu schreiben oder?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Index:=DisAllowed.Count-1;
While Zeile<Index do Begin Index:=Disallowed.Count-1;
For i:= DisAllowed.Count - 1 downto 0 do If Allowed.IndexOf (DisAllowed[i])<>-1 Then Begin DisAllowed.Delete(i); Break; End; End; |
Oder meinst du etwas anderes?
alzaimar - Mo 28.11.05 09:04
Nee, mein Beispiel funktioniert, nur Dein Code hat eine Macke. Verwende doch einfach die Online-Hilfe, um rauszukriegen, wie IndexOf funktioniert.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| For Zeile:=0 to DisAllowed.Count-1 do Begin For I:=0 to Allowed.Count-1 do Begin If Disallowed.Strings[Zeile]=Allowed.Strings[I] then Begin disallowed.Delete(zeile); Break; End; End; End; |
Tristan - Mo 28.11.05 22:46
Vielen Dank jetzt funktioniert alles fehlerfrei...
Tristan - Fr 09.12.05 12:20
Moin,
Wenn ein String in einer Stringlist mit IndexOf gefunden wird, gibt diese Funktion doch eigentlich einen Wert <>-1 zurück oder?
Ich bin gerade dabei einen kleinen Webfilter zu bauen, welcher die URLs aller IE Fenster ausliest, den Quellcode herunterlädt und dann nach bestimmten Wörtern sucht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| IEFenster.GetIEWindows(Urls); For Urlnr:=0 to Urls.Count-1 do Begin Quelltext.Text:=Form1.HTTPFilter.Get(Urls.Strings[URLnr]); For i:=0 to Webfilter.Count-1 do Begin If [b]Quelltext.IndexOf(WebFilter.strings[i])<>-1[/b] then showmessage('Keyword gefunden'); end; |
Die Liste Webfilter enthält die Keywords nach denen gesucht werden soll - IndexOf gibt jedoch immer -1 zurück...
Tristan
master_j - Fr 09.12.05 13:04
| Zitat: |
| Wenn ein String in einer Stringlist mit IndexOf gefunden wird, gibt diese Funktion doch eigentlich einen Wert <>-1 zurück oder? |
Meines Wissens nach gibt IndexOf nur -1 zurück, wenn der Eintrag nicht in der Liste steht, ansonsten gibt sie den Index des Eintrags zurück.
Aber vielleicht klappt IndexOf ja nur bis zu einer bestimmten Anzahl von Einträgen?
Tristan - Sa 10.12.05 13:09
Ich hab den Code jetzt einmal auf das nötigste minimiert um zu testen ob indexof funktioniert, leider Fehlanzeige! Seht ihr einen Fehler den ich übersehen habe?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Procedure HTMlCode; Var Quelltext, URLs:Tstrings; i, UrlNr:integer; Begin
Quelltext:=Tstringlist.Create; Urls:=Tstringlist.Create;
IEFenster.GetIEWindows(Urls);
Quelltext.Text:=Form1.HTTPFilter.Get(Urls.Strings[URLnr]); form1.memo1.Lines:=quelltext;
If Quelltext.IndexOf('width')<>-1 then showmessage('Keyword gefunden'); End; |
Keldorn - Sa 10.12.05 14:24
Mit indexof findest du nur Einträge der stringliste. wenn deine Liste so aussieht:
Quelltext
1: 2: 3: 4:
| blabla ... irgendetwas ... width was anderes ... |
und width nur innerhalb eines eintrages vorkommt, findest du nichts. Wenn du prüfen möchtest, ob width innerhalb eines Listeneintrages vorkommt, mußt du Pos verwenden (!Pos beachtet die Groß und Kleinschreibung)
Mfg Frank
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!