读书人

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

发布时间: 2012-05-03 14:06:56 作者: rapoo

线程中创建可视控件数组 完成后消失
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抹掉,暂时还是找不到原因。

读书人网 >.NET

热点推荐