あらかじめ作成しているグローバルの文字列リスト(MList)に
データを入れておいて、これをスレッドに渡して ShowMessage で
表示したいのですがうまくいきません。
どこが悪いのでしょうか?また、どうすればよいのか教えてください。
フォームを2つ用意します。
1つめにはボタンを貼り付けます。
以下ソースコードになります
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Unit1
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
uses Unit2;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
MList := TStringList.Create;
MList.Add('abc-def');
MList.Add('abc-ghi');
MList.Add('jkl-mno');
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
MList.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
StartExecute;
end;
end.
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Unit2
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TMyThread = class(TThread)
private
protected
procedure Execute; override;
public
end;
TForm2 = class(TForm)
private
MyThread: TMyThread;
public
end;
var
Form2: TForm2;
MList: TStringList;
procedure StartExecute;
implementation
{$R *.dfm}
procedure StartExecute;
begin
// データ転送(アップロード・ダウンロード)開始
Form2.MyThread := TMyThread.Create(True);
Form2.MyThread.Resume;
// フォームを表示する
Form2.ShowModal;
end;
procedure TMyThread.Execute;
begin
ShowMessage(' ===== ' + IntToStr(MList.Count) + ' ===== ' + #13#10 + MList.Text);
Form2.ModalResult := mrOk;
end;
end.
ここの最後にあるように、Createの引数に渡したいデータを書けば
いいと思います。
http://www.borland.co.jp/tips/delphi/dh004/thread_2.html
Form2 に RichEdit を貼り付けて
ShowMessage(' ===== ' + IntToStr(MList.Count) + ' ===== ' + #13#10 + MList.Text);
この部分を以下のようにすると表示されますので
データは正常にわたっているようです。
ShowMessage が悪影響を出していると思うのですが
根拠がないのでご存知の方ご意見を聞かせてください。
Form2.RichEdit1.Lines.Add(' ===== ' + IntToStr(MList.Count) + ' ===== ');
Form2.RichEdit1.Lines.Add(MList.Text);
スレッドで VCL を操作するには、メソッド全体を Synchronize() で呼び出します。
type
TMyThread = class(TThread)
private
protected
procedure Execute; override;
public
procedure Method;
end;
TForm2 = class(TForm)
private
MyThread: TMyThread;
public
{ Public 宣言 }
end;
var
Form2: TForm2;
MList: TStringList;
procedure StartExecute;
implementation
{$R *.dfm}
procedure StartExecute;
begin
// データ転送(アップロード・ダウンロード)開始
Form2.MyThread := TMyThread.Create(True);
Form2.MyThread.Resume;
// フォームを表示する
Form2.ShowModal;
end;
procedure TMyThread.Method;
begin
ShowMessage(' ===== ' + IntToStr(MList.Count) + ' ===== ' + #13#10 + MList.Text);
Form2.ModalResult := mrOk;
end;
procedure TMyThread.Execute;
begin
Synchronize(Method);
end;
deldelさん、anoneさん
ありがとうございました。
RichEdit に変更して、データの表示が正常にできましたが、
結局これも、Synchronize を使用していないので
たまたま動作していたというわけなんですね。
ツイート | ![]() |