2016-05-03 13 views
0
procedure TForm4.WorkerThread(Thread: TMultiThreadThread; 
    Parameters: TObject; var Data, Results: TObject); 
var 
    clMailMessage1 : TclMailMessage; 
    myVariable : string; 
begin 
    myVariable := 'A String from this Thread'; 
    clMailMessage1 := TclMailMessage.Create(self); 
    clMailMessage1.OnSaveAttachment := clMailMessage1SaveAttachment; 
    clMailMessage1.LoadMessage('myemail.eml'); 
    // The LoadMessage activates/calls the OnSaveAttachment procedure 
    clMailMessage1.free; 
end; 

procedure TForm4.clMailMessage1SaveAttachment(Sender: TObject; 
ABody: TclAttachmentBody; var AFileName: string; var AData: TStream; 
var Handled: Boolean); 
begin 
    AData := TFileStream.Create(AFileName, fmCreate); 
    // saves all attachments 
    // **How do I access the myVariable here from the specific calling thread ?** 
end; 

clMailMessage1SaveAttachmentプロシージャからmyVariableにアクセスしたいと思います。Delphi、MultiThreadからプロシージャに変数を渡すにはどうすればいいですか?

これは私の推測するリグを超えているので、いくつかのコードはいいと思います。

答えて

2

myVariableWorkerThread()にローカルなので、clMailMessage1SaveAttachment()は表示されません。例えば

procedure TForm4.WorkerThread(Thread: TMultiThreadThread; 
    Parameters: TObject; var Data, Results: TObject); 
var 
    clMailMessage1 : TclMailMessage; 
    myVariable : string; 
begin 
    myVariable := 'A String from this Thread'; 
    clMailMessage1 := TclMailMessage.Create(self); 
    clMailMessage1.SomeUserDefinedData := @myVariable; // <-- here 
    //... 
end; 

procedure TForm4.clMailMessage1SaveAttachment(Sender: TObject; 
    ABody: TclAttachmentBody; var AFileName: string; var AData: TStream; 
    var Handled: Boolean); 
var 
    myVariable: PString; 
begin 
    myVariable := PString(TclMailMessage(Sender).SomeUserDefinedData); 
    // use myVariable^ as needed... 
end; 

を、TclMailMessageTComponent子孫であるならば、あなたが使用することができます。TclMailMessageは例えば、あなたはmyVariableへのポインタの周りに渡すためにそれを使用することができ、ユーザー定義のデータを関連付けるための方法を提供する場合

公共Tagプロパティ:それ以外の場合は

clMailMessage1.Tag := NativeInt(@myVariable); 
... 
myVariable := PString(TclMailMessage(Sender).Tag); 

、ユーザー定義のデータを定義することはオプションではありません場合は、グローバルスコープにmyVariableを移動し、0としてそれをマークすることができます代わりに、たとえば:

threadvar 
    myVariable : string; 

procedure TForm4.WorkerThread(Thread: TMultiThreadThread; 
    Parameters: TObject; var Data, Results: TObject); 
var 
    clMailMessage1 : TclMailMessage; 
begin 
    myVariable := 'A String from this Thread'; 
    try 
    clMailMessage1 := TclMailMessage.Create(self); 
    clMailMessage1.OnSaveAttachment := clMailMessage1SaveAttachment; 
    clMailMessage1.LoadMessage('myemail.eml'); 
    clMailMessage1.free; 
    finally 
    myVariable := ''; // important to free thread-specific memory 
    end; 
end; 

procedure TForm4.clMailMessage1SaveAttachment(Sender: TObject; 
    ABody: TclAttachmentBody; var AFileName: string; var AData: TStream; 
    var Handled: Boolean); 
begin 
    // use myVariable as needed... 
end; 
関連する問題