用Delphi动态改变页面内容

使用TWebBrowser组件可以直接显示网页的内容, 因此在用delphi开发程序时,我们可以使用TWebBrowser来展示一些数据,获得更美观专业的效果,提高应用程序的挡次。
    通常的做法时,做一些静态的页面,TWebBrowser装载这些页面后,再通过delphi填写数据。故需要用到的技
术就是如何通过delphi读取或者控制TWebBrowser中内容。其实TWebBrowser就是一个ActiveX控件的封装,由此可以预见,对TWebBrowser的控制是非常简单的事情。
以下是获取页面元素及内容的代码:
//有关页面操作的变量定义全部在MsHtml中,别忘了uses MsHtml
var
  doc:IHTMLDocument2;     
  win:IHTMLWindow2;
  Dispatch:IDispatch;
  el:IHTMLElement;
begin
   doc2 := WBrowser.Document as IHTMLDocument2;  //获取页面的文档对象
   el := doc2.getElementById(‘zjgnpanel’);                          //通过ID获取页面元素
   label1Caption := el.innerHTML;                                       //这就是元素所包含的内容
   el.innerHTML := ‘元素的新内容’;                                       //这样就可以设置元素的新内容
   {不同页面元素有不同的属性和方法,这些知识可以参考其它文挡,或者直接阅读MsHtml中的代码
   例如,如果是Input元素,可以通过value属性获取或者设置它的值}

    //对于含有框架的页面稍微麻烦点   
   doc2 := WBrowser.Document as IHTMLDocument2; //获取页面总文档对象
   Dispatch := doc2.frames.item(‘leftFrame’);                   //通过名称获取框架接口
   Dispatch.QueryInterface(IhtmlWindow2,win2);            //获取框架的窗口对象
   doc3 := win2.Document as IHTMLDocument3;           //获取框架的文档对象
   el := doc2.getElementById(‘zjgnpanel’);                          //通过ID获取页面元素
    ……
  end;
以下是一个应用程序中,在页面的左边矿架中显示当前操作员最近几次使用的功能代码片段:
   ……
   doc2 := WBrowser.Document as IHTMLDocument2;
   Dispatch := doc2.frames.item(‘leftFrame’);
   Dispatch.QueryInterface(IhtmlWindow2,win2);
   doc3 := win2.Document as IHTMLDocument3;

   sHtml:=”;
   //下面的代码根据数据集的内容构造HTML文本
   while not cdsMenu.Eof do begin
    sHtml:=sHtml+
           ‘<div style="border:0px solid #5c77d7; margin:1px 1px 0px 1px; padding:2px 0px 0px 2px">’+
         ‘ <img align="absmiddle" src="i_drafts.gif">’+
           ‘  <a href="http://FUN’+cdsMenu.FieldByName(‘FUN_ID’).AsString+
           ‘" style="color:#dddddd;cursor:hand;font-size:12px;" onMouseOver="doMouseOver(this);"
            onMouseOut="doMouseOut(this);" onClick="">’+
           cdsMenu.FieldByName(‘FUN_NAME’).AsString+
          ‘</a></div>’;
    cdsMenu.Next;
   end;
   el := doc3.getElementById(‘zjgnpanel’);
   el.innerHTML := sHtml;    //把HTML文本设置到页面中显示
    ……
如果想通过点击页面的连接来打开程序的功能,需要响应TWebBrowser的OnBeforeNavigate2事件,
下面是示例:
procedure TMainForm.WBrowserBeforeNavigate2(Sender: TObject;
  const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData,
  Headers: OleVariant; var Cancel: WordBool);
var
  pURL:String;
  k,j:Integer;
begin
  pURL:=URL;
  //URL是点击链接后,TWebBrowser需要访问的下个地址,因此对于通过分析地址来决定调用那些功能
  pURL:=UpperCase(ExtractFileName(pURL));    
  pURL:=Trim(StringReplace(pURL,’/',’ ‘,[rfReplaceAll]));  //地址可能包含有//,把它替换掉

  k := Pos(‘FUN’,pURL);  //如果地址中包含特别的字符串,本例子中为FUN,表示是需要打开功能链接
  if k > 0 then
   begin
    Cancel:=True;   {Cancel设置为True,告诉TWebBrowser,此链接有特别用处,TWebBrowser不需要
                                  再去获取pURL页面}
     pURL:=Copy(pURL,k+3,Length(pURL)-k-2);   //去掉FUN,后面的内容就是功能标识
     CallHytEx(pURL,Handle);                                    //函数CallHytEx根据pURL打开不同的功能
   end;
end;

Written by gegewan on 十月 1st, 2008 with no comments.
Read more articles on Delphi.

No comments

There are still no comments on this article.

Leave your comment...

If you want to leave your comment on this article, simply fill out the next form:




You can use these XHTML tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> .