Веб-браузер Delphi scrollIntoView (true) не работает

#delphi #scroll #twebbrowser

#delphi #прокрутка #twebbrowser

Вопрос:

Я пытаюсь найти текст в веб-браузере с Delphi 2010 и прокрутить его. Код находит текст и прокручивает его, но текст остается внизу webview (в последней строке). Я хотел бы показать текст в верхней (первой строке) webview.

Я думаю, что код для этого будет «scrollIntoView (true)», но это никак не влияет на то, что я пытаюсь сделать.

Что мне делать? Спасибо. Вот мой код

 procedure TForm1.SpeedButton10Click(Sender: TObject);
var
    doc: IHTMLDocument2;
    selection: IHTMLSelectionObject;
    textRange: IHtmlTxtRange;
    scrollpos: Integer;
    Art : string;
begin

Doc := WebBrowser1.Document as IHTMLDocument2;
Selection := Doc.Selection;
TextRange := selection.createRange as IHTMLTxtRange;

Art := edit2.Text;

TextRange.collapse(false);
if TextRange.findText(Art) then
begin
TextRange.select;
TextRange.scrollIntoView(true);

 end;
end;
 

Ответ №1:

Я тоже не мог приступить TextRange.scrollIntoView(True) к работе. Однако приведенный ниже код, похоже, работает для документа формата

Line1
Line2
Line3
Line4
Line5

Строка 100

при условии, что документ не прокручивается до точки, которая Line100 находится над нижней строкой в окне браузера. Он отлично работает, например, для поиска Line20 и размещения его в верхней части окна браузера.

Как вы можете видеть, он работает, получая IHTMLTextRangeMetrics интерфейс из TextRange и используя его offsetTop свойство для прокрутки doc2 родительского окна по вертикали.

Код:

 //  doc2 is a field of Form1 of type `IHTMLDocument2`
procedure TForm1.FindText(Text : String);
var
  selection: IHTMLSelectionObject;
  textRange: IHtmlTxtRange;
  scrollpos: Integer;
  Metrics : IHTMLTextRangeMetrics;
begin

  Selection := Doc2.Selection;
  TextRange := selection.createRange as IHTMLTxtRange;

  TextRange.collapse(false);
  if TextRange.findText(Text, 1, 0) then begin
    TextRange.select;
    TextRange.scrollIntoView(True);
    TextRange.QueryInterface(IHTMLTextRangeMetrics, Metrics);
    if Metrics <> Nil then
      doc2.parentWindow.scrollBy(0, Metrics.offsetTop);
  end;
end;
 

Комментарии:

1. Большое вам спасибо! Я не знаю почему, это работает только в том случае, если код выполняется дважды. Но это работает! Большое вам спасибо!