子窗体中的德尔菲线程错误



我在子窗体中运行线程时遇到问题。

主窗体

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;

SUBform

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。(主窗体上的按钮 1.标题已更改(

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

变量

Form2永远不会被分配。因为它是一个全局变量,所以它的值是 nil 。因此,当您尝试引用 Form2 的成员时会遇到错误。

您可以创建如下所示的Form2实例:

TForm2.Create(Form1).ShowModal;

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

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

最新更新