• 締切済み

続・タイマーとShowdialog(VB2010)

タイマーコントロールについて の続きになります。 一つ方法を考えました。いくつか問題ありですが・・。 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を使っても同じでした。

みんなの回答

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.5

オリジナルな動きをするなら、自分で用意したフォームに してしまえばいいと思いますけどね。 こちらで検証する時間は無いので幾つかポイントを書きます。 [スプラッシュウィンドウは、裏で起動フォームの準備を  するために表示するもの。] このため、スプラッシュウィンドウ表示中も起動フォームの 初期化処理を並行して実行できないといけません。 ShowDialog はユーザーの入力があるまでダイアログを表示 する為の命令で、親画面の処理が止まる可能性があります。 > #3 > スプラッシュ自体をメインスレッドとは別のスレッドで動かしているようですから その辺りを踏まえての発言かと思いますが、私からは ShowDialog を使わない方が良いのでは?という指摘だけ しておきます。 [ShowDialog は呼び出し側で Dispose する] このメソッド特有の仕様です。 http://msdn.microsoft.com/ja-jp/library/c7ykbedk.aspx >解説 > ダイアログ ボックスとして表示されているフォームは閉じられるのではなく非表示に > なるため、フォームがアプリケーションで不要になった場合は、そのフォームの > Dispose メソッドを呼び出す必要があります。 というところの注意点です。 もともと、ShowDialog は戻り値を取得する為に使いますので。 で、自分で作る場合の参考は、 http://dobon.net/vb/dotnet/form/splashwindow.html フォームクリックの動作にも対応してます。 。。。が、別スレッドを作るコードなので、中級者向けの 内容です。 AddHandler _mainForm.Activated のコードを削除すれば 要求通り? タイマーは。。。クリックして閉じるだけなら必要ないと思います。 最大表示時間の時間計測で使えばいいのでは?

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答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/categories/
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

プロジェクトのプロパティでスプラッシュを設定したのでは 先方の要求仕様を満足させられないようですよ >この時、スクリーンフォームがMe.ShowDialog()と書いてあるにもかかわらず、 >メインフォームとともに操作可能・・つまりモードレスであるShowで表示されるのです モードレスのように動くのはしょうがないです スプラッシュ自体をメインスレッドとは別のスレッドで動かしているようですから また MyApplicationのプロシージャsplashを呼び出している部分が無い様に思います また タイマーをスプラッシュに搭載しても MinimumSplashScreenDisplayTimeの経過後でないと Tickを実行しないですし、Tickイベントが発生したときには スプラッシュがDisposeされてしまっているとなりお手上げです

teruchan119
質問者

お礼

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

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

ん~ 何がしたいのでしょう? MinimumSplashScreenDisplayTimeはスプラッシュの『最小』表示時間の設定です 行いたいのは『最大』表示時間なのでしょうか 『Timerを使え』という要求が何を制御したいのかを明確にしましょう

teruchan119
質問者

補足

すみません。最早何がなんだか分からなくなってきてます。 > MinimumSplashScreenDisplayTimeはスプラッシュの『最小』表示時間の設定です 行いたいのは『最大』表示時間なのでしょうか 本来行いたいのはスプラッシュの表示時間の無期限化です。何もしなければデフォルトの2秒で閉じてメインフォームが表示されてしまうので、その時間制減を無効にしたいのです。 そしてスクリーンに設置してあるOKボタンを押せばスクリーンを閉じてメインフォームをアクティブ化させるようにしたいのです。しかしただMe.Closeだけで閉じるとメインフォームが表示されません。 そこでTimerのIntervalとスクリーンの表示時間に合わせ、次のIntervalが来たときにTimerを止めて、同時にスクリーンをShowDialogとして表示させれば、スクリーンとしての扱いは終わっているためスクリーンフォームのCloseメソッドで閉じれば何とかなるんじゃないかと考えたのですが。。。 Timerを使って一体何をするのか、ずっと考えているのですがさっぱりわかりません。だからこそこの前の質問で案を募っているのです。 Load とShowdialogを使えば簡単なんですが・・。先方がそう指示している以上、勝手に変えるわけにもいかないし・・ Timerを使えと言ってきたその人は経験・実力・知識ともに豊富らしいのですが、会社の中でもかなり厳しいことで有名で、上司でさえもボロボロに言い負かすんです。 時折ああしろこうしろとアドバイスめいたものを投げかけてくるのですが、それについて尋ねると「自分で考えろ」の一言で終わります。私だけではなく、誰に対してもそうなのです。 先ほど意を決してTimerが何を意味してるのか尋ねたのですが、睨まれて終わりました。 ので、やっぱりわからず・・

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

ダイアログをモーダルで機能させる場合、親フォームの情報が必要です。 親フォームからモーダルダイアログを表示する場合は勝手に親子関係が成立しますが、コードを見る限りではダイアログ側でタイマー管理していてダイアログ自身で表示するようですから、親子関係を明示的に設定する必要があります。 Parentプロパティに親フォームのオブジェクトを渡してやりましょう。 #普通は親フォームでタイマーもモーダルダイアログ表示も管理するモンだとは思いますが。

関連するQ&A

  • VBでの質問です

    VBでの質問です 5分を計るタイマーを作っていて5分たつと止まるプログラムを作っていて、コンマ以下のケタが長くて、しかも止まらない( Label1.Text = n5.Subtract(Now).ToStringをLabel1.Text = n5.Subtract(Now).TotalMinutesにしてIf Label1.Text = "00:00:00" ThenをIf Label1.Text = "0" Thenにした時は止まりました)ので止まるようにするにはどこを変えればいいですか? 教えてください 以下コードです Public Class Form1 Dim n5 As DatePrivate Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load n5 = Now.AddMinutes(5) Timer1.Interval = 1000 Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Label1.Text = n5.Subtract(Now).ToString If Label1.Text = "00:00:00" Then MsgBox("時間になりました。") Timer1.Stop() End If End Sub 長文ですいません

  • VB2008でフォームに文字列をスクロールさせたい

    VB2008でフォーム上に右~左にフェイドイン、フェイドアウトする 物を作ろうとしてるのですが、どうしてもわからないので書き込みしました。 フォーム1にテキストボックスとボタンがあり、 ボタンを押す事によりテキストボックスの文字列をフォーム2の画面上に 表示し、右~左(HTMLLで言うとキーマー)に動くようにしたいのですが 右からって事は一番右の値が+だと思うのですがフォーム2は大きさを自由に 変更できるので大きさをさらに大きくした場合途中で消えてしまいます。 あと、タイマーでするとタイマーが終わるまで実行できないので 文字が流れてる間もボタンを押す事にyの値を変えて、 複数実行させたいのです。 以下が試しに書いてみたプログラムです。 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim objG As Graphics objG = Form2.CreateGraphics() objG.Clear(Form2.BackColor) objG.DrawString(Text1.Text, Label1.Font, New SolidBrush(Label1.ForeColor), iLight, 50 + Form2.Width) iLight += -1 If iLight < -50 Then Timer1.Stop() End If objG.Dispose() End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Interval = 1 Timer1.Start() End Sub すみませんがよろしくお願いします。

  • form2がボタンを押すと消えてしまう

    vb2010で、作成しています。form1から、form2を呼び出し、okボタンまたは、cancelボタンを押すと、無条件でform2が消えてしまいます。私がしたいのは、form2(パスワード入力ウィンドウ)でテキストボックスにパスワードを入力してokボタンを押して、それが正しい(1234)ときのみform2を消去することです。現在のところ、入力したパスワードが間違っていてもokボタンを押すと、form2は消えてしまいます。 form1側のコードとform2側のコードは以下です。お手数ですが御教示いただけると幸いです。 /////////Form1 Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim f As New Form2() f.TextBox1.PasswordChar = "*"c '//入力文字をマスクする If f.ShowDialog(Me) = DialogResult.OK Then If f.TextBox1.Text = "1234" Then f.Dispose() End If End If End Sub End Class /////////Form2 Public Class Form2 Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click Dim f As Form1 f = Me.Owner Me.DialogResult = DialogResult.OK End Sub Private Sub btncancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btncancel.Click Dim f As Form1 f = Me.Owner Me.DialogResult = DialogResult.Cancel End Sub End Class

  • vbのsavefiledialogについて

    vbで、テキストボックスに、文字を入力し、ボタン2をクリックすると、ユーザーが指定したところに、指定した名前で、txt形式、html形式、doc形式(このうち、txtと、htmlは必須。)で保存するプログラムを作りたいと思っております。 サイトを見てみますが、なかなかよいものが見つかりません。どなたか教えてください。 書きかけのプログラムと、フォーム図を載せておきます。 また、変更した方がよければ、そちらもおしえてください。 Public Class Form1 Dim texta As String Dim a Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Button1.Text = "リセット" Button2.Text = "保存" texta = TextBox1.Text End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged texta = TextBox1.Text End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = "" End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click a = DialogResult SaveFileDialog1.OverwritePrompt = True SaveFileDialog1.FileName = "" SaveFileDialog1.Filter = "テキストファイル(*.txt)|*.txt|すべてのファイル(*.*)|*.*" a = SaveFileDialog1.ShowDialog If a = Windows.Forms.DialogResult.OK Then Label1.Text = IO.Path.GetDirectoryName(SaveFileDialog1.FileName) Label2.Text = IO.Path.GetFileName(SaveFileDialog1.FileName) Else Label1.Text = "キャンセルされました。" Label2.Text = "" End If End Sub End Class

  • VBでデバックするとエラーになる。

    VBでデバックすると下のようなエラーがでます ArgumentNullExceptionはハンドルされませんでした。 値を Null にすることはできません。 パラメーター名: activationContext VBを初めて日が浅いのでヘルプを読んでも意味が理解できませんでした。 なので、易しく回答してもらえると嬉しいです コードは下です Public Class Form1 'TextBox2に入力したURLをWebBrowser1で表示する Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click WebBrowser1.Navigate(TextBox2.Text) End Sub 'ブラウザ→戻るでWebBrowser1を処理する Private Sub 戻るToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 戻るToolStripMenuItem.Click WebBrowser1.GoBack() End Sub 'ブラウザ→進むでWebBrowser1を処理する Private Sub 進むToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 進むToolStripMenuItem.Click WebBrowser1.GoForward() End Sub 'ブラウザ→テキストボックスにURLを入力した時の処理 Private Sub ToolStripTextBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripTextBox1.Click WebBrowser1.Navigate(ToolStripTextBox1.Text) End Sub 'TextPageのタブをクリックした時のイベント Private Sub TabPage1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabPage1.Enter TextBox2.Visible = False Button1.Visible = False ブラウザToolStripMenuItem.Enabled = False 書式ToolStripMenuItem.Enabled = True ToolStripMenuItem1.Enabled = True End Sub 'BrowserPageのタブをクリックした時のイベント Private Sub TabPage2_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TabPage2.Enter TextBox2.Visible = True Button1.Visible = True ブラウザToolStripMenuItem.Enabled = True 書式ToolStripMenuItem.Enabled = False ToolStripMenuItem1.Enabled = False End Sub Private Sub 新規ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 新規ToolStripMenuItem.Click TextBox1.Text = ("") End Sub Private Sub 開くToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 開くToolStripMenuItem.Click Dim selectButton As DialogResult Dim filename As String selectButton = OpenFileDialog1.ShowDialog() filename = OpenFileDialog1.FileName If selectButton = DialogResult.OK Then Try TextBox1.Text = _ My.Computer.FileSystem.ReadAllText(filename, System.Text.Encoding.Default) Me.Text = "Visual Text" & filename Catch ex As Exception End Try End If End Sub Private Sub 保存ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 保存ToolStripMenuItem.Click Dim selectButton As DialogResult Dim filename As String selectButton = SaveFileDialog1.ShowDialog() filename = SaveFileDialog1.FileName If selectButton = DialogResult.OK Then Try My.Computer.FileSystem.WriteAllText(filename, TextBox1.Text, False, System.Text.Encoding.Default) Me.Text = "Visual Text" & filename Catch ex As Exception End Try End If End Sub Private Sub フォントToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles フォントToolStripMenuItem.Click Dim fd As New FontDialog() fd.Font = TextBox1.Font fd.Color = TextBox1.ForeColor fd.MaxSize = 19 fd.MinSize = 8 fd.FontMustExist = True fd.AllowVerticalFonts = False fd.ShowColor = True fd.ShowEffects = True fd.FixedPitchOnly = False fd.AllowVectorFonts = True If fd.ShowDialog() <> DialogResult.Cancel Then 'TextBox1のフォントと色を変える TextBox1.Font = fd.Font TextBox1.ForeColor = fd.Color End If End Sub End Class

  • Labelの文字をスクロールする際にちらつきが・・・

    お世話になります。 フォームにあるラベルに文字を表示し、その文字をスクロールするプログラムを作成しました。 スクロールはできるのですが、スクロールする際に文字がちらついて(早い点滅のような感じ)しまいます。 どのようにすれば、ちらつきを無くすることができますか? よろしくお願いします。 (VB2008にて作成) Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Label1.Text = "文字のスクロール" 'タイマーのインターバルで文字の進む速度が決まります Timer1.Interval = 5 Timer1.Start() End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick Dim objG As Graphics objG = Label1.CreateGraphics() 'ここで一旦クリアしないと真っ黒になります objG.Clear(Label1.BackColor) '左端を決めて、文字を描画する objG.DrawString(Label1.Text, Label1.Font, New SolidBrush(Label1.ForeColor), iLeft, 0) '左端をずらす iLeft += 1 If iLeft > Label1.Width Then '右端までいったら戻す iLeft = 0 End If objG.Dispose() End Sub

  • テキストファイルを読み込んで文字の動的表示をする方法を教えてください。

    Visual basic2005 Express Editionで、文字を動的に表示する方法は、 TextBoxとTimerをFormに貼り付けて、Timerのプロパティの動作の項目のEnabledをTrueにしてコードに Public Class Form1 Private hyouji As String = "テスト" Private nagasa As Integer = 0 Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick TextBox1.Text = Microsoft.VisualBasic.Left(hyouji, nagasa) nagasa += 1 If nagasa > Len(hyouji) Then nagasa = 0 End If End Sub End Class と入力すると出来ますが、テキストファイルを読み込んで文字を動的に表示する方法が分かりません。 教えてください。よろしくお願いします。

  • VB.NET:モーダルで表示したフォームを最小化

    Form2をForm1の所有として、モーダルで表示しました。 '------------------------ Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdChildMdl.Click  'Form2を開く  Dim frmN As New Form2  frmN.ShowDialog(Me) 'MeはForm1 End Sub '------------------------ Form2が最小化された時に、親フォームであるForm1も最小化させたいと思い、 Form2のResizeメソッドに以下のようなコードを書きました。 '------------------------ Private Sub Form2_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Resize  Select Case Me.WindowState   Case FormWindowState.Minimized    '親フォームも最小化((1))    Me.Owner.WindowState = FormWindowState.Minimized   Case FormWindowState.Maximized    '親フォームも最大化((2))    Me.Owner.WindowState = FormWindowState.Maximized   Case FormWindowState.Normal    '親フォームも通常サイズ((3))    Me.Owner.WindowState = FormWindowState.Normal  End Select End Sub '------------------------ しかし、(2)、(3)は問題なく実行できるのですが、 (1)を実行すると、自フォーム(Form2)が閉じてしまうのです。 そういう仕様なのでしょうか? ご存知の方、教えてください。よろしくお願いします。

  • Visual Basicがわかりません。

    Public Class Form1 Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint Dim GraphicsFun As System.Drawing.Graphics GraphicsFun = Me.CreateGraphics Dim PenColor As New System.Drawing.Pen _ (System.Drawing.Color.Black) GraphicsFun.DrawRectangle(PenColor, 30, 30, 450, 300) End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Timer1.Enabled = True End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick If PictureBox1.Left < 480 - PictureBox1.Width And PictureBox1.Top + 31 Then PictureBox1.Left = PictureBox1.Left + 1 Else If PictureBox1.Top < 330 - PictureBox1.Height Then PictureBox1.Top = PictureBox1.Top + 1 Else If PictureBox1.Left > 30 Then PictureBox1.Left = PictureBox1.Left - 1 Else If PictureBox1.Top > 30 And PictureBox1.Left + 31 Then PictureBox1.Top = PictureBox1.Top - 1 End If End If End If End If End Sub End Class ピクチャーボックスを四角形の中で右周りに枠の中をボタンを押すと回るようにしたいんですけど、2回目の動作と3回目の動作がかぶってしまい、うまくいきません。4回目の解決策を教えてください。また、ボタン2を押すと反対周りにピクチャーボックスが回る、コマンドを 教えてください。

  • nudMinuteNum.Valueコントロールについて

    nudMinuteNum.Valueコントロールについて nudMinuteNum.ValueコントロールとnudSecondNum.Valueコントロールについて 下記のような簡単なプログラムなのですが、 (http://www.microsoft.com/Japan/msdn/archive/student/challenge/chap4_vb/default.aspx のラーメンタイマーのプログラム) 「nudMinuteNum は分を入力する数値アップダウン コントロールの名前で~」 とありますが、nudMinuteNumコントロールをMSDNとかで調べても見つかりません。 どなたかすみませんが、どういうことかおおしえねがえませんでしょうか? Public Class Form1 Private SecCount As Integer ' 秒数をカウントする変数 Private WaitSecond As Integer ' タイマー停止時間を秒単位で記憶する変数 Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click ' 指定されたタイマー停止時間を秒単位で記憶 WaitSecond = nudMinuteNum.Value * 60 + nudSecondNum.Value ' 指定されたタイマー停止時間が 0 秒のときは開始処理をキャンセル If WaitSecond = 0 Then Exit Sub End If ' 秒数のカウントと表示を 0 に初期化 SecCount = 0 DigitalTimer.Second = 0 ' 指定されたタイマー停止時間を秒単位にしてプロパティに設定 'Timer1.Interval = (nudMinuteNum.Value * 60 + nudSecondNum.Value) * 1000 ' 表示画像を変更 PictureBox1.Image = My.Resources.Resources.調理中 ' [START] ボタンを無効化 btnStart.Enabled = False ' タイマーを開始 Timer1.Start() End Sub Private Sub DigitalTimer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles DigitalTimer.Load End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick SecCount = SecCount + 1 DigitalTimer.Second = SecCount If SecCount = WaitSecond Then ' 表示画像を変更 PictureBox1.Image = My.Resources.Resources.完成 ' タイマーを停止 Timer1.Stop() ' [START] ボタンを有効化 btnStart.Enabled = True End If End Sub End Class

専門家に質問してみよう