برنامه نویس

به وبلاگ خودتان خوش آمدید.

برنامه نویس

به وبلاگ خودتان خوش آمدید.

برنامه به روزرسانی نرم افزار با استفاده از دلفی

شاید تا به حال پیش آمده که نرم افزاری بزرگ نوشته باشید  و بعد بخواهید آن را به روز کنید . ( مانند به روز رسانی آنتی ویروس ها ) . من در این جا یک روال ساده را مرحله به مرحله بیان می کنم و بعد خود شما می توانید آن را تکمیل کنید .

برای این کار روش های زیادی وجود دارد که در این جا یک روش خیلی ساده  گفته می شود که  با توجه به کاربرد آن باید جای مراحل تغییر کند . (مثلا اول زمان آخرین دسترسی به فایل چک شود و بعد اتصال به اینترنت ) آدرس فایل های به روزرسانی را از روی فایل 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;

نظرات 1 + ارسال نظر
ebi دوشنبه 24 آبان‌ماه سال 1389 ساعت 12:38 ق.ظ

با سلام و خسته نباشید
دوست عزیز اگر امکان دارد یه مثال کوچیک در مورد اینکه برنامه بفهمه به اینترنت وصل است یا نه بنویسید و ممکن است به میل من ارسال کنید.
با تشکر

برای نمایش آواتار خود در این وبلاگ در سایت Gravatar.com ثبت نام کنید. (راهنما)
ایمیل شما بعد از ثبت نمایش داده نخواهد شد