dポイントプレゼントキャンペーン実施中!

タイマーコントロールについて の続きになります。

一つ方法を考えました。いくつか問題ありですが・・。
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件)

オリジナルな動きをするなら、自分で用意したフォームに


してしまえばいいと思いますけどね。

こちらで検証する時間は無いので幾つかポイントを書きます。

[スプラッシュウィンドウは、裏で起動フォームの準備を
 するために表示するもの。]
このため、スプラッシュウィンドウ表示中も起動フォームの
初期化処理を並行して実行できないといけません。
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 のコードを削除すれば
要求通り?

タイマーは。。。クリックして閉じるだけなら必要ないと思います。
最大表示時間の時間計測で使えばいいのでは?
    • good
    • 0

やはり 勝手に作られるスプラッシュをどうこうしようというのは無理があるようですね



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 …
    • good
    • 0

プロジェクトのプロパティでスプラッシュを設定したのでは 先方の要求仕様を満足させられないようですよ



>この時、スクリーンフォームがMe.ShowDialog()と書いてあるにもかかわらず、
>メインフォームとともに操作可能・・つまりモードレスであるShowで表示されるのです
モードレスのように動くのはしょうがないです
スプラッシュ自体をメインスレッドとは別のスレッドで動かしているようですから
また MyApplicationのプロシージャsplashを呼び出している部分が無い様に思います

また タイマーをスプラッシュに搭載しても MinimumSplashScreenDisplayTimeの経過後でないと
Tickを実行しないですし、Tickイベントが発生したときには スプラッシュがDisposeされてしまっているとなりお手上げです
    • good
    • 0
この回答へのお礼

Tickイベントはスプラッシュが閉じてから発生するのですね。スプラッシュが読み込まれてからかと思っていました。。

お礼日時:2011/12/04 11:06

ん~ 何がしたいのでしょう?



MinimumSplashScreenDisplayTimeはスプラッシュの『最小』表示時間の設定です
行いたいのは『最大』表示時間なのでしょうか

『Timerを使え』という要求が何を制御したいのかを明確にしましょう

この回答への補足

すみません。最早何がなんだか分からなくなってきてます。

>
MinimumSplashScreenDisplayTimeはスプラッシュの『最小』表示時間の設定です
行いたいのは『最大』表示時間なのでしょうか
本来行いたいのはスプラッシュの表示時間の無期限化です。何もしなければデフォルトの2秒で閉じてメインフォームが表示されてしまうので、その時間制減を無効にしたいのです。
そしてスクリーンに設置してあるOKボタンを押せばスクリーンを閉じてメインフォームをアクティブ化させるようにしたいのです。しかしただMe.Closeだけで閉じるとメインフォームが表示されません。

そこでTimerのIntervalとスクリーンの表示時間に合わせ、次のIntervalが来たときにTimerを止めて、同時にスクリーンをShowDialogとして表示させれば、スクリーンとしての扱いは終わっているためスクリーンフォームのCloseメソッドで閉じれば何とかなるんじゃないかと考えたのですが。。。

Timerを使って一体何をするのか、ずっと考えているのですがさっぱりわかりません。だからこそこの前の質問で案を募っているのです。
Load とShowdialogを使えば簡単なんですが・・。先方がそう指示している以上、勝手に変えるわけにもいかないし・・

Timerを使えと言ってきたその人は経験・実力・知識ともに豊富らしいのですが、会社の中でもかなり厳しいことで有名で、上司でさえもボロボロに言い負かすんです。
時折ああしろこうしろとアドバイスめいたものを投げかけてくるのですが、それについて尋ねると「自分で考えろ」の一言で終わります。私だけではなく、誰に対してもそうなのです。
先ほど意を決してTimerが何を意味してるのか尋ねたのですが、睨まれて終わりました。
ので、やっぱりわからず・・

補足日時:2011/12/03 15:19
    • good
    • 0

ダイアログをモーダルで機能させる場合、親フォームの情報が必要です。


親フォームからモーダルダイアログを表示する場合は勝手に親子関係が成立しますが、コードを見る限りではダイアログ側でタイマー管理していてダイアログ自身で表示するようですから、親子関係を明示的に設定する必要があります。

Parentプロパティに親フォームのオブジェクトを渡してやりましょう。

#普通は親フォームでタイマーもモーダルダイアログ表示も管理するモンだとは思いますが。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!