На главную
Подписка
Новости


Рейтинг@Mail.ru











Главная / DELPHI / Часто задаваемые вопросы и ответы на них / Редакторы текста, отчеты / Как найти далее при помощи pos? (аналог найти далее в блокноте windows-а) Сделать домашней страницей Добавить в избранное Написать писмо

Как найти далее при помощи pos? (аналог найти далее в блокноте windows-а)



function SearchString(const FindStr, SourceString: String;Num: Integer):Integer;
var
FirstP: PChar;
function MyPos(const FindStr, SourceString: PChar;Num: Integer): PChar;
begin
Result := AnsiStrPos(SourceString,FindStr);
if (Result=nil) then Exit;
Inc(Result);
if Num=1 then Exit;
if num>1 then Result := MyPos(FindStr,Result,num-1);
end;
begin  Result := 0;
FirstP := PChar(SourceString);
Result := MyPos(PChar(FindStr),PChar(SourceString),Num) - FirstP;
if Result<0 then Result := 0;
end;

function NextSubStr(Const SubStr,Str : String; PrevIdx : Integer):Integer;
begin
if (PrevIdx<=Length(Str)) and (PrevIdx>0)
then
 Result := pos(SubStr,PChar(@Str[PrevIdx]))+PrevIdx-1
else
 Result := 0;
end;
Var k : Integer;
begin
k :=NextSubStr('a','abcabcabc',1);
Label1.Caption:=IntToStr(k); // Выводим позицию первого вхождения строки 'a'
k :=NextSubStr('a','abcabcabc',k+1);
Label2.Caption:=IntToStr(k); // Выводим позицию следующего вхождения строки 'a'
end;

function fStrPos(const Line, Sample: string; FromPos, ToPos: integer): integer;
var
stLen, samLen: integer;
StopIndex: integer;
StopChar, ch: char;
SuffixStr, RevertSample: string;
SuffixLen: integer;
i, incr: integer;
begin
Result := 0;
//checks
SamLen := length(Sample);
if SamLen = 0 then exit;
if FromPos <= 0 then FromPos := 1;
stLen := length(Line);
if (ToPos < stLen) and (toPos >= FromPos) then
  stLen := toPos;
//Переворачиваем Sample - удобно для Pos
SetLength(RevertSample, SamLen);
for i := 1 to SamLen do
  RevertSample[SamLen - i + 1] := Sample[i];
//Пока не дошли до конца участка минус длина образца...
while FromPos <= (stLen - samLen + 1) do
begin
  //сравниваем образец СПРАВА НАЛЕВО
  StopIndex := 0;
  for i := samLen downTo 1 do
    if Sample[i] <> Line[i + FromPos - 1] then
    begin
      //На чем запнулись
      StopIndex := i;
      StopChar := Line[i + FromPos - 1];
      SuffixStr := copy(Sample, i+1, samLen - i);
      SuffixLen := length(SuffixStr);
      Break;
    end;
   //Проверка совпадения
   if StopIndex = 0 then
   begin
     Result := FromPos;
     Exit;
   end;
   //Переворачиваем суффикс
   for i := 1 to (SuffixLen div 2) do
   begin
     ch := suffixstr[SuffixLen - i + 1];
     suffixstr[SuffixLen - i + 1] := suffixStr[i];
     suffixstr[i] := ch;
   end;
   //Приращение по суффиксу - следующее вхождение
   incr := Pos(SuffixStr, copy(RevertSample,SuffixLen + 1,SamLen));
   //Приращение по стоп-символу:
   for i := StopIndex - 1 downTo 1 do
     if Sample[i] = StopChar then
     begin
       if incr < (SamLen - i) then
         incr := SamLen - i;
       break;
     end;
   if incr = 0 then incr := samLen;
   inc(FromPos, incr);
end;
end;

Copyright ©   "Мастера DELPHI"   E-mail:   delphi@mastak.com  http://www.delphimaster.ru
Источник получения информации: http://www.delphimaster.ru
Hosted by uCoz