شاید تا به حال پیش آمده که نرم افزاری بزرگ نوشته باشید و بعد بخواهید آن را به روز کنید . ( مانند به روز رسانی آنتی ویروس ها ) . من در این جا یک روال ساده را مرحله به مرحله بیان می کنم و بعد خود شما می توانید آن را تکمیل کنید .
برای این کار روش های زیادی وجود دارد که در این جا یک روش خیلی ساده گفته می شود که با توجه به کاربرد آن باید جای مراحل تغییر کند . (مثلا اول زمان آخرین دسترسی به فایل چک شود و بعد اتصال به اینترنت ) آدرس فایل های به روزرسانی را از روی فایل xml در host بخواند و آنها را دانلود و به روز کند و یا فایل xml را روی سیستم کاربر کپی کند و بعد آن را بخواند و با یک progressbar زمان به روزرسانی را نشان دهد. این تنها یک برنامه ساده است که شاید به شما که در اول کار هستید کمک کند .
برای این کار 3فرم ایجاد کنید در فرم اول : listbox , memo , button ,xml و دو editbox قرار دهید .در listbox نود تاریخ را برای ما قرار می دهد . فرم دوم برای login کردن است دو editbox و button نیاز داریم .
مرحله اول : ابتدا باید نرم افزار چک کند که آیا به اینترنت متصل هستید یا خیر ؟ در صورت متصل بودن پیغام بدهد که آیا م یخواهید نرم افزار به روز شود یا خیر ؟ اتصال به اینترنت را با کامپوننت indy به راحتی می توان چک کرد اما من در اینجا از یک پروسیژر به نام dostowin برای اجرای دستورات داس در دلفی استفاده کردم . که با دستور ping اتصال را چک می کند .
procedure tform1.Dos2Win(CmdLine:String; OutMemo:TMemo);
const BUFSIZE = 2000;
var SecAttr : TSecurityAttributes;
hReadPipe,
hWritePipe : THandle;
StartupInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer : Pchar;
WaitReason,
BytesRead : DWord;
begin
with SecAttr do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if Createpipe (hReadPipe, hWritePipe, @SecAttr, 0) then
begin
Buffer := AllocMem(BUFSIZE + 1);
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.hStdOutput := hWritePipe;
StartupInfo.hStdInput := hReadPipe;
StartupInfo.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_HIDE;
if CreateProcess(nil,
PChar(CmdLine),
@SecAttr,
@SecAttr,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo) then
begin
repeat
WaitReason := WaitForSingleObject( ProcessInfo.hProcess,100);
Application.ProcessMessages;
until (WaitReason <> WAIT_TIMEOUT);
Repeat
BytesRead := 0;
ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
Buffer[BytesRead]:= #0;
OemToAnsi(Buffer,Buffer);
OutMemo.Text := OutMemo.text + String(Buffer);
until (BytesRead < BUFSIZE);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
end;
end;
//**************************
procedure TForm1.FormCreate(Sender: TObject);
begin
Dos2Win('ping www.google.com', Memo1);
if memo1.Lines.Count =1 then
ShowMessage('computer is not connect to internet !! ')
else
x:= MessageDlgPos(آیا می خواهید نرم افزار به روز شود!!',mtConfirmation, mbYesNoCancel, 0, 200, 200);
if x=mryes then
begin
چک کردن آخرین زمان دسترسی به فایل
End;
End;
مرحله دوم : آخرین زمان به روز رسانی فایل محاسبه شود که در اینجا براساس آخرین زمان دسترسی به فایل به روزرسانی این کار انجام شده است باید توجه داشته باشید که فایل برای کاربر باید فقط خواندنی باشد تا در آن تغییری ایجاد نکند .
Success := SysUtils.FindFirst('c:\نام فایل',faAnyFile,SearchRec);
if (Success = 0) and
((SearchRec.FindData.ftLastAccessTime.dwLowDateTime <> 0 ) or
(SearchRec.FindData.ftLastAccessTime.dwHighDateTime <> 0 )) then
begin
FileTimeToLocalFileTime(SearchRec.FindData.ftLastAccessTime,DT);
FileTimeToSystemTime(DT,ST);
edit1.Text:=( IntToStr(ST.wYear)+'/'+ IntToStr(ST.wMonth)+'/'+ IntToStr(ST.wDay));
end;
SysUtils.FindClose(SearchRec);
مرحله سوم : باید فایل xml روی Host را بخوانید تا فایل های مورد نیاز را دانلود کند . forms نام گره اول در xml است .
XMLDocument1.LoadFromFile(ExtractFilePath(Application.ExeName)+'test22.xml');
node1:=XMLDocument1.ChildNodes.FindNode('forms');
n:=node1.ChildNodes.Count;
//showmessage(inttostr(n));
for i:=0 to n-1 do
begin
node2:=node1.ChildNodes.Nodes[i];
ListBox1.Items.Add(inttostr(i)+' ' +node2.Attributes['date1']);
end;
مرحله چهارم :
آخرین زمان دسترسی به فایل به روزرسانی با تاریخ آخرین به روزرسانی در xmlقایسه می شود تا در صورت نیاز به روزرسانی انجام شود . این رویداد داخل دمه به روزرسانی نوشته می شود .
procedure TForm1.Button1Click(Sender: TObject);
begin
for i:=0 to n-1 do
begin
node2:=node1.ChildNodes.Nodes[i];
if node2.Attributes['date1'] > StrToDate(edit2.Text) then
edit2.Text:=node2.Attributes['date1'];
end;
if StrToDate(edit2.text) < StrToDate(edit1.Text) then
ShowMessage('نرم افزار شما نیاز به بروزرسانی ندارد')
else
begin
ShowMessage('نرم افزار شما نیاز به بروزرسانی دارد');
if x=mryes then
form2.show;
end;
end;
مرحله پنجم : در این فرم تنها نام کاربری و کلمه عبور دریافت می شود .
procedure TForm2.Button1Click(Sender: TObject);
begin
form3. MPFtp.User := edit1.text;
form3.MPFtp.Pass:= edit2.text;
form3.show;
end;
مرحله ششم : فایل ها را دانلود کند . آدرس را ازxml خوانده و در edit2 قرار دهد و در edit3 محل ذخیره شدن فایل را بدهید . البته این کار جالبی نیست و باید این مرحله را با استفاده از کامپوننت انجام دهید . مثل mftp ویا indy من قبلا این کار را با mftp انجام دادم که الان به یاد ندارم اما کد کامپوننت indy را برای شما گذاشتم .
procedure TForm3.Button4Click(Sender: TObject);
var InternetFile,LocalFile: string;
begin
InternetFile:=edit2.text;
LocalFile:=edit3.text;
if GetInetFile(InternetFile,LocalFile)=True then
ShowMessage('download')
else
ShowMessage('Can not download the updated files');
end;
با سلام و خسته نباشید
دوست عزیز اگر امکان دارد یه مثال کوچیک در مورد اینکه برنامه بفهمه به اینترنت وصل است یا نه بنویسید و ممکن است به میل من ارسال کنید.
با تشکر