"Ulrik Vadstrup" <vadstrup@post12.tele.dk> wrote in
news:9j4mc4$nkl$1@news.cybercity.dk:
> Jeg har en TThread, der downloader en fil fra nettet.
>
> Nu vil jeg gerne have den til at køre en progressbar fra 0 -100 mens
> den downloader, sætte en boolean værdi true når den er færdig (Bruges
> hvis program afsluttes før download er færdig), samt komme med en
> popup, når den er færdig.
>
> Jeg har ikke arbejdet så meget med TThread, og jeg kan ikke rigtig
> lure hvordan jeg "kommunikerer" værdierne til min form/progressbar,
> for det går åbenbart ikke at sætte den inde fra min TThread.
>
> Nogen der har et foreslag.
Har rettet og tilføjet lidt i koden, se neden for.
>
> TThread ser ud som følgende
>
> type
* TProgressUpdate = procedure (Sender: TObject; progress: integer); *
> TGetPatch = class(TThread)
> Private
* FProgressUpdate: TProgressUpdate; *
* Progress: integer; *
* procedure UpdateForm; *
> Protected
> procedure Execute; override;
> public
* property OnProgressUpdate: TProgressUpdate read FProgressUpdate
write FProgressUpdate;
> end;
>
>
> Procedure TGetPatch.Execute;
> var
> hSession, hURL: HInternet;
> Buffer: array[1..BufferSize] of Byte;
> BufferLen: DWORD;
> f: File;
> sAppName, Filename, fileURL: String;
> begin
>
> Filename := ExtractFilePath(Application.Exename) + 'FangstDB.new';
> fileURL := '
http://www.blackend.dk/FangstDB.exe';
> sAppName := ExtractFileName(Application.ExeName);
> hSession := InternetOpen(PChar(sAppName),
> INTERNET_OPEN_TYPE_PRECONFIG,
> nil, nil, 0);
> try
> hURL := InternetOpenURL(hSession,
> PChar(fileURL),
> nil,0,0,0);
> try
> AssignFile(f, FileName);
> Rewrite(f,1);
> repeat
> InternetReadFile(hURL, @Buffer,
> SizeOf(Buffer), BufferLen);
> BlockWrite(f, Buffer, BufferLen)
* Progress := /hvordan det nu skal beregnes/*
* Synchronize(UpdateForm); *
> until BufferLen = 0;
> CloseFile(f);
> finally
> InternetCloseHandle(hURL)
> end;
> finally
> InternetCloseHandle(hSession)
> end;
> end;
procedure TGetPatch.UpdateForm;
begin
if assigned(FProgressUpdate) then FProgressUpdate(self, progress);
end;
og i din form:
....
private
procedure UpdateProgress(Sender: TObject; Progress: Integer);
....
procedure TFormMain.UpdateProgress(Sender: TObject; Progress: Integer);
begin
FormMain.Progressbar.Position := Progress;
end;
....og ved oprettelse af thread:
Thread := Thread.Create(true);
Thread.OnProgressUpdate := UpdateProgress;
Thread.resume;
- det kan laves kortere, men jeg tror ikke lige det kan laves meget
pænere
/Claus
--
Claus Christiansen, <mailto:cch@unipeople.dk>
personal:
http://www.bigfoot.com/~kruc/; pythia:
http://www.pythia.dk
============================================--------------------------
"Computers are useless. They can only give you answers."
- Pablo Picasso (1881-1973)