delphi 子窗体中的线程错误

delphi thread error in subform

我在 运行 子表单中的线程时遇到问题。

主窗体

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。([=主窗体上的 32=] 已更改)

当我在主窗体中放置完全相同的线程时,它可以正常工作。

变量Form2 从未被赋值。因为是全局变量,所以它的值为nil。因此,当您尝试引用 Form2.

的成员时会遇到错误

您创建了一个 Form2 的实例,如下所示:

TForm2.Create(Form1).ShowModal;

我怀疑你是想写这样的东西:

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