Hallo,
ich möchte die Wörter in einem Rtf-Feld zählen. Dazu habe ich folgenden Code verwendet (s.auch
http://www.delphipraxis.net/internal...6rter+z%E4hlen).
Es funktioniert ja eigentlich auch, aber nur unheimlich langsam. Auch die schnellere Variante, die nur auf Leerzeichen prüft, ist bei Texten größer als 100KByte zu langsam (ab 300KByte Text wirds richtig lahm). In Word oder Works gibt es auch so eine Funktion, nur dort ist diese blitzschnell.
Hat jemand Optimierungsvorschläge oder andere meth. Ansätze?
Delphi-Quellcode:
function TEditor.CountWordsSlow(minwordlength:Integer):Integer;
var s: string;
c: char;
i, l, le:Integer;
begin
i:=0;
le:=Length(Text);
s:='';
if le > 0 then
for l:=1 to le do
begin
c:=Text[l];
if (Upcase(c) in ['A'..'Z','Ä','Ö','Ü','ü','ö','ä','ß']) then s:=s+c
else
begin
if (Length(s) >= minwordlength) Then Inc(i);
s:='';
end;
end;
CountWordsSlow:=i;
end; {TEditor.CountWords}
function TEditor.CountWordsFast(minwordlength:Integer):Integer;
var s: string;
c: char;
pnow, plast,i,l,le:Integer;
begin
//erste Variante
(*
i:=0;
le:=Length(Text);
pnow:=1;
plast:=1;
if le > 0 then
for l:=1 to le do
begin
if Text[l]=' ' then
begin
plast:=pnow;
pnow:=l;
if (pnow-plast) > minwordlength then inc(i);
end;
end; {for}
*)
// zweite Variante
s:=Text;
i:=0;
pnow:=1;
if Length(s) > 0 then
while pnow > 0 do
begin
pnow:=Pos(' ',s);
if pnow >= minwordlength then inc(i);
Delete(s, 1,pnow);
end;
//Rest
CountWordsFast:=i;
end; {TEditor.CountWordsFast}
[edit=Daniel B]Delphi-Tags korrigiert. Mfg, Daniel B[/edit]