用Delphi編寫的一個程序自動升級功能的代碼,就叫它“升級精靈”吧,本文會教大家做一個簡單的升級精靈程序,只要連接到互聯網,就能通過對比程序日期列出需要升級的文件列表,根據需要下載升級文件,讓程序的升級操作變得簡單。看看運行截圖:
編寫思路:在存放升級信息的服務器上放一個包含升級文件列表及信息的文件,利用TIdHTTP的GET過程下載這個信息文件,再分析裡面的內容,對比本地的信息文件列出需要升級的文件列表,最後根據信息列表的下載地址下載相關文件。完整代碼如下:
001
unit
Unit1;
002
interface
003
uses
004
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
005
Dialogs, IDBaseComponent, IdComponent, IdTCPConnection, IdTCPClIEnt,
006
IdHTTP, StdCtrls, ComCtrls, CheckLst, IniFiles;
007
type
008
TForm1 =
class
(TForm)
009
IdHTTP1: TIdHTTP;
010
Button1: TButton;
011
Button2: TButton;
012
Button3: TButton;
013
ProgressBar1: TProgressBar;
014
ProgressBar2: TProgressBar;
015
Label1: TLabel;
016
Label2: TLabel;
017
Label3: TLabel;
018
StatusBar1: TStatusBar;
019
ListView1: TListVIEw;
020
procedure
IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
021
const
AWorkCount:
Integer
);
022
IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
023
AWorkCountMax:
024
Button1Click(Sender: TObject);
025
IdHTTP1WorkEnd(Sender: TObject; AWorkMode: TWorkMode);
026
Button3Click(Sender: TObject);
027
Button2Click(Sender: TObject);
028
private
029
function
DownLoadFile(sURL, sFName:
string
):
boolean
;
030
{ Private declarations }
031
public
032
{ Public declarations }
033
end
034
var
035
Form1: TForm1;
036
implementation
037
{$R *.dfm}
038
AppPath:
039
begin
040
Result := ExtractFilePath(ParamStr(
0
));
041
042
TForm1
.
043
//下載文件
044
tStream: TMemoryStream;
045
046
tStream := TMemoryStream
Create;
047
try
//防止不可預料錯誤發生
048
049
IdHTTP1
Get(sURL, tStream);
//保存到內存流
050
tStream
SaveToFile(sFName);
//保存為文件
051
Result :=
True
052
finally
//即使發生不可預料的錯誤也可以釋放資源
053
Free;
054
055
except
//真的發生錯誤執行的代碼
056
False
057
058
059
060
061
062
063
ProgressBar1
Position := AWorkCount;
064
Application
ProcessMessages;
065
066
067
068
069
Max := AWorkCountMax;
070
Position :=
071
072
073
074
075
076
077
078
sChkURL =
'http://www.xxx.com/update.ini'
079
// sChkURL = 'http://localhost/update.ini';
080
081
NewFile, OrgFile: TIniFile;
082
SectionList: TStrings;
083
aFile:
084
aDate, bDate: TDate;
085
i:
086
ListItem: TListItem;
087
088
StatusBar1
SimpleText :=
'檢測升級文件...'
089
Button1
Enabled :=
090
if
not
DownLoadFile(sChkURL, AppPath +
'tmp.ini'
)
then
091
092
'檢測升級文件失敗!'
093
094
Exit;
095
096
'分析升級文件...'
097
ListVIEw1
Clear;
098
NewFile := TIniFile
Create(AppPath +
099
OrgFile := TIniFile
'update.ini'
100
101
SectionList := TStringList
102
103
//讀取升級文件列表
104
NewFile
ReadSections(SectionList);
105
for
i :=
to
SectionList
Count -
1
do
106
107
//讀取升級文件的文件名
108
aFile := NewFile
ReadString(SectionList
Strings[i],
'Name'
,
''
109
//讀取升級文件的日期
110
bDate := NewFile
ReadDate(SectionList
'Date'
, Date);
111
//替換文件名的"."符號為"_",防止ini文件讀取錯誤,得到的文件名用來讀取本地升級信息
112
aFile := StringReplace(aFile,
'.'
'_'
, [rfReplaceAll]);
113
//讀取本地升級文件的日期
114
aDate := OrgFile
ReadDate(aFile,
1999
-
115
//如果以前沒有這個文件,那麼這個文件一定需要更新的,將日期缺省為1999-1-1,只要小於升級程序日期即可
116
bDate > aDate
//對比日期確定是否需要升級
117
118
ListItem := ListVIEw1
Items
Add;
119
ListItem
Checked :=
120
//添加升級文件名
121
Caption := NewFile
122
//添加升級文件大小
123
SubItems
Add(NewFile
'Size'
124
//添加升級文件日期
125
126
//添加升級文件下載地址
127
'URL'
128
Add(
'未下載'
129
130
131
Count =
132
MessageBox(handle,
'沒有升級文件列表'
'信息'
, MB_OK)
else
133
Button2
//有升級文件,下載按鈕可操作
134
135
136
137
138
OrgFile
139
140
141
'就緒...'
142
143
144
145
146
Close;
147
148
149
150
integer
151
aDownURL:
152
153
aDate: TDate;
154
155
'正在下載升級文件...'
156
157
158
ProgressBar2
Max := ListVIEw1
Count;
159
160
161
Item[i].Checked
//選擇了升級
162
163
Item[i].SubItems
Strings[
3
] :=
'下載中'
164
//得到下載地址
165
aDownURL := ListVIEw1
2
];
166
//得到文件名
167
aFile := ListVIEw1
Item[i].Caption;
168
DownLoadFile(aDownURL, aFile)
//開始下載
169
170
'完成'
171
172
aDate := StrToDate(ListVIEw1
]);
173
with
TIniFile
174
//寫入已經升級日期
175
WriteDate(aFile,
, aDate);
176
177
178
'失敗'
179
180
Position := ProgressBar2
Position +
181
182
183
'下載升級文件完成'
, MB_OK);
184
185
186
187
188
189
本例效果圖:代碼文件:unit Unit1;i
Delphi 2005 被Broland成為w
數組可以使Object Pascal所擁有的任何數
原理分析:互斥對象是系統內核對象, 各線程都可
引言在國內常見的信息化開發及實施項目中,大多數
Delphi編寫實現的郵件群發程序代碼,主要是使用Indy