Entwickler-Ecke
Sonstiges (Delphi) - Memo -> Blacklist ->Filter
D44rkside - Di 24.02.04 14:32
Titel: Memo -> Blacklist ->Filter
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
Anonymous - 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 - 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
Anonymous - 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 - 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
Anonymous - Di 24.02.04 15:08
ja aber es war ja von memos die rede... :-)
gruß
ixtreme.de
Udontknow - Di 24.02.04 15:44
Ja nu, deshalb muss man doch nicht gleich seinen Code in Ketten legen. :wink:
Cu,
Udontknow
D44rkside - 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 - 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 - 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. - 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
Christian S. - 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.
Udontknow - 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 - 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 - 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!