ステータスバーの表示を数秒後に消すには?

解決


arigayas  URL  2013-04-25 22:19:45  No: 44434

一括処理をした後に
「StatusBar1.SimpleText :='完了しました';」と表示して
任意の秒数が経ったら
「StatusBar1.SimpleText :='';」を実行して表示を消したい場合
どうすれば良いのでしょうか?

環境はDelphi XE Proです。


初心者  2013-04-25 23:03:30  No: 44435

Timerを使えば任意の秒数で、Ontimerイベントが発生するので
そこにStatusBar1.SimpleText :='';を書けばいけるかと思います。


arigayas  URL  2013-04-27 18:27:23  No: 44436

Timerの使い方がよくわからないです・・・。
例えば

procedure TForm1.StatusBarClear(i: Integer); //  iは終了するまでの秒数
begin
{
Timerの使い方
}
  StatusBar1.SimpleText :='';
end;

としたい場合どう書いたら良いのでしょうか?


arigayas  URL  2013-04-27 19:20:37  No: 44437

書き忘れましたがフォームにはTimerコンポーネントを貼ってあります。


初心者  2013-04-27 19:44:59  No: 44438

timerのintervalに任意の秒(1000で1秒)

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  StatusBar1.SimpleText :='';
end;

enableがfalseだとタイマー停止

箇条書きですが後は調べればすぐにでてくるかと思います


arigayas  URL  2013-04-27 23:12:34  No: 44439

procedure TForm1.StatusBarClear(i: Integer); //  iは終了するまでの秒数
begin
  Timer1.Enabled := True;
  Timer1.Interval := i * 2000;

  StatusBar1.SimpleText :='';
  Timer1.Enabled := False;

  StatusBar1.SimpleText :='';
end;
と書いて StatusBarClear(3) と他の処理に書いてみましたが、
即時に文字列が消えてしまって、うまくいかないです。


DEKO  2013-04-27 23:44:07  No: 44440

twiier 師匠、StatusBar1.SimpleText :=''; は
Timer1 の OnTimer イベントに書くのですよ。

一つの関数でやろうとするなら、

procedure PostStatusbarText(SB: TStatusBar; aText: string; aDispTime: Integer = 3);

...

procedure TForm1.PostStatusbarText(SB: TStatusBar; aText: string; aDispTime: Integer);
type
  TNotifyEventProc = reference to procedure(Sender: TObject);
var
  Timer: TTimer;
  {MakeNotifyEventHandler begin}
  function MakeNotifyEventHandler(const Proc: TNotifyEventProc): TNotifyEvent;
  var
    method: TMethod;
  begin
    method.Data := PPointer(@Proc)^;
    method.Code := PPointer(PByte(PPointer(PPointer(@Proc)^)^)+$C)^;
    Result := TNotifyEvent(method);
  end;
  {MakeNotifyEventHandler end}
begin
  SB.SimplePanel := True;
  SB.SimpleText  := aText;
  Timer := TTimer.Create(nil);
  Timer.Enabled := False;
  Timer.OnTimer := MakeNotifyEventHandler
                   (
                     procedure (Sender: TObject)
                     begin
                       SB.SimpleText := '';
                       Timer.Free;
                     end
                   );
  Timer.Interval := aDispTime * 1000;
  Timer.Enabled := True;
end;

これを書いておいて、

procedure TForm1.Button1Click(Sender: TObject);
begin
  PostStatusbarText(StatusBar1, 'Hello,World.');
end;

こんな感じで使います。

See Also:
[イベントハンドラを無名メソッドで書く。 - 全力わはー]
http://d.hatena.ne.jp/tales/20100105/1262689156


DEKO  2013-04-27 23:49:53  No: 44441

上記コードの場合、フォームに TTimer を貼る必要はありません。


arigayas  URL  2013-04-28 00:41:06  No: 44442

DEKO さんの書いたソースでうまくできました!
ありがとうございました。

MakeNotifyEventHandler は無名メソッドという物なのでしょうか?


DEKO  2013-04-28 00:56:19  No: 44443

> MakeNotifyEventHandler は無名メソッドという物なのでしょうか?
MakeNotifyEventHandler に "指定してあるのが" 無名メソッドです。
通常、イベントハンドラを無名メソッドで書くことはできないので、
らいなタンさんのコードを利用しています。

(普通、)TTimer を使う限りこの件は 
複数のメソッドとイベントハンドラを記述する必要があります。
これを無理矢理一つの関数でやっているのが上記コードです。

イベントハンドラを無名メソッドで書く他の実装もあります。例えば...

[VCL events with anonymous methods (Stack Overflow)]
http://stackoverflow.com/questions/8025481/vcl-events-with-anonymous-methods-what-do-you-think-about-this-implementation

"Delphi Anonymous Method Event Handler" でググると他にもいくつかあります。

# なんでもかんでも「無名メソッドで書け!」と言っているのではないですよ。


助監督  2013-04-28 05:16:41  No: 44444

DEKOさん、それは裏技中の裏技では…難し過ぎます。
無名メソッドならTimerを使うのをやめて、こちらの方法じゃないでしょうか。

DelphiのTThread.CreateAnonymousThreadと無名メソッドを使うと、簡単なスレッド処理なら手軽にかける - 山本隆の開発日誌
http://www.gesource.jp/weblog/?p=5093

というか、普通にTimerを使うのが一番簡単だと思いますよ >arigayasさん
関数とイベントハンドラで2個に分離してしまいますが。
※オブジェクトインスペクタでTimer1のEnabledをFalse、OnTimerをTimer1Timer、お忘れなく。

procedure TForm1.Button1Click(Sender: TObject);
begin
  StatusBar1.SimpleText :='完了しました';
  StatusBarClear(3);
end;

procedure TForm1.StatusBarClear(i: Integer); //  iは終了するまでの秒数
begin
  Timer1.Interval := i * 1000;
  Timer1.Enabled := True;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := False;
  StatusBar1.SimpleText :='';
end;


arigayas  URL  2013-04-28 06:43:42  No: 44445

記事を書きました

ステータスバーの表示を数秒後に消すには?[3秒後にしました] : arigayas の 雑記帳
http://arigayas.exblog.jp/20350365/


DEKO  2013-04-28 08:13:48  No: 44446

> DEKOさん、それは裏技中の裏技では…難し過ぎます。
> 無名メソッドならTimerを使うのをやめて、こちらの方法じゃないでしょうか。
スミマセン、調子に乗ってネタコードを書いてしましました。
混乱させて申し訳ありません。平にご容赦を m(_ _)m

マジレス (?) すると、TTimer というのは、
・タイマーの開始と終了は Enabled プロパティを True / False にする事で行う。
・指定時間が来たら OnTimer イベントを発生させる。
・Interval プロパティの値 はイベントを発生する間隔(ミリ秒)。
・OnTimer イベントはタイマーが停止されるまで繰り返し発生する。
というコンポーネントです。
# 具体的なコードは助監督さんが書かれた通りです。

それを踏まえた今回の質問の解決策は、
・ステータスバーに文字列を設定してタイマーを開始
・OnTimer が発生したらステータスバーの文字列をクリアしてタイマーを停止
という事になります。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加