2017-11-16 26 views
0

スレッドをサブフォームで実行すると問題が発生します。サブフォームのdelphiスレッドエラー

メインフォーム

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

uses Unit2; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
TForm2.create(form1).ShowModal; 
end; 

サブフォーム

type 
TMthread=class(Tthread) 
protected 
procedure execute; override; 
end; 
type 
TForm2 = class(TForm) 
    Label1: TLabel; 
    procedure FormShow(Sender: TObject); 
    private 
    public 
    end; 

var 
    Form2: TForm2; 

implementation 

{$R *.dfm} 

uses Unit1; 

procedure TMthread.Execute; 
begin 
    synchronize(procedure 
       begin 
       sleep(200); 
       freeonterminate:=true; 
       sleep(200); 
       form2.label1.Caption:='beep'; 
       form1.button1.Caption:='beep'; 
       end); 
end; 

procedure TForm2.FormShow(Sender: TObject); 
var Loadcombo2: TMthread; 
begin 
    Loadcombo2:=TMthread.Create(False); 
end; 

プログラム

program Project1; 

uses 
    Vcl.Forms, 
    Unit1 in 'Unit1.pas' {Form1}, 
    Unit2 in 'Unit2.pas' {Form2}; 

{$R *.res} 

begin 
    Application.Initialize; 
    Application.MainFormOnTaskbar := True; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
end. 

Form2.Label1.captionにアクセスしようとしたとき、私は実行の手順でエラーが発生しました。

私のテスト:私は初期化セクション(最後のコード)でサブフォーム(Form2)を追加すると

アプリケーションがエラーなしで実行されますが、Form2の上Label1.captionを変更しません(Button1.caption。

メインフォームに同じスレッドを正確に配置すると、問題なく動作します。

+1

をForm1、Form2のような形態のためのグローバル変数に依存しないでください:私は代わりに、あなたがこのような何かを書くことを意味すると思われる

TForm2.Create(Form1).ShowModal; 

を。これらは通常、自動作成されたフォームで使用されます。つまり、Application.CreateFormが呼び出された場合を意味します。しかし、フォームの2つのインスタンスが終了する場合、あなたはどうしますか?または、あなたのコードのように自動作成されていないものはありますか? – nil

+2

あなたは2回*エラー*と言っていますが、あなたが得た*エラー*を一度教えてください。あなたの目の前の画面に表示されます。残念ながら、私たちは座っている場所からあなたの画面を見ることはできません。はい、コードを見るのは明らかですが、将来的に問題の解決策を探している人には当てはまりません。あなたの質問にエラー情報を含めてください。そうするために[edit]を作成している間は、実際に質問をすることもできます。現在の投稿はありません。 –

答えて

2

変数Form2は決して割り当てられません。グローバル変数であるため、値はnilです。したがって、Form2のメンバーを参照しようとすると、エラーが発生します。

あなたはこのようなForm2のインスタンスを作成します。

Form2 := TForm2.Create(Form1); 
Try 
    Form2.ShowModal; 
Finally 
    Form2.Free; 
End; 
+0

ありがとう、David。それはうまくいった。 –

+0

'TForm2.FormShow()'が 'Self'ポインタをスレッドのコンストラクタに渡し、' Execute() 'が使用できる変数に保存する方が良い解決策です。それでは、グローバルな 'Form2'変数にはもう依存しません。また、必要に応じて複数の' TForm2'インスタンスを並列に実行させることもできます。 –

+0

@Remy Fair。このコードには他にも多くの問題があり、私はこのすべてをカバーすることができませんでした。 –