📄 unit_main.pas
字号:
unit Unit_main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, Gauges, Buttons,inifiles, Psock, NMHttp,shellapi,
ImgList, ComCtrls, Registry, XMLDoc,XMLIntf, xmldom, msxmldom,
WinSkinData;
type
TForm_Update = class(TForm)
Image1: TImage;
Notebook_step: TNotebook;
Label1: TLabel;
ListBox_servers: TListBox;
Gauge_process: TGauge;
btn_next: TButton;
HTTPFiles: TNMHTTP;
ListView_files: TListView;
ImageList: TImageList;
Memo1: TMemo;
Bevel1: TBevel;
Label2: TLabel;
edt_url: TEdit;
Button1: TButton;
lblDisplay: TLabel;
XMLDocument: TXMLDocument;
procedure FormCreate(Sender: TObject);
procedure btn_nextClick(Sender: TObject);
procedure Notebook_stepPageChanged(Sender: TObject);
procedure ListBox_serversClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure HTTPFilesPacketRecvd(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure Button1Click(Sender: TObject);
private
g_path:string;
AppIni: TIniFile;
ProgramList,BmpList,HttpFileList:TStrings;//分别代表程序更新列表、图片更新列表、资料根新列表
HttpFilesNewVer:String;//资料包的更新版本
ProgramNewVer:String;//升级包的更新版本
function ExistNewFile:boolean;
public
{ Public declarations }
noConnected:Boolean;
procedure DeleteRunProgram(FileName:string);//程序自杀
//解析XML格式的升级信息文件
function XMLParse(UpdateFile:String; var ProgramFileList,BmpFileList,HttpFileList:TStrings):boolean;
end;
var
Form_Update: TForm_Update;
implementation
{$R *.dfm}
procedure TForm_Update.FormCreate(Sender: TObject);
var
servers:TStrings;
i:integer;
begin
//theMainClassName:='The Amysoft For Personal';
noconnected:=False;
Notebook_step.PageIndex:=0;
ListBox_servers.Items.Clear;
ProgramList:=TStringList.Create;
BmpList:=TStringList.Create;
HTTPFileList:=TStringList.Create;
try
g_path:=ExtractFilePath(application.ExeName);
if copy(g_path,length(g_path),1)<>'\' then g_path:=g_path+'\';
AppIni := TIniFile.Create(g_path+'Update.ini');
servers:=TStringList.Create;
AppIni.ReadSectionValues('update',servers);
for i:=0 to servers.Count-1 do
begin
ListBox_servers.Items.Add(copy(servers[i],1,pos('=',servers[i])-1));
if i=0 then edt_url.Text:=copy(servers[i],pos('=',servers[i])+1,length(servers[i]));
end;
if Servers.Count <=0 then
edt_url.Text:='http://www.yanyusoft.com/SoftUpdate/Amysoft/';
finally
AppIni.Free;
end;
end;
procedure TForm_Update.btn_nextClick(Sender: TObject);
var
i:Integer;
Flist:TListItem;
strFile,strExtendFile:String; //文件扩展名
VerReg:TRegistry;
HwndHelp:Hwnd;
begin
if btn_next.Caption='退出升级' then
begin
Application.Terminate;
exit;
end;
if btn_next.Caption='完成升级' then
begin
btn_next.Enabled:=false;
btn_next.Caption:='复制新文件..';
//复制程序文件
if ProgramList.Count >0 then
begin
for i:=0 to ProgramList.Count-1 do //复制文件更新
begin
//备份一份文件出来
//copyfile(pchar(g_path+ProgramList.Strings[i]),pchar(g_path+ProgramList.Strings[i]+'.bak'),false);
//判断是否是EXE程序
strExtendFile:=ExtractFileExt(g_path+ProgramList.Strings[i]);
strExtendFile:=copy(strExtendFile,2,Length(strExtendFile)-1);
if UpperCase(strExtendFile)='EXE' then
begin
strFile:=ChangeFileExt(g_path+ProgramList.Strings[i],'.old'); //存在旧的文件则删除
if FileExists(strFile) then
Deletefile(strFile);
RenameFile(g_path+ProgramList.Strings[i],strFile);//更改执行文件名
end
//判断是否为system.dat文件
else if UpperCase(strExtendFile)='DAT' then
begin
strFile:=ChangeFileExt(g_path+ProgramList.Strings[i],'.old'); //存在旧的文件则删除
if FileExists(strFile) then
Deletefile(strFile);
RenameFile(g_path+ProgramList.Strings[i],strFile);//更改系统数据库文件名
end
//判断是否为.chm文件
else if UpperCase(strExtendFile)='CHM' then
begin
HWndHelp := FindWindow(nil,'安利销售助手帮助');
if HWndHelp<>0 then
SendMessage(HWndHelp, WM_CLOSE, 0, 0);
strFile:=ChangeFileExt(g_path+ProgramList.Strings[i],'.old'); //存在旧的文件则删除
if FileExists(strFile) then
Deletefile(strFile);
RenameFile(g_path+ProgramList.Strings[i],strFile);//更改帮助文件名
end;
end;
//从update复制新文件
for i:=0 to ProgramList.Count-1 do
begin
if ProgramList.Strings[i]<>'System.dat' then
begin
CopyFile(pchar(g_path+'update\'+ProgramList.Strings[i]),pchar(g_path+ProgramList.Strings[i]),false);
DeleteFile(pchar(g_path + 'update\' + ProgramList.Strings[i]));
end;
end;
end;
//复制资料文件
if HttpFileList.Count >0 then
begin
for i:=0 to HttpFileList.Count-1 do
begin
CopyFile(pchar(g_path+'update\'+HttpFileList.Strings[i]),pchar(g_path+'Files\'+HttpFileList.Strings[i]),false);
DeleteFile(pchar(g_path + 'update\' + HttpFileList.Strings[i]));
end;
end;
//复制图片文件
if BmpList.Count >0 then
begin
for i:=0 to BmpList.Count-1 do
begin
CopyFile(pchar(g_path+'update\'+BmpList.Strings[i]),pchar(g_path+'Bmps\'+BmpList.Strings[i]),false);
DeleteFile(pchar(g_path + 'update\' + BmpList.Strings[i]));
end;
end;
//删除update/AmyUpdate.xml文件
DeleteFile(pchar(g_path + 'update\AmyUpdate.xml'));
//升级成功更新信息
Notebook_step.PageIndex:=2;
Memo1.Lines.Add(#13#10+'感谢使用在线升级!'+#13#10);
Memo1.Lines.add('升级成功!'+#13#10);
Memo1.Lines.add('最新版本:主程序 V'+ProgramNewVer+',资料库 V'+HttpFilesNewVer+#13#10);
Memo1.Lines.add('请重新打开软件!'+#13#10);
//更改注册表,写入最新版本号
try
VerReg:=TRegistry.Create;
VerReg.RootKey:=HKEY_LOCAL_MACHINE;
VerReg.OpenKey('Software\AmySoft\Ver', true);
VerReg.DeleteValue('ProgramVer');
VerReg.DeleteValue('HTTPFileVer');
VerReg.WriteString('ProgramVer',ProgramNewVer);
VerReg.WriteString('HTTPFileVer',HTTPFilesNewVer);
finally
VerReg.Free;
end;
btn_Next.Visible :=false;
exit;
end;
//取得升级信息
Notebook_step.PageIndex:=Notebook_step.PageIndex+1;
Gauge_process.MaxValue:=100;
Gauge_process.Progress:=0;
ListView_files.Items.Clear;
Flist:=ListView_files.Items.Add;
Flist.Caption:='正在获取更新列表...';
Flist.StateIndex:=0;
Flist.ImageIndex:=0;
//开始下载文件
if ExistNewFile then
begin
btn_next.Enabled:=false;
btn_next.Caption:='下载中...';
//更新程序
if ProgramList.Count >0 then
begin
ListView_files.Items.Clear;
Gauge_process.Progress:=0;
for i:=0 to ProgramList.Count-1 do
begin
Flist:=ListView_files.Items.Add;
Flist.Caption:=ProgramList.Strings[i];
Flist.StateIndex:=-1;
Flist.ImageIndex:=-1;
end;
//下载升级文件
btn_next.Enabled:=false;
lblDisplay.Caption:='正在下载最新程序...';
//下载程序更新文件
for i:=0 to ProgramList.Count-1 do
try
Gauge_process.MaxValue:=2000;
Gauge_process.Progress:=1;
ListView_files.Items[i].StateIndex:=0;
ListView_files.Items[i].ImageIndex:=0;
try
HTTPFiles.InputFileMode := true;
HTTPFiles.OutputFileMode := FALSE;
HTTPFiles.ReportLevel := Status_Basic;
HTTPFiles.Body:=g_path+'update/'+ProgramList.Strings[i];
HTTPFiles.Get(Edt_url.Text+ProgramList.Strings[i]);
except
//下载文件失败
ListView_files.Items[i].StateIndex:=2;
ListView_files.Items[i].ImageIndex:=2;
end;
ListView_files.Items[i].StateIndex:=1;
ListView_files.Items[i].ImageIndex:=1;
except
end;
end;
//下载图片更新文件
if BmpList.Count >0 then
begin
ListView_files.Items.Clear;
Gauge_process.Progress:=0;
for i:=0 to BmpList.Count-1 do
begin
Flist:=ListView_files.Items.Add;
Flist.Caption:=BmpList.Strings[i];
Flist.StateIndex:=-1;
Flist.ImageIndex:=-1;
end;
//下载升级文件
lblDisplay.Caption:='正在下载最新图片...';
//下载程序更新文件
for i:=0 to BmpList.Count-1 do
try
Gauge_process.MaxValue:=2000;
Gauge_process.Progress:=1;
ListView_files.Items[i].StateIndex:=0;
ListView_files.Items[i].ImageIndex:=0;
try
HTTPFiles.InputFileMode := true;
HTTPFiles.OutputFileMode := FALSE;
HTTPFiles.ReportLevel := Status_Basic;
HTTPFiles.Body:=g_path+'update/'+BmpList.Strings[i];
HTTPFiles.Get(Edt_url.Text+BmpList.Strings[i]);
except
//下载文件失败
ListView_files.Items[i].StateIndex:=2;
ListView_files.Items[i].ImageIndex:=2;
end;
ListView_files.Items[i].StateIndex:=1;
ListView_files.Items[i].ImageIndex:=1;
except
end;
end;
//更新资料文件
if HTTPFileList.Count >0 then
begin
ListView_files.Items.Clear;
Gauge_process.Progress:=0;
for i:=0 to HTTPFileList.Count-1 do
begin
Flist:=ListView_files.Items.Add;
Flist.Caption:=HTTPFileList.Strings[i];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -