其实很早就想做个这样的东西了,一直没有机会,确切的说,一直没有足够的动力。这次总算能够如愿以偿了,原因很简单,自己早些时候做的另外一个系统由于经常需要做修改,时间一长就烦了,于是决定不管怎么样也要写个在线更新的程序出来。。。。
最初的设想是做一个与 Symantec LiveUpdate 类似的东东,但是后来发现这么多下一步涉及到界面上的很多东西,比较烦人,所以就做成现在这样了,个人感觉清清爽爽也挺好的:)
细说起来,其实这个程序很简单,简单到只要使用一个Delphi7提供的现成的控件(Indy->TIdHTTP)就可以了,所有诸如与网站连接,下载一个文件等等它都已经帮你实现了,你所要做的是:
1。在网站上放一个升级用的配置文件(如INI),里面包含需要更新的文件/参数等,还有就是升级文件本身了
2。下载配置文件,分析其内容,确定需要下载的文件名称,文件大小(用于下载进度控制),是否需要注册(如OCX控件),是否被压缩过(如果文件太大)等任何你感兴趣的内容。。。
3。下载。。。。
4。将下载的文件覆盖掉需要更新的文件
5。善后工作,可能需要清除下载的文件,如果你把他们放在系统临时文件夹的话,就不需要了
如果你以前从来都没用过Indy组件,那么唯一的难点就是如何在使用 TIdHTTP 时能显示下载进度,此时应该使用 TIdHTTP 的 OnWork, OnWorkBegin, OnWorkEnd 三个事件,参考代码如下:
procedure TForm1.HTTPWorkBegin(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCountMax: Integer);
begin
ProgressBar1.Position := 0;
ProgressBar1.Max := AWorkcountMax;
if AWorkCountMax > 0 then
StatusBar1.Panels[1].Text := 'Transfering: ' + IntToStr(AWorkCountMax);
end;
procedure TForm1.HTTPWorkEnd(Sender: TObject; AWorkMode: TWorkMode);
begin
StatusBar1.Panels[1].Text := 'Done';
ProgressBar1.Position := 0;
end;
procedure TForm1.HTTPWork(Sender: TObject; AWorkMode: TWorkMode;
const AWorkCount: Integer);
begin
if ProgressBar1.Max > 0 then
begin
StatusBar1.Panels[1].Text := IntToStr(AWorkCount) + ' bytes of ' +
IntToStr(ProgressBar1.Max) + ' bytes.';
ProgressBar1.Position := AWorkCount;
end
else
StatusBar1.Panels[1].Text := IntToStr(AworkCount) + ' bytes.';
end;
做完这一切后,你会发现无论如何你的进度条就是没反应,呵呵,这不是你的问题,原因在于你必须手动将这三个函数指定给你的 TIdHTTP 变量:
http.OnWork := idWork;
http.OnWorkBegin := idWorkBegin;
http.OnWorkEnd := idWorkEnd;
好了,欣赏一下自己的杰作吧。。。