unit ThreadUnit;
interface
uses
UrlMon, StdCtrls, ExtCtrls, Windows, SysUtils, Classes, Dialogs, Controls;
type
TDownloadThread =
class(TThread)
private
{ Private declarations }
BILDNAME,
//
URL_TEIL1,
//
URL_TEIL2,
//Das sind die Texte von 5 LabeledEdits aus der Form1.
VERZEICHNIS :
string;
//Sie sollen im Thread verwendet werden (also müssen sie
ANZAHL : integer;
//übergeben werden (in Thread.Create), richtig?)
procedure UpdateForm1;
protected
procedure Execute;
override;
procedure DownloadFile;
public
{ Public declarations }
constructor Create(LEdit1,LEdit2,LEdit3,LEdit4,LEdit5 : TLabeledEdit);
//stimmt das?
end;
implementation
var z : integer;
{ Important: Methods and properties of objects in VCL or CLX can only be used
in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure TDownloadThread.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ TDownloadThread }
procedure TDownloadThread.UpdateForm1;
//wie im obigen Standard-Beispiel!
begin
Form1.Label1.caption := '
Datei ' + IntToStr(z) + '
von ' + IntToStr(ANZAHL) + '
fertig.';
//geht nicht!
end;
procedure DownloadFiles;
var URL, ORT :
string;
begin
z := 1;
if ForceDirectories(Verzeichnis)
then
while z <= ANZAHL
do begin //hier kennt Delphi die
URL := URL_TEIL1 + InttoStr(z) + URL_TEIL2;
//BEZEICHNER nie!
ORT := VERZEICHNIS + BILDNAME + IntToStr(z) + '
.jpg';
//weshalb? wo müssen sie
//deklariert werden? UrlDownloadtoFile(nil, PCHAR(URL), PCHAR(ORT), 0, nil);//sollen ja aus der
//Form1 kommen (Edits)
Synchronize(UpdateForm1);
//hab ich nach dem obigen Standard-Beispiel gemacht!
inc(z);
end;
end;
constructor TDownloadThread.Create(LEdit1, LEdit2, LEdit3, LEdit4, LEdit5 : TLabeledEdit);
begin
URL_TEIL1 := LEdit1.text;
//Kann man das hier so zuordnen?!
URL_TEIL2 := LEdit2.text;
ANZAHL := StrToInt(LEdit3.text);
//Es sollen eine best. Anzahl Bilder gedownloadet werden
VERZEICHNIS := LEdit4.text;
BILDNAME := LEdit5.text;
//Benennung der geladenen Bilder (+fortlaufende Nr.)
FreeOnTerminate := True;
end;
procedure TDownloadThread.Execute;
begin
{ Place thread code here }
DownloadFiles;
end;
end.
...
// so wird der Thread generiert (in Unit1):
TDownloadThread.Create(LabeledEdit1,
LabeledEdit2,
LabeledEdit3,
LabeledEdit4,
LabeledEdit5 : TLabeledEdit);