// Hiermit kann
man prüfen, ob sich (mindstens) eine Textpassage
// in einer Datei befindet. Der Code wurde eigentlich für Text-
// Dateien geschrieben, kann evtl. aber auch für andere Dateien
// verwendet werden. Man kann festlegen, ob Groß- und
Kleinschreibung
// beachtet werden soll, ob nach ganzen Wörtern gesucht werden soll
// und ob Zeilenumbrüche beim Suchen übergangen werden sollen.
// Getestet mit RS 10.4 unter Win11uses System.AnsiStrings;
const
BST = ['a' .. 'z', 'ä', 'ö', 'ü', 'A' .. 'Z', 'Ä', 'Ö', 'Ü', 'ß'];
var
Stop: Boolean = False;
function FindText(aFile: TFilename; Pattern: String;
MatchCase, WholeWord, Endofline: Boolean): Boolean;
const
Amount = 1024;
var
LG: Integer;
FS: TFileStream;
ChrRead, Place: Integer;
Buffer, Hlp: AnsiString;
begin
Result := False;
LG := Length(Pattern);
if not MatchCase then
Pattern := LowerCase(Pattern);
SetLength(Buffer, Amount);
FS := TFileStream.Create(aFile, fmOpenRead);
while FS.Position < FS.Size do
begin
Application.ProcessMessages;
if Stop or Application.Terminated then
Break;
ChrRead := FS.Read(Buffer[1], Amount);
if not MatchCase then
CharLowerBuffA(PAnsiChar(Buffer), Amount);
Hlp := Hlp + Copy(Buffer, 1, ChrRead);
if Endofline then
begin
Hlp := AnsiReplaceStr(Hlp, #13, '');
Hlp := AnsiReplaceStr(Hlp, #10, '');
end;
Place := Pos(Pattern, String(Hlp));
if Place > 0 then
begin
if WholeWord then
begin
if (Place = 1) or (not CharInSet(Hlp[Pred(Place)], BST)) then
begin
if Place + LG > Length(Hlp) then
continue;
if CharInSet(Hlp[Place + LG], BST) then
continue;
Result := True;
Break;
end
else
continue;
end
else
begin
Result := True;
Break;
end;
end;
end;
Buffer := '';
Hlp := '';
FS.free;
end;
// Beispielaufruf
procedure TForm1.Button1Click(Sender: TObject);
var
GanzesWort, GrossKlein, ZeilenEnden: Boolean;
begin
GanzesWort := True;
GrossKlein := False;
ZeilenEnden := False;
if FindText('Unit6.pas', 'thintwindow', GrossKlein, GanzesWort, ZeilenEnden)
then
ShowMessage('Begriff wurde in der Datei gefunden')
else
ShowMessage('Mit der aktuellen Einstellung nichts gefunden');
end;
// Suche bei großen Dateien abbrechen
procedure TForm1.Button2Click(Sender: TObject);
begin
Stop := True;
end;
|