如何使用单个按钮切换活动?

时间:2013-06-17 14:41:51

标签: delphi

我遇到启动和停止按钮的问题。

see here

当我点击开始时,它无法完全退出:我怎么能这样做:

我的代码:

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;

解决方案是什么?

1 个答案:

答案 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}时创建新事件单击}按钮。

相关问题