タイマーコントロールについて の続きになります。
一つ方法を考えました。いくつか問題ありですが・・。
ApplicationEvent.vbの部分を
Namespace My
Partial Friend Class MyApplication
Protected Overrides Function OnInitialize( _
ByVal commandLineArgs As _
System.Collections.ObjectModel.ReadOnlyCollection(Of String) _
) As Boolean
'スプラッシュウィンドウを表示する最短時間を0.5秒にする
Me.MinimumSplashScreenDisplayTime = 500
Return MyBase.OnInitialize(commandLineArgs)
End Function
'スプラッシュスクリーンのタイマーコントロール設定
Friend Sub Splash()
With SplashScreen1.Timer1
.Enabled = True
.Interval = 500
End With
SplashScreen1.Timer1.Start()
End Sub ' この書き方あってますか?とりあえずは反映されてるようですけれど・・・
End Class
End Namespace
SplashScreen1の部分を
Public Class SplashScreen1
Friend Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' クリックで閉じる
DialogResult = DialogResult.OK
Me.Close()
End Sub
Friend Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
' タイマーコントロール発動時、瞬時に停止させる。スクリーンは消えないように。
Me.Timer1.Enabled = False
Me.ShowDialog()
End Sub
End Class
と、してみましたが・・・問題が発生するのです。
この時、スクリーンフォームがMe.ShowDialog()と書いてあるにもかかわらず、
メインフォームとともに操作可能・・つまりモードレスであるShowで表示されるのです。上記のコードを実行してもらえれば分かると思いますが・・。
また、メインフォームが前方に、スクリーンフォームが後方に行ってしまいます。これはどのようにすれば良いでしょうか?
Me.TopMost = True としても駄目でした。 BringToFrontを使っても同じでした。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.5
- 回答日時:
オリジナルな動きをするなら、自分で用意したフォームに
してしまえばいいと思いますけどね。
こちらで検証する時間は無いので幾つかポイントを書きます。
[スプラッシュウィンドウは、裏で起動フォームの準備を
するために表示するもの。]
このため、スプラッシュウィンドウ表示中も起動フォームの
初期化処理を並行して実行できないといけません。
ShowDialog はユーザーの入力があるまでダイアログを表示
する為の命令で、親画面の処理が止まる可能性があります。
> #3
> スプラッシュ自体をメインスレッドとは別のスレッドで動かしているようですから
その辺りを踏まえての発言かと思いますが、私からは
ShowDialog を使わない方が良いのでは?という指摘だけ
しておきます。
[ShowDialog は呼び出し側で Dispose する]
このメソッド特有の仕様です。
http://msdn.microsoft.com/ja-jp/library/c7ykbedk …
>解説
> ダイアログ ボックスとして表示されているフォームは閉じられるのではなく非表示に
> なるため、フォームがアプリケーションで不要になった場合は、そのフォームの
> Dispose メソッドを呼び出す必要があります。
というところの注意点です。
もともと、ShowDialog は戻り値を取得する為に使いますので。
で、自分で作る場合の参考は、
http://dobon.net/vb/dotnet/form/splashwindow.html
フォームクリックの動作にも対応してます。
。。。が、別スレッドを作るコードなので、中級者向けの
内容です。
AddHandler _mainForm.Activated のコードを削除すれば
要求通り?
タイマーは。。。クリックして閉じるだけなら必要ないと思います。
最大表示時間の時間計測で使えばいいのでは?
No.4
- 回答日時:
やはり 勝手に作られるスプラッシュをどうこうしようというのは無理があるようですね
ShowDialogが妥当な線のようですよ
そうか Startupイベントで スプラッシュのオブジェクトを生成してという方法でしょうか
この場合 プロジェクトのプロパティのスプラッシュは『(なし)』の設定です
dim splash as new SplashScreen1
splash.Show()
do while splush.Visible
// 他のアプリを止めないようにSleepを使う
ThreadingThreadSleep(100)
// ボタンのクリックなどを受け取るため
DoEvents()
Loop
といった具合にするかでしょう
ココよりも MSDNフォーラムの方がいいかもしれないですよ
参考URL:http://social.msdn.microsoft.com/Forums/ja-JP/ca …
No.3
- 回答日時:
プロジェクトのプロパティでスプラッシュを設定したのでは 先方の要求仕様を満足させられないようですよ
>この時、スクリーンフォームがMe.ShowDialog()と書いてあるにもかかわらず、
>メインフォームとともに操作可能・・つまりモードレスであるShowで表示されるのです
モードレスのように動くのはしょうがないです
スプラッシュ自体をメインスレッドとは別のスレッドで動かしているようですから
また MyApplicationのプロシージャsplashを呼び出している部分が無い様に思います
また タイマーをスプラッシュに搭載しても MinimumSplashScreenDisplayTimeの経過後でないと
Tickを実行しないですし、Tickイベントが発生したときには スプラッシュがDisposeされてしまっているとなりお手上げです
No.2
- 回答日時:
ん~ 何がしたいのでしょう?
MinimumSplashScreenDisplayTimeはスプラッシュの『最小』表示時間の設定です
行いたいのは『最大』表示時間なのでしょうか
『Timerを使え』という要求が何を制御したいのかを明確にしましょう
この回答への補足
すみません。最早何がなんだか分からなくなってきてます。
>
MinimumSplashScreenDisplayTimeはスプラッシュの『最小』表示時間の設定です
行いたいのは『最大』表示時間なのでしょうか
本来行いたいのはスプラッシュの表示時間の無期限化です。何もしなければデフォルトの2秒で閉じてメインフォームが表示されてしまうので、その時間制減を無効にしたいのです。
そしてスクリーンに設置してあるOKボタンを押せばスクリーンを閉じてメインフォームをアクティブ化させるようにしたいのです。しかしただMe.Closeだけで閉じるとメインフォームが表示されません。
そこでTimerのIntervalとスクリーンの表示時間に合わせ、次のIntervalが来たときにTimerを止めて、同時にスクリーンをShowDialogとして表示させれば、スクリーンとしての扱いは終わっているためスクリーンフォームのCloseメソッドで閉じれば何とかなるんじゃないかと考えたのですが。。。
Timerを使って一体何をするのか、ずっと考えているのですがさっぱりわかりません。だからこそこの前の質問で案を募っているのです。
Load とShowdialogを使えば簡単なんですが・・。先方がそう指示している以上、勝手に変えるわけにもいかないし・・
Timerを使えと言ってきたその人は経験・実力・知識ともに豊富らしいのですが、会社の中でもかなり厳しいことで有名で、上司でさえもボロボロに言い負かすんです。
時折ああしろこうしろとアドバイスめいたものを投げかけてくるのですが、それについて尋ねると「自分で考えろ」の一言で終わります。私だけではなく、誰に対してもそうなのです。
先ほど意を決してTimerが何を意味してるのか尋ねたのですが、睨まれて終わりました。
ので、やっぱりわからず・・
No.1
- 回答日時:
ダイアログをモーダルで機能させる場合、親フォームの情報が必要です。
親フォームからモーダルダイアログを表示する場合は勝手に親子関係が成立しますが、コードを見る限りではダイアログ側でタイマー管理していてダイアログ自身で表示するようですから、親子関係を明示的に設定する必要があります。
Parentプロパティに親フォームのオブジェクトを渡してやりましょう。
#普通は親フォームでタイマーもモーダルダイアログ表示も管理するモンだとは思いますが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) Visual Basic : ImageListの画像がそろったときにメッセージを表示 1 2023/07/20 13:53
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) エクセルで、1つのセルで上書き足し算して セルの範囲を指定できますか? パソコン初心者です。 お時間 3 2023/07/05 06:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
クリックイベントなのに、2回ク...
-
エクセルVBAのフォームを最...
-
MSGBOXのフォント大きさ変更
-
モーダルフォームとモードレス...
-
VBAでユーザーフォームを再表示...
-
VBAのテキストフォームの折り返...
-
ユーザーフォームのテキストボ...
-
テキストボックス入力データの...
-
EXCEL ユーザーフォームのタイ...
-
Excelにて、ユーザーフォームで...
-
フォームのテキストボックスな...
-
'ユーザーフォーム右上隅の[×...
-
ユーザーフォーム上に現在日時...
-
VBAで画像を表示する方法
-
VBでテトリスを作りたいのです...
-
フォームの二重起動の阻止
-
Form_Load と Form_Activate の...
-
Hideについて(.NET)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユーザーフォームを表示中にシ...
-
ExcelVBAのユーザーフォームの...
-
ユーザーフォームのテキストボ...
-
クリックイベントなのに、2回ク...
-
MSGBOXのフォント大きさ変更
-
VBAでユーザーフォームを再表示...
-
Hideについて(.NET)
-
Form_Load と Form_Activate の...
-
モーダルフォームとモードレス...
-
コントロールの存在確認
-
ユーザーフォーム上に現在日時...
-
【VBAユーザーフォームで閉じる...
-
エクセルVBAのフォームを最...
-
ACCESSのフォーム、開くんです...
-
Microsoft Formsの「個人情報や...
-
VBA(エクセル)のユーザー...
-
フォームウィンドウを最前面に...
-
ユーザーフォームのラベルに時...
-
'ユーザーフォーム右上隅の[×...
-
Excelにて、ユーザーフォームで...
おすすめ情報