Thema: Delphi Zeichen in Memo finden

Einzelnen Beitrag anzeigen

Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Zeichen in Memo finden

  Alt 8. Apr 2006, 05:51
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]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat