スレッドをサブフォームで実行すると問題が発生します。サブフォームの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。
メインフォームに同じスレッドを正確に配置すると、問題なく動作します。
をForm1、Form2のような形態のためのグローバル変数に依存しないでください:私は代わりに、あなたがこのような何かを書くことを意味すると思われる
を。これらは通常、自動作成されたフォームで使用されます。つまり、Application.CreateFormが呼び出された場合を意味します。しかし、フォームの2つのインスタンスが終了する場合、あなたはどうしますか?または、あなたのコードのように自動作成されていないものはありますか? – nil
あなたは2回*エラー*と言っていますが、あなたが得た*エラー*を一度教えてください。あなたの目の前の画面に表示されます。残念ながら、私たちは座っている場所からあなたの画面を見ることはできません。はい、コードを見るのは明らかですが、将来的に問題の解決策を探している人には当てはまりません。あなたの質問にエラー情報を含めてください。そうするために[edit]を作成している間は、実際に質問をすることもできます。現在の投稿はありません。 –