// Die
folgende Prozedur erlaubt das Aufsplitten eines Strings an verschiedenen
// Trennzeichen. Die Methode ist noch schneller als die
nichtdokumentierte
// Funktion "ExtractStrings".
// Getestet mit D4 unter
XP
//
Für höhere Versionen gelten die auskommentierten Zeilen
procedure SplitString(Gesamt: string; Trennung: TSysCharSet; Erg: TStrings);
var
p, r: pchar;
s: string;
begin
Erg.BeginUpdate;
p := pchar(Gesamt);
repeat
r := p;
while not(p^ in Trennung + [#0, #10, #13])
// while not CharInSet(p^, Trennung + [#0, #10, #13])
do
inc(p);
SetString(s, r, p - r);
if s <> '' then
Erg.add(s);
while p^ in Trennung + [#10, #13]
// while CharInSet(p^, Trennung + [#10, #13])
do
inc(p);
until p^ = #0;
Erg.endupdate;
end;
// --- Beispielaufruf ----
procedure TForm1.Button3Click(Sender: TObject);
var
s: string;
begin
Listbox1.items.clear;
s := 'Test1'#13#10'Test2#Test3§§§Test4';
SplitString(s, ['#', '§'], Listbox1.items);
end;
Ergebnis:
// Und so kann
man Beispielsweise Text aus Textboxen in einzelne Wörter zerlegen:
const
Delimiters = [#1..#47, #58..#64, #91..#96, #123..#191, #215, #216, #247, #248];
Delimiters_0 = [#0] + Delimiters;
procedure GetWords(txt: string; woerter: TStrings);
var
p, r: pchar;
Token: string;
begin
woerter.Clear;
p := pchar(txt);
repeat
r := p;
while not (p^ in Delimiters_0) do inc(p);
SetString(Token, r, p - r);
if Token <> '' then woerter.Add(Token);
while p^ in Delimiters do inc(p);
until p^ = #0;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
Memo2.Scrollbars := ssBoth;
Memo3.Scrollbars := ssBoth;
Memo2.lines.loadfromfile('c:\protokoll.txt'); // z.B.
GetWords(Memo2.text, Memo3.lines);
end;
|