Witam wszystkich! Chciałem zrobić do swojego patchera aby pobierał on pliki, lecz nie wiem jak! Proszę o pomoc.
Chciałbym jeszcze napisać że chce zrobić pobieranie z ProgressBarem
Witam wszystkich! Chciałem zrobić do swojego patchera aby pobierał on pliki, lecz nie wiem jak! Proszę o pomoc.
Chciałbym jeszcze napisać że chce zrobić pobieranie z ProgressBarem
URLDownloadToFile
Np:
Uses URLMon;
{...}
Const Pliki: Array[0..4] Of String = ('plik1', 'plik2', 'plik3', 'plik4', 'plik5');
Const Serwer = 'ftp://google.ftp.pl/';
Const Zapis = 'c:\';
Var I: Integer;
Begin
ProgressBar1.Max := High(Pliki);
For I := 0 To High(Pliki) Do Begin
ProgressBar1.Position := I;
if URLDownloadToFile(nil, Serwer + Pliki[i], Zapis + Pliki[i], 0, nil) <> 0 Then
ShowMessage('Błąd podczas ściągania pliku '+Pliki[i]+' ; z serwera '+Serwer);
Application.ProcessMessages;
End;
End;
ProgressBar będzie pokazywał ilość plików pobranych.
For I := 0 To High(Pliki) Do Begin
jak już używasz high to używaj też low, jako zabezpieczenie czy tablica jest indeksowana od 0 czy od 1...
Racja...
Uses URLMon;
{...}
Const Pliki: Array[0..4] Of String = ('plik1', 'plik2', 'plik3', 'plik4', 'plik5');
Const Serwer = 'ftp://google.ftp.pl/';
Const Zapis = 'c:\';
Var I: Integer;
L: Integer;
Begin
ProgressBar1.Max := High(Pliki);
L := Low(Pliki);
For I := L To High(Pliki) Do Begin
ProgressBar1.Position := I - L;
if URLDownloadToFile(nil, Serwer + Pliki[i], Zapis + Pliki[i], 0, nil) <> 0 Then
ShowMessage('Błąd podczas ściągania pliku '+Pliki[i]+' ; z serwera '+Serwer);
Application.ProcessMessages;
End;
End;
Chyba teraz dobrze ;-)
Jeżeli chcesz pobierać za pomocą funkcji URLDownloadToFile to progress można zrobić tak jak w kodzie niżej (kiedyś na potrzeby innego pytającego napisałem ten przykładowy kod ale temat był Newbie i został już usunięty ale miałem jeszcze na dysku więc wklejam).
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, URLMon, ActiveX, ComCtrls, StdCtrls;
type
TDownLoadMonitor = class( TInterfacedObject, IBindStatusCallback )
protected
function OnStartBinding( dwReserved: DWORD; pib: IBinding ): HResult; stdcall;
function GetPriority( out nPriority ): HResult; stdcall;
function OnLowResource( reserved: DWORD ): HResult; stdcall;
function OnProgress( ulProgress, ulProgressMax, ulStatusCode: ULONG;
szStatusText: LPCWSTR): HResult; stdcall;
function OnStopBinding( hresult: HResult; szError: LPCWSTR ): HResult; stdcall;
function GetBindInfo( out grfBINDF: DWORD; var bindinfo: TBindInfo ): HResult; stdcall;
function OnDataAvailable( grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc;
stgmed: PStgMedium ): HResult; stdcall;
function OnObjectAvailable( const iid: TGUID; punk: IUnknown ): HResult; stdcall;
end;
TForm1 = class(TForm)
Label1: TLabel; //pokazuje ile pobrano
Button1: TButton; //wywolanie pobierania
ProgressBar1: TProgressBar; //progressbar
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
fDM: TDownLoadMonitor;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function TDownLoadMonitor.GetBindInfo( out grfBINDF: DWORD; var bindinfo: TBindInfo ): HResult;
begin
Result := S_OK;
end;
function TDownLoadMonitor.GetPriority( out nPriority ): HResult;
begin
Result := S_OK;
end;
function TDownLoadMonitor.OnDataAvailable( grfBSCF, dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium ): HResult;
begin
Result := S_OK;
end;
function TDownLoadMonitor.OnLowResource( reserved: DWORD ): HResult;
begin
Result := S_OK;
end;
function TDownLoadMonitor.OnObjectAvailable( const iid: TGUID; punk: IInterface ): HResult;
begin
Result := S_OK;
end;
function TDownLoadMonitor.OnProgress( ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR ): HResult; //obsługa paska postępu
var
p: Word;
begin
if ulProgressMax > 0 then
p:= Round(ulProgress / ulProgressMax * 100)
else
p:=0;
Form1.Label1.Caption:= Format('Pobrano %f MB z %f MB [%d %%]', [ulProgress / 1048576,
ulProgressMax / 1048576, p]);
Form1.ProgressBar1.Position:= ulProgress;
Form1.ProgressBar1.Max:= ulProgressMax;
Application.ProcessMessages;
Result := S_OK;
end;
function TDownLoadMonitor.OnStartBinding( dwReserved: DWORD; pib: IBinding ): HResult;
begin
Result := S_OK;
end;
function TDownLoadMonitor.OnStopBinding( hresult: HResult; szError: LPCWSTR ): HResult;
begin
Result := S_OK;
end;
procedure TForm1.Button1Click(Sender: TObject); //wywołanie pobierania
begin
fDM:= TDownLoadMonitor.Create;
URLDownloadToFile( nil, 'http://download.winzip.com/winzip145.exe', 'C:\winzip.exe', 0, fDM as IBindStatusCallback);
fDM:= nil;
end;
end.
Bardzo dziękuję wszystkim za pomoc.
Patryk27 napisz mi jeszcze gdzie wstawić ten twój kod
Np.Do buttona "Aktualizuj"
Patryk27
A jak usunę: '+Pliki[i]+' ; z serwera '+Serwer
to nic się nie stanie bo ja tego nie chce właśnie mieć
Patryk27:
Wklejam to twoje do buttona chce włączyć aplikacje i : [Error] patcher.pas(105): Statement expected but 'USES' found - Jeśli nie wiecie o co mi chodzi to moge wam dać filmik który to pokazuje.
Admix napisał(a)
'USES' found - Jeśli nie wiecie o co mi chodzi to moge wam dać filmik który to pokazuje
ech... w programie może być tylko jedno USES (po opcjonalnym słowie PROGRAM), a w module dwa (po INTERFACE i po IMPLEMENTATION). dodaj uses-owany moduł po przecinku do istniejącego wyrażenia USES.