在调整表单大小时,我们如何在WebBrowser中保持第一个显示的线路不变



delphi rio应用程序上有一个带有align = alclient的webbrowser1。WebBrowser的内容滚动,因此第一个显示的行不是WebBrowser内容的第一行。在调整表单大小的情况下,WebBrowser的第一个显示行更改,这给您带来了不便。在调整表单之前,我要获得第一个显示的htmlelement,并在调整大小完成后尝试将该元素滚动到视图中。但是调整大小时首先显示的行仍在更改。

FirstDisplayedElement1:IHTMLElement;
// is declared in private section of TFormText
procedure TFormText.FormCanResize(Sender: TObject; var 
  NewWidth, NewHeight: Integer; var Resize: Boolean);
begin
  Resize:=True;
  FirstDisplayedElement1 := 
    GetFirstDisplayedElement(WebBrowser1);
end;
Function  TFormText.GetFirstDisplayedElement(WebBr:TWebBrowser):IHTMLELEMENT;
var
  ChildElems :IHTMLElementCOLLECTION;
  Element:IHTMLElement;
  iHTMLDoc: IHtmlDocument2;
  Element2:IHTMLElement2;
  ElemRect:IHTMLRect;
  i:integer;
begin
  Result:=Nil;
  if Supports(WebBr.Document, IHtmlDocument2, iHTMLDoc) 
then
  begin
    ChildElems:=(WebBr.Document as IHTMLDocument2).all;
    for i := 0 to ChildElems.length - 1 do
    begin
      Element := ChildElems.item(i, varEmpty) as IHTMLElement;
      Element2 := ChildElems.item(i, varEmpty) as 
IHTMLElement2;
      ElemRect:=Element2.getBoundingClientRect;
      if ElemRect.Top > 0 then
      begin
        Result:=Element;
        Exit;
      end;
    end;
  end;
end;
procedure TFormText.FormResize(Sender: TObject);
begin
  if FirstDisplayedElement1<> NIL then 
  FirstDisplayedElement1.scrollIntoView(True);
end;

我们如何保持第一个显示的线路不变?

当调整大小事件发生时,将调用三次过程。ResizeStep变量用于调用GetFirstDisplayedElement(WebBrowser1(在FormCanResize首次执行时仅一次。所以这有效。

ResizeStep:Integer;
FirstDisplayedElement1:IHTMLElement;
// are declared in private section of TFormText
// and are set to 0 and Nil in FormCreate
procedure TFormText.FormCanResize(Sender: TObject; var NewWidth,
  NewHeight: Integer; var Resize: Boolean);
begin
  Resize:=True;
  if ResizeStep = 0 then
  begin
    inc(ResizeStep);
    FirstDisplayedElement1:=GetFirstDisplayedElement(WebBrowser1);
  end;
  if ResizeStep > 1 then ResizeStep := 0;
end;
procedure TFormText.FormResize(Sender: TObject);
begin
  inc(ResizeStep);
  if FirstDisplayedElement1<> NIL then FirstDisplayedElement1.scrollIntoView(True);
end;
Function TFormText.GetFirstDisplayedElement(WebBr:TWebBrowser):IHTMLELEMENT;
var
  ChildElems :IHTMLElementCOLLECTION;
  Element:IHTMLElement;
  i:integer;
begin
  Result:=Nil;
  if Supports(WebBr.Document, IHtmlDocument2, iHTMLDoc) then
  begin
    ChildElems:=(iHTMLDoc.body.children AS IHTMLElementCOLLECTION);
    for i := 0 to ChildElems.length - 1 do
    begin
      Element := ChildElems.item(i, varEmpty) as IHTMLElement;
      if ((Element.offsetTop +Element.offsetHeight) > ((IHTMLDoc.body AS HTMLBODY).scrolltop)) then
      begin
        Result:=Element;
        Exit;
      end;
    end;
  end;
end;

相关内容

最新更新