-2

Label で TTimer のカウントダウンを表示することは可能ですか? ラベルキャプションに変数を即座に配置するように。どうすればいいのか考えていたのですが、フォームで目に見えるカウントダウンをやろうとしています。

4

2 に答える 2

3

Ken White が言ったように、a にTTimerは「カウントダウン」がありません。ただし、もちろん、アプリケーションに「カウントダウン」を実装することは可能です。以下は、これを行う 1 つの方法の例です。

  1. 新しい VCL アプリケーションを作成します。

  2. という名前のプライベート整数変数FCountをフォーム クラスに追加します。

  3. OnCreateフォームのイベント ハンドラーとして次のコードを使用します。

 

procedure TForm1.FormCreate(Sender: TObject);
begin
  FCount := 10;
  Randomize;
end;
  1. OnPaintイベント ハンドラーとして次のコードを使用します。

 

procedure TForm1.FormPaint(Sender: TObject);
var
  R: TRect;
  S: string;
begin

  Canvas.Brush.Color := RGB(Random(127), Random(127), Random(127));
  Canvas.FillRect(ClientRect);

  R := ClientRect;
  S := IntToStr(FCount);
  Canvas.Font.Height := ClientHeight div 2;
  Canvas.Font.Name := 'Segoe UI';
  Canvas.Font.Color := clWhite;
  Canvas.TextRect(R, S, [tfCenter, tfSingleLine, tfVerticalCenter]);

end;
  1. フォームに a を追加しTTimer、次のコードをそのOnTimerハンドラーとして使用します。

 

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  if FCount = 0 then
  begin
    Timer1.Enabled := false;
    MessageBox(Handle, 'Countdown complete.', 'Countdown', MB_ICONINFORMATION);
    Close;
  end
  else
  begin
    Invalidate;
    dec(FCount);
  end;
end;
  1. InvalidateフォームのOnResizeハンドラーでメソッドを呼び出します。

  2. アプリケーションを実行します。

于 2015-11-26T22:45:17.320 に答える
1

FCount変数を取得して、物事を単純に保ちましょう。

ここでは、カウントが に達するとタイマーが停止します0

procedure TForm1.FormCreate(Sender: TObject);
begin
  FCount := 10;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  label1.Caption := IntToStr(FCount);
  Dec(FCount);
  if FCount < 0 then begin
    FCount := 10;
    Timer2.Enabled := False;
  end;
end;

以下は、 Andreas Rejbrandの回答から変数TThreadを取得することを回避するクラスに基づくアプローチを使用していますFCount

procedure TForm1.Button1Click(Sender: TObject);
begin
  TThread.CreateAnonymousThread(procedure
      var
        countFrom, countTo: Integer;
        evt: TEvent;
      begin
        countFrom := 10;
        countTo := 0;
        evt := TEvent.Create(nil, False, False, '');
        try
          while countTo <= countFrom do begin
            TThread.Synchronize(procedure
                begin
                  label1.Caption := IntToStr(countFrom);
                end);
            evt.WaitFor(1000);
            Dec(countFrom);
          end;
        finally
          evt.Free;
        end;
      end).Start;
end;
于 2015-11-27T13:59:35.997 に答える