现在我知道的有两种方法,一种是使用Internet族函数来进行读写。
方法一:
unit Read;
interface
uses
Classes,Wininet,Windows,Messages,SysUtils,Forms;
type
TReadUrlFile = class(TThread)
private
{ Private declarations }
strRead:string;
procedure WriteToMemo;
protected
procedure Execute; override;
public
UrlName:String;
end;
implementation
uses ligwin2;
procedure TReadUrlFile.Execute;
label
lab;
var
hHttpSession, hReqUrl:HInternet;
Buffer:array [0..65536] of Char;
nRead
WORD;
begin
strRead:='';
hHttpSession:=InternetOpen('FindWeb',0,nil,nil,0);
try
hReqUrl:=InternetOpenURL(hHttpSession,PChar(UrlName),nil,0,0,0);
if hReqUrl=nil then
begin
InternetCloseHandle(hHttpSession);
MessageBox(0,'查找主机时出错!','提示信息',MB_OK+MB_ICONERROR);
exit;
end;
try
lab:
InternetReadFile(hReqUrl,@Buffer,65536,nRead);
if nRead=65536 then
begin
strRead:=strRead+string(Buffer);
goto lab;
end
else
begin
Buffer[65535]:=Char(0);
strRead:=strRead+string(Buffer);
end;
Application.ProcessMessages;
finally
InternetCloseHandle(hReqUrl);
end;
finally
InternetCloseHandle(hHttpSession);
end;
if strRead<>'' then
Synchronize(WriteToMemo);
end;
procedure TReadUrlFile.WriteToMemo;
begin
Form1.Memo1.Lines.Text:=strRead;
end;
end.
以上是一个线程,之所以把其写成一个线程是为了防止从Internet上读取HTML源码时造成的程序无法响应界面更新和用户输入(像DOWNLOAD掉了一下)。
使用时方法如下:
procedure TForm1.Button1Click(Sender: TObject);
var
ReadUrlFile:TReadUrlFile;
begin
if Edit1.Text='' then
begin
MessageBox(Handle,'请您输入一个网址!','提示信息',MB_OK+MB_ICONERROR);
exit;
end;
ReadUrlFile:=TReadUrlFile.Create(true);
ReadUrlFile.FreeOnTerminate:=true;
ReadUrlFile.UrlName:=Edit1.Text;
ReadUrlFile.Resume;
end;
方法二:
著名的ICS组件包中有一个HTTP组件,使用其可以同样实现在INTERNET上读取HTML源
码的功能,它所使用的是WINSOCK的方法,有具体的例子可以参考。但是具体原理我
还尚待研究。
以上两种方法仅供参考。如果您有更好的办法也欢迎您拿出来与大家共享。