-3

我的开始和停止按钮有问题。

看这里

当我单击开始时,它无法停止我们退出:我怎样才能使它像这样:

我的代码:

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;

解决办法是什么?

4

1 回答 1

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(当线程终止时将自动释放线程),或者在表单OnCloseOnDestroy事件中手动释放线程。如果您使用FreeOnTerminate,那么您应该为线程的OnTerminate事件添加一个事件,并使用它来设置FServiceThread := nil;以允许在下次Start单击按钮时创建一个新事件。

于 2013-06-17T14:59:31.553 回答