程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 具有自動查找Web頁面上所有鏈接的網絡浏覽器

具有自動查找Web頁面上所有鏈接的網絡浏覽器

編輯:Delphi
1. 概述
  WEB的應用已經深入到現在社會的方方面面,作為一個軟件開發人員或其他技術人員,都有可能遇見在Internet上查詢大量的資料和信息的情況,一般來說用的最多的就是WEB的搜索Engine。當我們使用它查出大量的資料鏈接後,還有可能遇到更多的鏈接,但要自己去看他們是否是鏈接,那確實是一件很麻煩的事情。這篇文章就是來講,如何用Delphi的MSHtml_TLB.pas來開發一個具有自動查找Web頁面上所有鏈接的簡單網絡浏覽器。我是在IE5的環境下寫的這個程序,當然它可以向下兼容,如IE4。
  2.關於MSHtml_TLB.pas
  MSHTML_TLB.pas是Deliphi裡面自帶的一個類。它的含義是Microsoft Html對象庫。它不能夠包含在所有的工程或程序中,原因是它實在是太大了,整個文件的代碼共有241,899l行,那麼長。大小約有12M。下面我們來看看它是如何加入到程序中的。
  1. 首先,我們打開Delphi,建立一個新的application。我把form1保存為MainFrm.pas,把application保存為FindLinks.dpr.
  2. 要想實現IE 的功能我們就必須要使用Microsoft HTML對象庫(MSHtml type library.)如何實現呢?如圖1, Project->Import Type Library:

  然後你會看到關於"Microsoft Html Object Library (Version 4.0)"的列表,如圖2。
  接下來可能會遇到一些問題。比如,在列表裡面沒有出現"Microsoft HTML Object Library (Version 4.0)"。這是為什麼呢?那是IE的問題,由於IE版本的不同(我用的是IE5)。我建議最好是先查詢你的計算機裡面有沒有msHtml.tlb這個文件。
  在9x裡面它是存在與C:WindowsSYSTEM目錄裡面,在2000裡面它在WINNTsystem32目錄裡面。如果找到了這個文件,就可以用圖2的click on the "Add..." button,然後選擇msHtml.tlb,就可以了,如果沒有找到它,那說明你沒有安裝IE或你的IE版本太低,請升級IE。
  最後,當我們選擇了倒入的庫後,會等待一段時間,因為它實在是太長了,不過請千萬不要因為是死機了。它會給自動查找提供很多幫助。
  3. 工程實現。
  界面設計如下圖:

  
  使用以下組件:
  控件 命名 TEXT
  TLabel lblURL 資料網址
  TEdit edtURL http://www.huihu.com
  TButton btnFindLinks 查詢連接
  TListBox lstbxLinks null

  4. 程序設計
  1. 在Form1的interface部分,在uses後面加入,OleCtrls, SHDocVw, and OleServer.這些所應用的類,都是基於我們所要創建的TinternetExplorer的,它是IE的ActiveX的對象。但是這裡還有其它的方式(TinternetExplorer)進行,我們采用TwebBrowser 控制在我們的form1。
  2. 我們在private裡面加入如下代碼:
  FInternetExplorer: TInternetExplorer;
  procedure WebBrowserDocumentComplete(Sender: TObject; var pDisp: OleVariant;
  var URL: OleVariant);     
  最後用Ctrl-Shift-C完成類的聲明。
  3. 在impelmentation後面加入如下聲明:
  uses MSHtml_TLB, ComObj;
  要使用的類。
  4. 在form1的OnCreate事件中加入如下:
       FInternetExplorer := TInternetExplorer.Create(Self);
    FInternetExplorer.OnDocumentComplete := WebBrowserDocumentComplete;
  5. 最後在form1的TForm1.WebBrowserDocumentComplete裡面加入如下代碼:
  1. procedure TForm1.WebBrowserDocumentComplete(Sender: TObject;
  2.     var pDisp: OleVariant; var URL: OleVariant);
  3. var
  4.   Doc: IHtmlDocument2;
  5.   ElementCollection: IHtmlElementCollection;
  6.   HtmlElement: IHtmlElement;
  7.   I: Integer;
  8.   AnchorString: string;
  9. begin
  10.   lstbxLinks.Clear;
  11.   // 在處理網頁的時候發現它沒有完全下載,將不會進行處理連接
  12.    Doc := FInternetExplorer.Document as IHtmlDocument2;
  13.   if Doc = nil then
  14.     raise Exception.Create('Couldn''t convert the ' +
  15.       'FInternetExplorer.Document to an IHtmlDocument2');
  16.   // 奪取web上的所有元素。
  17.   ElementCollection := Doc.all;
  18.   for I := 0 to ElementCollection.length - 1 do
  19.   begin
  20.     file://得到當前的元素
  21.     HtmlElement := ElementCollection.item(I, '') as IHtmlElement;
  22.     // 查找網頁原代碼中的LINK標記。
  23.     // 發現其它的Html標記 (例如: TABLE, FONT, etc.)
  24.     if HtmlElement.tagName = 'A' then
  25.     begin
  26.       // 在詳細的link裡面抓取innerText,innertext就是標記中<href=後面的東西>例如:

  27.       // 我們在web裡面看見"西南民族學院"
  28.       // <a href="http://www.swun.edu.cn"><b>西南民族學院</b></a>.
  29.           AnchorString := HtmlElement.innerText;
  30.       if AnchorString = '' then
  31.         AnchorString := '(Empty Name)';
  32.       AnchorString := AnchorString + ' -  ' +
  33.         (HtmlElement as IHtmlAnchorElement).href;
  34.       lstbxLinks.Items.Add(AnchorString);
  35.     end;
  36.   end;
  37. end;

     最後我們在button(btnFindLinks)加入Onclick 事件:
  1. // 在被浏覽的web裡面進行查詢連接。
  2.   FInternetExplorer.Navigate(edtURL.Text, EmptyParam, EmptyParam,
      EmptyParam, EmptyParam);
  從以上的程序裡面我們可以看出它的原理了,實際上是很簡單的,看過Html原代碼的人都知道,使網頁產生連接的代碼就是:<a href="http://www.swun.edu.cn"><b>西南民族學院</b></a>.
  我程序的原理就是通過截取href後面的字符串,並在"""號後面截止。
  然後把它保存為另外的字符串。然後通過TwebBrowser顯示出來。
  最後讓我們來編譯這個程序,的卻,編譯它很費時間,因為編譯多達241,899l行的MSHTML_TLB.pas,是一件很麻煩的事情。其中還包括多達20多個的warning錯誤,但請放心這是MSHtml_TLB.pas的問題,與其它程序無關。這樣一個小型的查找Web頁面上所有鏈接的簡單網絡浏覽器就出現在我們面前。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved