gpt4 book ai didi

delphi - 如何滚动到用户在查找对话框中输入的 'found' 单词

转载 作者:行者123 更新时间:2023-12-03 15:51:42 25 4
gpt4 key购买 nike

我对 delphi 表单进行了丰富的编辑,其中包括一个查找对话框。用户输入要查找的单词,程序会正确突出显示“找到”的单词 - 这样就很好了。然而,我想要的是程序滚动,以便找到的单词的第一次出现出现在 richedit 框中的第一行。如果用户随后单击“下一步”(查找对话框),则滚动将继续,以便该单词的下一个出现位置出现在第一行,依此类推。有人可以帮我吗?

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;

最佳答案

您可以使用以下代码滚动到 TRichEdit 控件中的光标位置:

RichEdit1.SelStart := PreviousFoundPos - 1;
RichEdit1.SelLength := Length(FindDialog1.FindText);
RichEdit1.SetFocus;

// Now scroll to the current cursor position
RichEdit1.Perform(EM_SCROLLCARET, 0, 0);

这会将 Windows 消息 EM_SCROLLCARET 发送到控件,这将使控件滚动到当前光标位置。

关于delphi - 如何滚动到用户在查找对话框中输入的 'found' 单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36392987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com