Autor Beitrag
Tristan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: 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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: So 27.11.05 22:58 
Vielen Dank, :D ich habe die Vermutung schon fast gehabt dass es an der Änderung des Indexes lag

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: 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?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.
ausblenden 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;

_________________
Na denn, dann. Bis dann, denn.
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: Mo 28.11.05 22:46 
Vielen Dank jetzt funktioniert alles fehlerfrei...
Tristan Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 17

WIN 98, WIN XP
D5 Pers
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 106



BeitragVerfasst: 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?


ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 2266
Erhaltene Danke: 4

Vista
D6 Prof, D 2005 Pro, D2007 Pro, DelphiXE2 Pro
BeitragVerfasst: Sa 10.12.05 14:24 
Mit indexof findest du nur Einträge der stringliste. wenn deine Liste so aussieht:
ausblenden 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)