検索ダイアログ ボックスを含む Delphi フォームにリッチ エディットがあります。ユーザーが検索する単語を入力すると、プログラムは「検索された」単語を正しく強調表示します。これはうまく機能します。ただし、見つかった単語の最初の出現がリッチエディット ボックスの最初の行に表示されるように、プログラムをスクロールする必要があります。次にユーザーが「次へ」(検索ダイアログ ボックス) をクリックすると、スクロールが続行され、次に出現する単語が最初の行に表示されます。誰か助けてくれませんか?
procedure tform3.FindDialog1Find(Sender: TObject);
var
sText: string;
StartFrom, FoundPos: integer;
begin
{ If saved position is 0, this must be a "Find First" operation. }
if PreviousFoundPos = 0 then
{ Reset the frFindNext flag of the FindDialog }
findDialog1.Options := findDialog1.Options - [frFindNext];
if not (frFindNext in FindDialog1.Options) then begin // is it a Find "First" ?
sText := Richedit1.Text;
StartFrom := 1;
end
else begin // it's a Find "Next"
{ Calculate from where to start searching:
start AFTER the end of the last found position. }
StartFrom := PreviousFoundPos + Length(FindDialog1.Findtext);
{ Get text from the RichEdit, starting from StartFrom }
sText := Copy(Richedit1.Text, StartFrom, Length(Richedit1.Text) - StartFrom + 1);
end;
if frMatchCase in FindDialog1.Options then // case-sensitive search?
{ Search position of FindText in sText.
Note that function Pos() is case-sensitive. }
FoundPos := Pos(FindDialog1.FindText, sText)
else
{ Search position of FindText, converted to uppercase,
in sText, also converted to uppercase }
FoundPos := Pos(UpperCase(FindDialog1.FindText), UpperCase(sText));
if FoundPos > 0 then begin
{ If found, calculate position of FindText in the RichEdit }
PreviousFoundPos := FoundPos + StartFrom - 1;
{ Highlight the text that was found }
RichEdit1.SelStart := PreviousFoundPos - 1;
RichEdit1.SelLength := Length(FindDialog1.FindText);
RichEdit1.SetFocus;
end
else
ShowMessage('Could not find "' + FindDialog1.FindText + '"');
end;