首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

线程中创建可视控件数组 完成后消失,该怎么处理

2012-05-03 
线程中创建可视控件数组 完成后消失typeTForm1 class(TForm)Button1: TButtonEdit1: TEditprocedure B

线程中创建可视控件数组 完成后消失
type
  TForm1 = class(TForm)
  Button1: TButton;
  Edit1: TEdit;
  procedure Button1Click(Sender: TObject);
  procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
  { Private declarations }
  procedure NewBtnClick(Sender: TObject);
  public
  { Public declarations }
  end;
 
 TMyThread = class(TThread)
  private
  BtnNumber: Integer;
  protected
  procedure Execute; override;
  constructor Create(ABtnNumber:Integer);
  end;

var
  Form1: TForm1;
  Btn_news: Array of TButton;

implementation
{$R *.dfm}

constructor TMyThread.Create(ABtnNumber: Integer);
begin
  BtnNumber:=ABtnNumber;
  inherited Create(FALSE);
end;

procedure TMyThread.Execute;
var
  i: Integer;
begin
 // FreeOnTerminate := true; {这可以让线程执行完毕后随即释放}
  With Form1 do
  begin
  for i := 0 to BtnNumber-1 do
  begin
  Btn_news[i] := TButton.Create(Form1);
  Btn_news[i].Parent:= Form1;
  if i = 0 then
  begin
  Btn_news[i].Left:= 10;
  Btn_news[i].Top := 10;
  Btn_news[i].Width := 70
  end
  else
  begin
  Btn_news[i].Left:= 70*i +10;
  Btn_news[i].Top := 10;//+ Btn_news[i-1].Height;//+10;;
  end;
  Btn_news[i].Caption :='按钮'+intToStr(i);
  Btn_news[i].Visible := True;
  Btn_news[i].Hint := intToStr(i);
  Btn_news[i].OnClick := NewBtnClick ;
  end;
  end;
end;

procedure TForm1.NewBtnClick(Sender: TObject);
begin
 Showmessage('按钮'+TButton(Sender).Hint)
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyThread: TMyThread;
  N ,i:integer;
begin
  N := StrToInt(Edit1.text);
  Setlength(Btn_news,N);
  MyThread := TMyThread.Create(N);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ExitThread(0);
end;

我单步跟踪线程的循环时 是能看到一个一个按钮在主界面上创建的。 可是循环结束后,控件全部消失,问问这问题出在那 怎么解决 谢谢各位

[解决办法]
注意用线程安全,最好还是不要在线程中创建VCL
[解决办法]
创建的都在线程空间,线程释放后都没了
[解决办法]
constructor TMyThread.Create(ABtnNumber: Integer);
begin
BtnNumber:=ABtnNumber;
FreeOnTerminate := true; {这可以让线程执行完毕后随即释放}
inherited Create(FALSE);
end;

procedure TMyThread.CreateButtons();
var
i: Integer;
begin
With Form1 do
begin
for i := 0 to BtnNumber-1 do
begin
Btn_news[i] := TButton.Create(Form1);
Btn_news[i].Parent:= Form1;
if i = 0 then
begin
Btn_news[i].Left:= 10;
Btn_news[i].Top := 10;
Btn_news[i].Width := 70
end
else begin
Btn_news[i].Left:= 70*i +10;
Btn_news[i].Top := 10;//+ Btn_news[i-1].Height;//+10;;
end;
Btn_news[i].Caption :='按钮'+intToStr(i);
Btn_news[i].Visible := True;
Btn_news[i].Hint := intToStr(i);
Btn_news[i].OnClick := NewBtnClick ;
end;
end;
end;

procedure TMyThread.Execute;
begin
Synchronize(CreateButtons);
end;

问题可以解决,需要线程同步,但是不同步,为何主线程会把这些button抹掉,暂时还是找不到原因。

热点排行