人気ブログランキング | 話題のタグを見る
Delphi XE Pro - ステータスバーの表示を数秒後に消すには?[3秒後にしました]
ステータスバーの表示を数秒後に消すには?
と任意の秒数後に表示を消したい的な質問して回答をいただました。

しかし処理した内容(途中経過)の表示に使おうとして実行したら例外が出るようになってしまって
どうしたらいいのかわからないので手に負えないのでソースから削除しました(´;ω;`)

でTwitterでDEKOさんの回答の参照先の筆者さんのLynaさんから以下のような助言をもらった。
「OnTimer内でTimer1.Enabled:=False;とした上で目的の処理を続けて書くと良いと思います。」
ので書き直してみた。

フォームに Timer を貼ってプロパティの Interval には 3秒 という意味の3000と入れてます。
Delphi XE Pro - ステータスバーの表示を数秒後に消すには?[3秒後にしました]_b0003577_21221434.png
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if not (StatusBar1.SimpleText ='') then
begin
Timer1.Enabled := false;
StatusBar1.SimpleText :='';
end;
end;
として試しにFormCreateする時に
StatusBar1.SimpleText :='テスト中'; 
と入れると起動後3秒後にステータスバーから「テスト中」という文字列は消えました。
しかしこれだとTimerが止まっているので他のところのボタンとかに
StatusBar1.SimpleText :='2回目のテスト'; 
と入れても消えてくれません。
消えるようにするにはTimerを動かすようにするために
StatusBar1.SimpleText :='2回目のテスト'; 
と書く前に
Timer1.Enabled := True;
を入れないといけません。

しかしいちいちいろんなところで
Timer1.Enabled := True;
StatusBar1.SimpleText :='hogehoge';
を書き込むのは面倒なので以下のようにまとめてみました。
procedure TForm1.StatusBarInfo(i: Integer);
begin
Timer1.Enabled := True;
case i of
0 : StatusBar1.SimpleText :=''; // Clear
1 : StatusBar1.SimpleText :='ファイルパスを確認しました';
2 : StatusBar1.SimpleText :='ファイルをダウンロードが完了しました';
3 : StatusBar1.SimpleText :='';
4 : StatusBar1.SimpleText :='';
5 : StatusBar1.SimpleText :='';
6 : StatusBar1.SimpleText :='';
7 : StatusBar1.SimpleText :='';
8 : StatusBar1.SimpleText :='';
9 : StatusBar1.SimpleText :='99999';
else
begin
ShowMessage('無設定ですよ');

StatusBarInfo(0);
end;
end;

end;

Timerを動かして文字列を書き込んでTForm1.Timer1TimerでTimerを止めた後にステータスバーから文字列を削除されるはず。
で他のところからは「StatusBarInfo(数字)」で呼びたいメッセージ番号を書くという感じにしてみました。
たぶんこのソース、まだ改良点があるんだろうなぁ・・・。

2013年4月30日追記その1: with do文を使ってみた。
procedure TForm1.StatusBarInfo(i: Integer);
begin
Timer1.Enabled := True;
with StatusBar1 do
begin
case i of
0 : SimpleText :=''; // Clear
1 : SimpleText :='ファイルパスを確認しました';
2 : SimpleText :='ファイルをダウンロードが完了しました';
3 : SimpleText :='';
4 : SimpleText :='';
5 : SimpleText :='';
6 : SimpleText :='';
7 : SimpleText :='';
8 : SimpleText :='';
9 : SimpleText :='99999';
10: SimpleText :='';
else
begin
ShowMessage('無設定');

StatusBarInfo(0);
end;
end;
end
end;
上記のようなwith do文を使っている中に
10:StatusBar1.SimpleText :='';
として潜り込ませてみも動いたのはちょっとビックリしたw

2013年4月30日追記その2:
button1をクリックして「StatusBarInfo(1) の文字列」と「StatusBarInfo(2) の文字列」を続けて表示したい場合に
処理;
StatusBarInfo(1);
処理;
処理;
StatusBarInfo(2);
処理;
と書くとStatusBarInfo(1);のタイマーが有効のままStatusBarInfo(2);が呼ばれるので実行時には一瞬変わったかも?と思うぐらいの時間しか「StatusBarInfo(2) の文字列」が表示されません。
ぼけーっと見ていたら「StatusBarInfo(2) の文字列」が表示されずに消えますw
この様にならない為に
処理;
StatusBarInfo(1);
処理;
処理;
Timer1.Enabled := False; // 一旦タイマーを止める意味で無効にする。
StatusBarInfo(2);
処理;
と書くと「StatusBarInfo(1) の文字列」と「StatusBarInfo(2) の文字列」がちゃんと表示される。
// 2013年4月30日追記終わり




以下は勘違いかもですが、
intervalに設定した秒数だけメインの処理が止まっているような気がしたのは気のせいでしょうか?
まぁメインの処理を非表示にするという(svnに丸投げ)プログラムにしているのでわからないというアプリなので確信が取れないですけども(苦笑)

ってこの記事を書いていたら助監督 さんからの新しい回答が増えてたw

by arigayas | 2013-04-27 21:18 | Delphi Programming | Trackback
<< Delphi XE Pro -... Delphi XE Pro -... >>