praktich würde das ganze so aussehen (mit Verwendung von PosEx):
Delphi-Quellcode:
function GetPosNumX(const ASubStr, AFullStr: String; AFoundCnt: Word): Integer;
var LFoundCnt : Word;
LStartPos : Integer;
begin
if AFoundCnt = 0 then
result := 0
else begin
LStartPos := 1;
LStartPos := PosEx(ASubStr, AFullStr, LStartPos);
if (LStartPos > 0) then
begin
LFoundCnt := 1;
while (LFoundCnt < AFoundCnt) and (LStartPos > 0) do
begin
LStartPos := PosEx(ASubStr, AFullStr, LStartPos + 1);
inc(LFoundCnt);
end;
result := LStartPos;
end else
result := 0;
end;
end;
für ältere Versionen wo posex noch nicht verfügbar ist würde das so aussehen:
Delphi-Quellcode:
function GetPosNumX(const ASubStr, AFullStr: String; AFoundCnt: Word): Integer;
var LFoundCnt : Word;
LGiveback : Integer;
LMax,
LPos,
LSubLen : Integer;
LPtr1,
LPtr2 : Pointer;
begin
LGiveback := 0;
LFoundCnt := 0;
LSubLen := Length(ASubStr);
LMax := Length(AFullStr) - LSubLen + 1;
LPtr1 := PChar(AFullStr);
LPtr2 := PChar(ASubStr);
for LPos := 1 to LMax do
begin
if CompareMem(LPtr1, LPtr2, LSubLen) then
begin
inc(LFoundCnt);
if LFoundCnt = AFoundCnt then
begin
LGiveback := LPos;
Break;
end;
end;
inc(Cardinal(LPtr1));
end;
result := LGiveback;
end;
Diese Variante würde ich bevorzugen selbst wenn PosEx verfügbar ist da bei dieser Variante die Funktionsaufrufe (von PosEx) weg fallen und das ganze schneller sein müsste.
[Edit]Durch tests musste ich feststellen das die funktion mit PosEx schneller ist[/Edit]