一括処理をした後に
「StatusBar1.SimpleText :='完了しました';」と表示して
任意の秒数が経ったら
「StatusBar1.SimpleText :='';」を実行して表示を消したい場合
どうすれば良いのでしょうか?
環境はDelphi XE Proです。
Timerを使えば任意の秒数で、Ontimerイベントが発生するので
そこにStatusBar1.SimpleText :='';を書けばいけるかと思います。
Timerの使い方がよくわからないです・・・。
例えば
procedure TForm1.StatusBarClear(i: Integer); // iは終了するまでの秒数
begin
{
Timerの使い方
}
StatusBar1.SimpleText :='';
end;
としたい場合どう書いたら良いのでしょうか?
書き忘れましたがフォームにはTimerコンポーネントを貼ってあります。
timerのintervalに任意の秒(1000で1秒)
procedure TForm1.Timer1Timer(Sender: TObject);
begin
StatusBar1.SimpleText :='';
end;
enableがfalseだとタイマー停止
箇条書きですが後は調べればすぐにでてくるかと思います
procedure TForm1.StatusBarClear(i: Integer); // iは終了するまでの秒数
begin
Timer1.Enabled := True;
Timer1.Interval := i * 2000;
StatusBar1.SimpleText :='';
Timer1.Enabled := False;
StatusBar1.SimpleText :='';
end;
と書いて StatusBarClear(3) と他の処理に書いてみましたが、
即時に文字列が消えてしまって、うまくいかないです。
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
上記コードの場合、フォームに TTimer を貼る必要はありません。
DEKO さんの書いたソースでうまくできました!
ありがとうございました。
MakeNotifyEventHandler は無名メソッドという物なのでしょうか?
> 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" でググると他にもいくつかあります。
# なんでもかんでも「無名メソッドで書け!」と言っているのではないですよ。
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;
記事を書きました
ステータスバーの表示を数秒後に消すには?[3秒後にしました] : arigayas の 雑記帳
http://arigayas.exblog.jp/20350365/
> DEKOさん、それは裏技中の裏技では…難し過ぎます。
> 無名メソッドならTimerを使うのをやめて、こちらの方法じゃないでしょうか。
スミマセン、調子に乗ってネタコードを書いてしましました。
混乱させて申し訳ありません。平にご容赦を m(_ _)m
マジレス (?) すると、TTimer というのは、
・タイマーの開始と終了は Enabled プロパティを True / False にする事で行う。
・指定時間が来たら OnTimer イベントを発生させる。
・Interval プロパティの値 はイベントを発生する間隔(ミリ秒)。
・OnTimer イベントはタイマーが停止されるまで繰り返し発生する。
というコンポーネントです。
# 具体的なコードは助監督さんが書かれた通りです。
それを踏まえた今回の質問の解決策は、
・ステータスバーに文字列を設定してタイマーを開始
・OnTimer が発生したらステータスバーの文字列をクリアしてタイマーを停止
という事になります。
ツイート | ![]() |