Autor |
Beitrag |
D44rkside
Hält's aus hier
Beiträge: 6
|
Verfasst: Di 24.02.04 14:32
Hi!
Ich bin gerade dabei ein Tool zu schreiben...
Und zwar:
- Das Tool hat 2 Memo Felder und einen Button...
- In ein Memo Feld lädt man einen Text hinein...
- In das zweite Memo lädt mal eine Blacklist
- Auf Buttondruck soll das Programm das erste Memo (normaler Text) mit den Wörtern des zweiten Memos (Blacklist)
Es soll also das erste Memo nach Teilstrings durchsuchen, und dann aber DIE GESAMTE ZEILE des Textes , in der ein
Wort aus der Blacklist vorkommt, löschen!
Ein Beispiel:
[Die erste Zeile von Memo 1]:
Es war einmal ein kleiner Junge der hieß Michael
Nun gibt es ein Wort in der Blacklist dass "Micha" hieß, also soll das Tool jetzt DIE GESAMTE ZEILE löschen!
Ich hab mal angefangen, doch mein Tool löscht NUR DEN TEILSTRING und ich will es so modifizieren, dass DIE GESAMTE ZEILE GELÖSCHT WIRD.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure RemoveStrings(Memo: TMemo; Remove: string); var TmpString: string; RemPos: string; begin TmpString:=Memo.Lines.Text; RemPos:=Inttostr(Pos(Remove,TmpString)); while StrToInt(RemPos)>0 do begin Delete(TmpString, strtoint(RemPos),Length(Remove)); RemPos:=inttostr(Pos(Remove,TmpString)); end; Memo.Lines.Text:=TmpString; end; |
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button1Click(Sender: TObject); var i: Integer; begin for i:=0 to memo2.Lines.Count-1 do begin RemoveStrings(Memo1, Memo2.Lines[i]); end; end; |
Bin für jede Hilfe dankbar!
Danke schonmal im Vorraus.
MfG!
Moderiert von Peter Lustig: Code- durch Delphi-Tags ersetzt
|
|
ixtreme
Gast
Erhaltene Danke: 1
|
Verfasst: Di 24.02.04 14:51
du deklarierst die i:integer variable global....dann kannst du immer die zeile löschen wo er gerade am suchen ist und was gefunden hat, fertig!
du kannst es auch alles in eine procedure packen, dann brauchst du die interger variable nicht global deklarieren...du musst aber auf jedenfall auf die einzelnen zeilen des memo1 zugreifen wenn du diese methode nimmst!
ixtreme.de
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Di 24.02.04 14:58
Ohne jetzt groß den Code zu analysieren:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure DeleteLinesWithBlackListedWord(Lines:TStrings; BlackListedWord:String); var i:integer; begin for i:=Lines.Count-1 downto 0 do if Pos(BlackListedWord,Lines[i])>0 then Lines.Delete(i); end; |
Nun musst du nur diese Prozedur für jedes Wort in der Blacklist aufrufen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure DeleteLinesWithBlackListedWords(Lines:TStrings; Blacklist:TStrings); var i:integer; begin for i:=0 to BlackList.Count-1 do DeleteLinesWithBlackListedWord(Lines,Blacklist[i]); end; |
Der Code beachtet übrigens die Groß-/Kleinschreibung, wenn das nicht sein soll, musst du bei der Funktion "Pos" die Parameter mit Uppercase umhüllen.
Cu,
Udontknow
|
|
ixtreme
Gast
Erhaltene Danke: 1
|
Verfasst: Di 24.02.04 15:01
so gehts auch:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button1Click(Sender: TObject); var i,j : integer; begin for i := 0 to memo2.lines.count - 1 do begin for j := 0 to memo1.lines.count - 1 do begin if pos(memo2.lines[i],memo1.lines[j]) > 0 then begin Memo1.lines.delete(j); end; end; end;
end; |
ixtreme.de
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Di 24.02.04 15:06
Ja, nur kodierst du eben Memo1 und Memo2 direkt ein. Besser schön abstrahieren, sodaß man alle möglichen TStrings-Nachfahren damit bearbeiten kann.
Cu,
Udontknow
|
|
ixtreme
Gast
Erhaltene Danke: 1
|
Verfasst: Di 24.02.04 15:08
ja aber es war ja von memos die rede...
gruß
ixtreme.de
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Di 24.02.04 15:44
Ja nu, deshalb muss man doch nicht gleich seinen Code in Ketten legen.
Cu,
Udontknow
|
|
D44rkside 
Hält's aus hier
Beiträge: 6
|
Verfasst: Di 24.02.04 19:04
Ich glaube, die Schleife wird unendlich oft durchloffen, also wenn ich mir den scrollbalken des tool anschau der rattert da unendlich oft alle durch...
Trotz der for Schleife?
Noch ne Frage, wenn ich die 2 Prozeduren drin habe:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure DeleteLinesWithBlackListedWord(Lines:TStrings; BlackListedWord:String); var i:integer; begin for i:=Lines.Count-1 downto 0 do if Pos(uppercase(BlackListedWord) ,uppercase(Lines[i]))>0 then Lines.Delete(i); end;
procedure DeleteLinesWithBlackListedWords(Lines:TStrings; Blacklist:TStrings); var i:integer; begin for i:=0 to BlackList.Count-1 do DeleteLinesWithBlackListedWord(Lines,Blacklist[i]); end; |
Was muss ich dann zum Start (auf klick von Button 1) aufrufen?
Hab das drin, ist das alles??:
Delphi-Quelltext 1:
| DeleteLinesWithBlackListedWords(Memo1.Lines, Memo2.Lines); |
Moderiert von Peter Lustig: Code- durch Delphi-Tags ersetzt
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Di 24.02.04 20:53
Ja, das ist alles. Natürlich potentiert sich das ganze recht schnell. Wenn du 1000 Zeilen hast sowie 1000 Blacklist-Einträge, so wird im Worstcase (keine Blacklisteinträge vorhanden) 1.000.000 mal die Pos-Funktion aufgerufen. Für TStrings gibt es übrigens noch eine Möglichkeit, die Aktualisierung, die dann erheblich Zeit benötigt, abzuschalten.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure DeleteLinesWithBlackListedWords(Lines:TStrings; Blacklist:TStrings); var i:integer; begin Lines.BeginUpdates; try for i:=0 to BlackList.Count-1 do DeleteLinesWithBlackListedWord(Lines,Blacklist[i]); finally Lines.EndUpdates; end; end; |
Cu,
Udontknow
|
|
D44rkside 
Hält's aus hier
Beiträge: 6
|
Verfasst: Fr 27.02.04 14:58
So...
Hab jetzt mal ein anderen Code von nem Kumpel bekommen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure DeleteLinesWithBlackListedWords(Lines:TStrings; Blacklist:TStrings); var i,j: Integer; begin for i:=0 to Lines.Count-1 do for j:=0 to BlackList.Count-1 do if Pos(uppercase(BlackList[j]) ,uppercase(Lines[i])) <> 0 then Lines.Delete(i); end; |
Delphi-Quelltext 1: 2: 3: 4:
| procedure TForm1.Button1Click(Sender: TObject); begin DeleteLinesWithBlackListedWords(Memo1.Lines, Memo2.Lines); end; |
So jetzt wollte ich noch was sagen:
Also 1. Ist das Memo mit dem Aufsatz (Whitelist) viel länger (also mehr Inhalt) als die, de rBlacklist, deswegen haben die oberen Codes auch nen Drehwurm in dem Memo verursacht...
Jetzt noichwas zu meinem code, das komische, wenn ich nur eine Zeile in die Whitelist lade, die ein Teilstring aus einem Wort der Blacklist enthält, wied diese auch richtig wie es sein soll, gelöscht, aber sobal ich mal paar tausend Zeilen reinlade und nach der Filterung die übriggebliebene Whitelist in Editor einfüge und nach einem Wort, dass in der Blacklist stand, suche, FINDET ER ES IMMERNOCH SEHR OFT!!!
Was so viel heisst, dass der code nicht richtig funktioniert...
kann mir bitte einer helfen, ist echt wichtig....
Danke für alle Antworten...
Moderiert von Peter Lustig: Code- durch Delphi-Tags ersetzt
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 27.02.04 15:03
Hallo, D44rkside!
Bitte benutze demnächst die Delphi-Tags. Durch die Delphi-Tags wird der Code mit Syntax-Highlighting angezeigt und ist somit sehr viel übersichtlicher.
Viele Dank!
Peter
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Christian S.
      
Beiträge: 20451
Erhaltene Danke: 2264
Win 10
C# (VS 2019)
|
Verfasst: Fr 27.02.04 15:06
Noch was zu Deinem Problem:
Lass die äußere Schleife mal andersrum laufen, also bei Count-1 starten und nach unten. Das sollte man immer machen, wenn man Einträge löscht. Sonst kommt man mit den Indizes durcheinander.
_________________ Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
|
|
Udontknow
      
Beiträge: 2596
Win7
D2006 WIN32, .NET (C#)
|
Verfasst: Fr 27.02.04 15:43
Genau, das Herunterzählen sollte es beheben. Hast du da nicht Exceptions (Listenindex überschreitet Maximum) erhalten?
Desweiteren ist es doch eigentlich egal, welche Schleife die andere aufruft. Ich weise nochmal auf den Befehl BeginUpdate/EndUpdate hin.
Cu,
Udontknow
|
|
D44rkside 
Hält's aus hier
Beiträge: 6
|
Verfasst: Fr 27.02.04 23:50
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure DeleteLinesWithBlackListedWords(Lines:TStrings; Blacklist:TStrings); var i,j: Integer; begin for Lines.Count-1 downto 0 do for j:=0 to BlackList.Count-1 do if Pos(uppercase(BlackList[j]) ,uppercase(Lines[i])) <> 0 then Lines.Delete(i); end; |
Geht doch garnicht...
Compilerfehler:
For-Schleivenvariable muss eine einfache lokale variable sein...
Inkompatible Typen: 'Integer' und 'procedure', untyped pointer or parameter.
|
|
rokdd
      
Beiträge: 329
Win XP
D6
|
Verfasst: Sa 28.02.04 09:37
hallo,
waum dekliniesrt du i, wenn du es als zählveriable überhaupt nicht bnutzt wird???
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure DeleteLinesWithBlackListedWords(Lines:TStrings; Blacklist:TStrings); var i,j: Integer; begin for <span style="font-weight: bold">i:=</span>Lines.Count-1 downto 0 do for j:=0 to BlackList.Count-1 do if Pos(uppercase(BlackList[j]) ,uppercase(Lines[i])) <> 0 then Lines.Delete(i); end; |
Müsste jetzt so klappen
rokdd
|
|