Delphi 在调整窗体大小时,如何保持webbrowser中第一行显示的内容不变?

Delphi 在调整窗体大小时,如何保持webbrowser中第一行显示的内容不变?,delphi,resize,twebbrowser,Delphi,Resize,Twebbrowser,Delphi RIO应用程序表单上有一个带有Align=alClient的Webbrowser1。Webbrowser的内容被滚动,因此显示的第一行不是Webbrowser内容的第一行。在这种情况下,当调整表单大小时,webbrowser的第一行显示会发生更改,这会带来不便。 我将在调整表单大小之前获取第一个显示的htmlelement,并在调整大小完成后尝试将该元素滚动到视图中。 但调整大小时,第一行显示的内容仍在更改 FirstDisplayedElement1:IHTMLElement;

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;
FirstDisplayedElement1:IHTMlement;
//在TFormText的private部分中声明
过程TFormText.FormCanResize(发送方:ToObject;变量
新宽度、新高度:整数;变量大小:布尔值);
开始
调整大小:=真;
FirstDisplayedElement1:=
GetFirstDisplayedElement(WebBrowser1);
结束;
函数TFormText.GetFirstDisplayedElement(WebBr:TWebBrowser):IHTMLELEMENT;
变量
子元素:IHTMlementCollection;
要素:IHTMlement;
iHTMLDoc:IHtmlDocument2;
要素2:IHTMlement2;
元素:IHTMLRect;
i:整数;
开始
结果:=无;
如果支持(WebBr.Document、IHtmlDocument2、iHTMLDoc)
然后
开始
ChildElems:=(WebBr.Document作为IHTMLDocument2)。全部;
对于i:=0到ChildElems.length-1 do
开始
元素:=ChildElems.item(i,varEmpty)作为IHTMlement;
Element2:=ChildElems.item(i,varEmpty)as
IHTMlement2;
ElemRect:=Element2.getBoundingClientRect;
如果ElemRect.Top>0,则
开始
结果:=元素;
出口
结束;
结束;
结束;
结束;
过程TFormText.FormResize(发送方:TObject);
开始
如果FirstDisplayedElement1为零,则
FirstDisplayedElement1.scrollIntoView(True);
结束;

如何保持第一行显示不变

当resize事件发生时,将调用三次过程FormCanResize。ResizeStep变量用于在FormCanResize首次执行时仅调用一次GetFirstDisplayedElement(WebBrowser1)。 所以这是可行的

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;
ResizeStep:整数;
第一个显示元素1:IHTMlement;
//在TFormText的private部分中声明
//和在FormCreate中设置为0和零
过程TFormText.FormCanResize(发送方:TObject;var NewWidth,
NewHeight:Integer;var Resize:Boolean);
开始
调整大小:=真;
如果ResizeStep=0,则
开始
公司(ResizeStep);
FirstDisplayedElement1:=GetFirstDisplayedElement(WebBrowser1);
结束;
如果ResizeStep>1,则ResizeStep:=0;
结束;
过程TFormText.FormResize(发送方:TObject);
开始
公司(ResizeStep);
如果FirstDisplayedElement1为零,则FirstDisplayedElement1.scrollIntoView(True);
结束;
函数TFormText.GetFirstDisplayedElement(WebBr:TWebBrowser):IHTMLELEMENT;
变量
子元素:IHTMlementCollection;
要素:IHTMlement;
i:整数;
开始
结果:=无;
如果支持(WebBr.Document、IHtmlDocument2、iHTMLDoc),则
开始
ChildElems:=(iHTMLDoc.body.children作为IHTMLElementCOLLECTION);
对于i:=0到ChildElems.length-1 do
开始
元素:=ChildElems.item(i,varEmpty)作为IHTMlement;
如果((Element.offsetTop+Element.offsetHeight)>((IHTMLDoc.body作为HTMLBODY.scrolltop))那么
开始
结果:=元素;
出口
结束;
结束;
结束;
结束;

我做了一个快速测试(虽然不是使用Rio,而是使用XE7),但我无法重现我所理解的您的问题所在。我加载了一个大页面(这个页面),向下滚动了一些页面,然后开始调整表单的大小。无论我使用窗体的哪一侧来调整大小,顶部可见线始终固定在浏览器顶部。使用此页面的多个滚动位置进行测试。请提供如何复制的说明。我会要求您将项目发送到delphi rio上进行测试。我的邮件:avrob@mail.ruI不要这样认为,让我们先尝试商定合适的测试页面是什么。正如我所说的,我用这个页面进行了测试。这个页面在您的案例中是如何显示的,您是否可能更改浏览器中的任何设置?我还测试了这个页面。在一些错误之后,页面被下载了,你是对的-第一行保持不变。我将要求你用非常简单的html测试它-只包含p标记。我可以发送给你这样的文件-第一行是改变表单大小。