Pobieranie pliku

0

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

0

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.

0
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...

0

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 ;-)

0

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.

0

Bardzo dziękuję wszystkim za pomoc.

Patryk27 napisz mi jeszcze gdzie wstawić ten twój kod

0

Np.Do buttona "Aktualizuj"

0

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.

0
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.

0

@up koleś ja cie w ogóle nie rozumiem ! a poza tym mogą być 2 uses bo mam po program i jeszcze potem mam uses Unit1;

1 użytkowników online, w tym zalogowanych: 0, gości: 1