-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

まず、Close2 番目の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で手動でスレッドを解放する必要があることに注意してください。を使用する場合は、スレッドのイベントにイベントを追加し、それを使用して、次にボタンがクリックされたときに新しいイベントを作成できるように設定する必要があります。OnCloseOnDestroyFreeOnTerminateOnTerminateFServiceThread := nil;Start

于 2013-06-17T14:59:31.553 に答える