Registriert seit: 31. Okt 2003
1.120 Beiträge
Delphi 7 Personal
|
Re: Die erste Thread-Programmierung...
31. Okt 2003, 23:12
Foldender Vorsachlag:
Delphi-Quellcode:
unit ThreadUnit;
interface
uses
UrlMon, StdCtrls, ExtCtrls, Windows, SysUtils, Classes, Dialogs, Controls;
type
TDownloadThread = class(TThread)
private
{ Private declarations }
FStatusLabel : TLabel;
BILDNAME, //
URL_TEIL1, //
URL_TEIL2, //Das sind die Texte von 5 LabeledEdits aus der Form1.
VERZEICHNIS : TLabeledEdit; //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 DownloadFiles;
public
{ Public declarations }
constructor Create(LEdit1,LEdit2,LEdit3,LEdit4,LEdit5 : TLabeledEdit; StatusLabel: TLabel); //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
FStatusLabel.Caption := ' Datei ' + IntToStr(z) + ' von ' + IntToStr(ANZAHL) + ' fertig.'; //geht so
end;
procedure TDownloadThread.DownloadFiles; // Hier hast du nur das TDownloadThread. vergessen, deswegen die Bezeichner-Fehler
var URL, ORT : string;
begin
z := 1;
if ForceDirectories(Verzeichnis.Text) then
while z <= ANZAHL do begin //hier kennt Delphi die
URL := URL_TEIL1.Text + InttoStr(z) + URL_TEIL2.Text; //BEZEICHNER nie!
ORT := VERZEICHNIS.Text + BILDNAME.Text + 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; StatusLabel: TLabel);
begin
inherited Create(false);
URL_TEIL1 := LEdit1; //Kann man das hier so zuordnen?!
URL_TEIL2 := LEdit2;
ANZAHL := StrToInt(LEdit3.Text); //Es sollen eine best. Anzahl Bilder gedownloadet werden
VERZEICHNIS := LEdit4;
BILDNAME := LEdit5; //Benennung der geladenen Bilder (+fortlaufende Nr.)
FStatusLabel := StatusLabel; // Hier wird quasi ein Pointer auf Form1.Label1 erstellt
FreeOnTerminate := True;
end;
procedure TDownloadThread.Execute;
begin
{ Place thread code here }
DownloadFiles;
end;
end.
Delphi-Quellcode:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ThreadUnit;
type
TForm1 = class(TForm)
Button1: TButton;
LabeledEdit1: TLabeledEdit;
LabeledEdit2: TLabeledEdit;
LabeledEdit3: TLabeledEdit;
LabeledEdit4: TLabeledEdit;
LabeledEdit5: TLabeledEdit;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
DownloadThread : TDownloadThread;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
// so wird der Thread generiert (in Unit1):
DownloadThread := TDownloadThread.Create(
LabeledEdit1,
LabeledEdit2,
LabeledEdit3,
LabeledEdit4,
LabeledEdit5,
Label1);
end;
end.
Habe dabei keine Syntax-Fehler bekommen, das ausführen des Threads klappt auch.
[edit]
Sorry, waren ein paar Flüchtigkeitsfehler drin.
[/edit]
|