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;