تدرك دلفي وظيفة ترقية البرامج تلقائيًا
المبدأ بسيط: احتفظ بملف Update.ini على FTP، والذي يسجل رقم إصدار الملف المراد تحديثه. ويوجد أيضًا ملف Update.ini محليًا في كل مرة يتم فيها تشغيل برنامج التحديث تم تنزيله أولاً من FTP إلى الاسم المحلي Update_new.ini، ثم قام بمقارنة الملفين إذا كان رقم الإصدار الجديد أكبر من الرقم القديم، أو كان الملف الجديد غير موجود في ini القديم، فهذا يمثل الملفين المطلوبين. قم بتحديثها، ثم قم بتنزيلها واحدة تلو الأخرى.
اسم هذا البرنامج هو AutoUpdate. يمكنك إنشاء ملف exe هذا ثم حزمه مع البرنامج الرئيسي. عند إنشاء اختصار على سطح المكتب، أشر إلى AutoUpdate بدلاً من البرنامج الرئيسي.
يوجد أيضًا ملف ini محليًا، دعنا نسميه ftp.ini على سبيل المثال، المحتوى الموجود بداخله هو
[معلومات]
main=Project1.exe
المعلمة={app}sayyes.pj2 -y bde.txt
main=Project1.exe: هو اسم البرنامج الرئيسي الموجود في نفس دليل برنامج الترقية
param={app}sayyes.pj2 -y bde.txt: هذه هي معلمة سطر الأوامر، app هو المسار الحالي، استبدله في البرنامج وقم بتمريره إلى البرنامج الرئيسي (إذا لزم الأمر)
تنسيق محتوى update.ini هو كما يلي
[جذر]
استعلام المكتب.txt=20100519
[DBcard]
sayyes.pj2=20100519
كلمة مرور مستخدم FTP.txt=20100519
يمثل [الجذر] الدليل الجذر، ويمثل [dbcard] التالي الدليل الفرعي، وهكذا.
واجهة الوحدة الرئيسية تستخدم Windows، والرسائل، وSysUtils، والمتغيرات، والفئات، والرسومات، وعناصر التحكم، والنماذج، ومربعات الحوار، وStdCtrls، وIdHTTP، وIdBaseComponent، وIdComponent، وIdTCPConnection، وIdTCPClient، وIdFTP، وComCtrls، وExtCtrls، وIniFiles، وShellAPI، وjpeg؛ فئة (تيفورم) IdFTP1: TIdHTTP; this.boBox; TProgressBar؛ Label3: TLabel؛ list_file: TListView؛ Label4: TLabel؛ الإجراء IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); ; خاص { الإعلانات الخاصة } FSize:Integer; FPath: string; FInitPath: string; var frmMain: يستخدم تنفيذ TfrmMain {$R *.dfm} // إجراء التقدم TfrmMain.IdFTP1Work(Sender: TObject; AWorkMode: TWorkMode; const AWorkCount: Integer); begin ProgressBar1.Position := AWorkCount; Application.ProcessMessages end; AWorkMode: TWorkMode)؛ ابدأ ProgressBar1.Position := 0; ProgressBar2.StepBy(1); end; الإجراء TfrmMain.FormCreate(Sender: TObject); nil ); frm.Show; FIniFile := TIniFile.Create(FExePath+'ftp.ini'); // تحميل معلومات ini، مثل معلومات المضيف والمنفذ LoadIni; وأخيرًا FreeAndNil(frm); IdFTP1.Quit; StringReplace(FParam,'{app}',FExePath,[rfReplaceAll]); // بعد اكتمال التحديث، ابدأ البرنامج الرئيسي وقم بتمرير معلمات سطر الأوامر ShellExecute(Handle,'open',PChar(FExePath+FMainExe) ,PChar( FParam),nil,SW_NORMAL); Application.Terminate end; TfrmMain.CheckUpdateList; var oldFile,newFile:TStringList; i,ver,index:Integer; / قم أولاً بتنزيل ملف update.ini على الخادم واحفظه في ملف update_new.ini المحلي IdFTP1.Get('update.ini',FExePath+'update_new.ini',True); if FileExists(FExePath + 'update.ini') = False ثم Exit; oldFile.LoadFromFile(FExePath + 'update.ini'); .LoadFromFile(FExePath + 'update_new.ini'); itempath := ''; // ابدأ بمقارنة القائمتين أدناه. إذا كان رقم إصدار newFile أكبر من رقم إصدار oldFile أو لا يوجد رقم إصدار في oldFile، فهذا يعني أنه يحتاج إلى التحديث لـ i:= 0 إلى newFile.Count - 1 ابدأ itemstr := newFile.Strings[i]; // إذا كان هو الدليل الجذر if itempath = 'root' ثم itempath := '/'; end; itemstr := newFile.Names[i]; .Add; item.Caption := itemstr; item.SubItems.Add(itempath) end else begin ver := StrToIntDef(newFile.Values[itemstr],0); itempath); end; if list_file.Items.Count = 0 ثم Application.Terminate; newFile.Free; end; function TfrmMain.ConnectFTP: Boolean; False; .اسم المستخدم := ld_username.Text; ld_psw.Text; IdFTP1.Passive := cb_mode.ItemIndex = 1; .DownLoadFile; var i:Integer; path:string; s1,s2:String; begin ProgressBar2.Max := list_file.Items.Count; ProgressBar2.Position := 0; 1 ابدأ Label4.Caption := 'Downloading'+list_file.Items[i].Caption; Application.ProcessMessages; IdFTP1.ChangeDir(FInitPath); path := list_file.Items[i].SubItems.Strings[0]; إذا كان المسار <>'/' يبدأ IdFTP1.ChangeDir(path); list_file.Items[i].Caption s2 := FExePath+path+'/'+list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); list_file.Items[i].Caption; IdFTP1.Get(s1,s2,True); // تسجيل العناصر الفاشلة FIniFile.WriteString('error',list_file.Items[i].Caption,'Success' end; باستثناء // تسجيل العناصر الفاشلة FIniFile.WriteString('error',list_file.Items[i]. التسمية التوضيحية،'فشل')؛ end؛ Label4.Caption := 'تم تحديث جميع الملفات! ';DeleteFile(FExePath+'update.ini'); CopyFile(PChar(FExePath+'update_new.ini'),PChar(FExePath+'update.ini'),False; الإجراء TfrmMain.LoadIni; FIniFile.ReadString('coninfo','host','******'); ld_username.Text := FIniFile.ReadString('coninfo','user','******'); ld_psw.Text := FIniFile.ReadString('coninfo','psw','***** *'); ld_port.Text := FIniFile.ReadString('coninfo','port','21'); FIniFile.ReadInteger('coninfo','mode',1); '،'')؛ نهاية الإجراء TfrmMain.SaveIni؛ FIniFile.WriteString('coninfo','host',ld_host.Text); FIniFile.WriteString('coninfo','user',ld_username.Text); FIniFile.WriteString('coninfo','psw',ld_psw.Text) FIniFile.WriteString('coninfo','port',ld_port.Text); FIniFile.WriteInteger('coninfo','mode',cb_mode.ItemIndex end);
إذا كان لديك أي أسئلة، يرجى ترك رسالة أو الذهاب إلى مجتمع هذا الموقع للتواصل والمناقشة. شكرًا لك على القراءة، وآمل أن تتمكن من مساعدة الجميع. شكرًا لك على دعمك لهذا الموقع.