| Autor |
Beitrag |
Tristan
      
Beiträge: 106
|
Verfasst: So 27.11.05 21:32
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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|
Tristan 
      
Beiträge: 106
|
Verfasst: So 27.11.05 22:58
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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.
_________________ Na denn, dann. Bis dann, denn.
|
|
Tristan 
      
Beiträge: 106
|
Verfasst: 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
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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; |
_________________ Na denn, dann. Bis dann, denn.
|
|
Tristan 
      
Beiträge: 106
|
Verfasst: Mo 28.11.05 22:46
Vielen Dank jetzt funktioniert alles fehlerfrei...
|
|
Tristan 
      
Beiträge: 106
|
Verfasst: 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
      
Beiträge: 17
WIN 98, WIN XP
D5 Pers
|
Verfasst: 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 
      
Beiträge: 106
|
Verfasst: 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
      
Beiträge: 2266
Erhaltene Danke: 4
Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
|
Verfasst: 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
_________________ Lükes Grundlage der Programmierung: Es wird nicht funktionieren.
(Murphy)
|
|