見てのとおり、前を検索は厳密にはなく、次を検索を重ねているに過ぎません
先頭から初めて検索する範囲の中で最後に見つかったものが結果になります
RichEdit1.HideSelection := False; にしないとスクロールしないことがあります
procedure FindDialog1Find(Sender: TObject);
procedure Find1Click(Sender: TObject);
procedure FindNextButtonClick(Sender: TObject);
procedure FindBackButtonClick(Sender: TObject);
function MyFindBackText(RichEdit: TRichEdit;const fs: String; StartPos,
SearchLength: Integer; Options: TSearchTypes): Integer;
var
FoundAt, ffAt: LongInt;
fStartPos, fToEnd: integer;
begin
ffAt := 0;
if RichEdit.FindText(fs,StartPos,SearchLength,Options)=-1 then
begin
Result := -1;
exit;
end;
with RichEdit do
begin
fStartPos := StartPos;
{ ToEnd は検索範囲の文字数を示します }
fToEnd := SearchLength- fStartPos;
FoundAt := FindText(fs, fStartPos, fToEnd, Options);
While FoundAt <> -1 do
begin
ffAt := FoundAt;
fToEnd := SearchLength - fStartPos;
FoundAt := FindText(fs, fStartPos, fToEnd, Options);
SetFocus;
SelStart := FoundAt;
SelLength := Length(fs);
fStartPos := FoundAt + Length(fs);
if fToEnd<0 then
begin
ShowMessage('ありません');
Break;
end;
end;
Result := ffAt;
end;
end;
procedure TForm1.Find1Click(Sender: TObject);
begin
if RichEdit1.SelLength <> 0 then
begin
FindDialog1.FindText := RichEdit1.SelText;
end;
FindDialog1.Execute;
end;
procedure TForm1.FindDialog1Find(Sender: TObject);
var
FoundAt: LongInt;
StartPos, ToEnd: integer;
begin
with RichEdit1 do
begin
with Sender as TFindDialog do
begin
if frDown in Options then
begin
if SelLength <> 0 then
StartPos := SelStart + SelLength
else
StartPos := 0;
{ ToEnd は検索範囲の文字数を示します }
ToEnd := Length(Text) - StartPos;
FoundAt := RichEdit1.FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
end
else
begin
StartPos := 0;
ToEnd := SelStart;
Lines.BeginUpdate;
FoundAt := MyFindBackText(RichEdit1,FindDialog1.FindText, StartPos,ToEnd, [stMatchCase]);
Lines.EndUpdate;
end;
end;
if FoundAt <> -1 then
begin
SetFocus;
SelStart := FoundAt;
SelLength := Length(FindDialog1.FindText);
end
else
begin
//ShowMessage('もうありません');
MessageBeep(MB_OK);
Exit;
end;
end;
end;
procedure TForm1.FindNextButtonClick(Sender: TObject);
var
FoundAt: LongInt;
StartPos, ToEnd: integer;
begin
with RichEdit1 do
begin
if SelLength <> 0 then
StartPos := SelStart + SelLength
else
StartPos := 0;
ToEnd := Length(Text) - StartPos;
FoundAt := FindText(FindDialog1.FindText, StartPos, ToEnd, [stMatchCase]);
if FoundAt <> -1 then
begin
//なくても良い
//SendMessage(RichEdit1.Handle,EM_SCROLLCARET,0,0);
SetFocus;
SelStart := FoundAt;
SelLength := Length(FindDialog1.FindText);
end
else
begin
//ShowMessage('もうありません');
MessageBeep(MB_OK);
Exit;
end;
end;
end;
procedure TForm1.FindBackButtonClick(Sender: TObject);
var
FoundAt: LongInt;
StartPos, ToEnd: integer;
begin
with RichEdit1 do
begin
StartPos := 0;
ToEnd := SelStart;
Lines.BeginUpdate;
FoundAt := MyFindBackText(RichEdit1,FindDialog1.FindText, StartPos,ToEnd, [stMatchCase]);
Lines.EndUpdate;
if FoundAt <> -1 then
begin
SetFocus;
SelStart := FoundAt;
SelLength := Length(FindDialog1.FindText);
end
else
begin
//ShowMessage('もうありません');
MessageBeep(MB_OK);
Exit;
end;
end;
end;
|