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
   //Wenn Wert aus der Allowed Liste mit Wert aus Disallowed übereinstimmt entferne   
   Eintrag aus verbotenen Tasks
   If Disallowed.Strings[Zeile]=Allowed.Strings[I] then disallowed.Delete(zeile);
   End;
 End;


Danke ;-)

Moderiert von user profile iconChristian 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
   //Wenn Wert aus der Allowed Liste mit Wert aus Disallowed übereinstimmt entferne Eintrag aus   
   verbotenen Tasks
   If Disallowed.Strings[Zeile]=Allowed.Strings[I] then disallowed.Delete(zeile);

   End;

 End;


Moderiert von user profile iconChristian 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

user profile iconalzaimar 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
   //Wenn Wert aus der Allowed Liste mit Wert aus Disallowed übereinstimmt entferne   
   // Eintrag aus verbotenen Tasks
   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); //Aktuelle URLs auslesen und in Stringlist laden

For Urlnr:=0 to Urls.Count-1 do
 Begin
 Quelltext.Text:=Form1.HTTPFilter.Get(Urls.Strings[URLnr]);  //HTML Code der Seite auslesen

   //Dann mit IndexOfs suchen
   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; //Variable erzeugen
Urls:=Tstringlist.Create;

IEFenster.GetIEWindows(Urls); //Aktuelle URLs auslesen und in Stringlist laden


 Quelltext.Text:=Form1.HTTPFilter.Get(Urls.Strings[URLnr]);  //HTML Code der Seite auslesen
  form1.memo1.Lines:=quelltext;

   //Dann mit IndexOf suchen
   
   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