mrmarman yazdı:Bir kaç başlıkta cevap verdim ancak konunun başarılıyla kavranamadığınu gördüm. Bu nedenle aşağıdak kodu yayınlıyorum...
- Formunuza birer tane TIdFTP, TGauge, TStatusBar ve TButton koyun...
- Yapılan işlem kısaca şu : Yazılımınız ile tıpatıp aynı isimdeki bir dosyayı FTP sitesinden download edecek, ardından yazılımınızın kendi kendini kapatılması sağlanarak, siteden indirilen dosya ile yenilenecek ve yeni haliyle tekrar çalışacak şekilde tasarlandı.
- Bilerek bu örnek için 1 MB FTP'de yer ayırdım. Kısa süreliğine açık kalacak daha sonra kapatıcam. İlk denemeler için belki merak eden olur..
- Kaynak kodlarıyla birlikte örnek indirmek isteyenler için link vereyim..
http://rapidshare.com/files/58430354/SelfUpdate.zip
Kullanımı ise şu kadar basit...Kod: Tümünü seç
Var xDosyaUzunluk : LongInt; function FTPDosyaAl( IdFTP : TIdFTP; SrcDosya, DesDosya:TFileName; Ftp, RemoteDir, Login, Pass : String ):Boolean; begin // Uses IdFTP, IdFTPCommon Result := False; IdFtp.Host := Ftp; IdFtp.Username := Login; IdFtp.Password := Pass; IdFtp.Passive := True; IdFtp.Connect; If IdFtp.Connected then begin IdFtp.ChangeDir(RemoteDir); // Gauge'de kullanmak için // Dosya Uzunluğunu grlobal bir değişkene atıyoruz... xDosyaUzunluk := IdFtp.Size( SrcDosya ); Try IdFtp.TransferType := ftBinary; // Uses IdFTPCommon IdFtp.Get(SrcDosya, DesDosya, True); Finally Result := True; end; IdFtp.Quit; end; end; procedure TForm1.FormCreate(Sender: TObject); begin If FileExists(ExtractFilePath(Application.Exename) +'Guncelle.BAT') then DeleteFile(ExtractFilePath(Application.Exename) +'Guncelle.BAT'); end; procedure TForm1.Guncelle(); Var FTPAdres, KaynakDizin, Name, Pass, KaynakDosya, HedefDosya : String; begin // Bilerek bu örnek için 1 MB yer ayırarak açtığım FTP sunucu adresini veriyorum... FTPAdres := 'emerkez.info'; KaynakDizin := '/programlar'; Name := 'delphi'; Pass := 'arman'; KaynakDosya := ExtractFileName(Application.Exename); HedefDosya := ChangeFileExt( ExtractFilePath(Application.Exename) + KaynakDosya, '.BAK' ); HedefDosya := ChangeFileExt( ExtractFilePath(Application.Exename) + KaynakDosya, '.BAK' ); If FileExists(HedefDosya) AND ( MessageDlg('Hedef Dosya Mevcut, üzerine yazılsın mı ? '+#13'('+HedefDosya+')', mtInformation, [mbYes, mbCancel], 0) = mrCancel ) then EXIT else DeleteFile(HedefDosya); If FTPDosyaAl( IdFtp, KaynakDosya, HedefDosya, FTPAdres, KaynakDizin, Name, Pass ) then MessageDlg('Dosya Başarıyla Alındı'+#13#13 + 'Şimdi program yeniden başlatılmak üzere kapatılacaktır....', mtConfirmation, [mbOk], 0) else MessageDlg('Dosya Alınamadı'+#13'('+KaynakDosya+')', mtError, [mbok], 0); With TStringList.Create do begin Add('@Echo Off' ); Add( Format('Copy %s %s', [ChangeFileExt(Application.ExeName,'.BAK'), Application.ExeName]) ); Add('DEL '+ChangeFileExt(Application.ExeName,'.BAK')); Add( Application.ExeName ); SaveToFile( ExtractFilePath(Application.Exename)+'Guncelle.BAT' ); Free; end; Application.Terminate; WinExec( PChar( ExtractFilePath(Application.Exename)+'Guncelle.BAT'), SW_Hide ); end; procedure TForm1.IdFtpStatus(ASender: TObject; const AStatus: TIdStatus; const AStatusText: string); begin StatusBar1.SimpleText := AStatusText; end; procedure TForm1.IdFtpWork(ASender: TObject; AWorkMode: TWorkMode; AWorkCount: Integer); begin Gauge1.Progress := AWorkCount; Application.ProcessMessages; end; procedure TForm1.IdFtpWorkBegin(ASender: TObject; AWorkMode: TWorkMode; AWorkCountMax: Integer); begin Gauge1.MinValue := 0; Gauge1.MaxValue := xDosyaUzunluk; Gauge1.Progress := 0; Gauge1.Visible := True; end; procedure TForm1.IdFtpWorkEnd(ASender: TObject; AWorkMode: TWorkMode); begin Gauge1.Progress := 0; Gauge1.Visible := False; end;
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject); begin Guncelle(); end;
Linki Güncellermisiniz???