我遇到启动和停止按钮的问题。
当我点击开始时,它无法完全退出:我怎么能这样做:
在
在
我的代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := False;
TServiceThread.Create;
end;
我的朋友给了这个代码,但是它不起作用 - 当我点击开始时,它会关闭。
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := False;
TServiceThread.Create;
if (button1.Caption='&Start') then
begin
Button1.Enabled := True;
button1.Caption:='&Stop';
end
else
begin
Button1.Enabled := True;
close;
button1.Caption:='&Start';
end;
end;
解决方案是什么?
答案 0 :(得分:2)
首先,您在第二个Close
事件中有Button1Click
,这将关闭表单。删除它,你已经解决了这个问题。
认为你可能想要开始和停止线程,你需要做一些事情。
首先,您需要保留对线程的引用,因此在表单定义中添加一个新变量:
type
TForm1 = class(TForm)
...
private
FServiceThread: TServiceThread;
...
end;
现在,在Button1Click
处理程序中:
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := False;
try
if FServiceThread = nil then
FServiceThread := TServiceThread.Create;
if (Button1.Caption = '&Start') then
begin
Button1.Caption := '&Stop';
FServiceThread.Start;
end
else
begin
Button1.Caption := '&Start';
FServiceThread.Terminate;
end;
finally
Button1.Enabled := True;
end;
end;
请注意,您需要将线程的FreeOnTerminate
属性设置为True
(它将在终止时自动释放该线程),或者在表单OnClose
中自行手动释放线程。或OnDestroy
事件。如果您使用FreeOnTerminate
,则应为线程的OnTerminate
事件添加事件,并使用它设置FServiceThread := nil;
以允许在下次{{1}时创建新事件单击}按钮。