Autor Beitrag
D44rkside
Hält's aus hier
Beiträge: 6



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

ausblenden 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;


ausblenden 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 user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt
ixtreme
Gast
Erhaltene Danke: 1



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

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 24.02.04 14:58 
Ohne jetzt groß den Code zu analysieren:

ausblenden 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.

ausblenden 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



BeitragVerfasst: Di 24.02.04 15:01 
so gehts auch:

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

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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



BeitragVerfasst: Di 24.02.04 15:08 
ja aber es war ja von memos die rede... :-)

gruß

ixtreme.de
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: Di 24.02.04 15:44 
Ja nu, deshalb muss man doch nicht gleich seinen Code in Ketten legen. :wink:

Cu,
Udontknow
D44rkside Threadstarter
Hält's aus hier
Beiträge: 6



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

ausblenden 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??:
ausblenden Delphi-Quelltext
1:
DeleteLinesWithBlackListedWords(Memo1.Lines, Memo2.Lines);					


Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt
Udontknow
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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.

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 27.02.04 14:58 
So...
Hab jetzt mal ein anderen Code von nem Kumpel bekommen:

ausblenden 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;


ausblenden 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 user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2596

Win7
D2006 WIN32, .NET (C#)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 27.02.04 23:50 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 329

Win XP
D6
BeitragVerfasst: Sa 28.02.04 09:37 
hallo,
waum dekliniesrt du i, wenn du es als zählveriable überhaupt nicht bnutzt wird???
ausblenden 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