• ベストアンサー

C#タイマーのギモン???

あるサブForm1でタイマーを使用し一定時間経過後に別のサブForm2を表示します サブForm1のタイマーが指定時間に達しない内にサブForm1の右上にあるクローズ釦(×印マーク)を押すとFrom1は消えます 私の私見(確信に近い意見)では、Form1消去によりタイマーもキャンセルされForm2は表示されることは無いと思います ← 昔からそのように思っておりました しかし想定された時間になるとForm2がパッと表示されます 何故でしょうか? 消えてしまったフォームのタイマーが活き続けているのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

そのタイマー (System.Windows.Forms.Timerを仮定します) は,どのように作ったタイマーですか。 デザイナで用意した物ではなく,自分の書いたコードでnewした物ではないでしょうか。 この場合,タイマーはFormに紐付きませんから,Formを閉じるときにタイマーを破棄しないといけません。 破棄しない場合,タイマーは生き続けます。 タイマーの破棄には,FormClosedイベントでDisposeメソッドを呼び出す方法の他, componentsにAddしておく,という方法もあります。 # デザイナで用意したタイマーは後者の方法で破棄されます。

sato-may
質問者

お礼

ご教授ありがとうございます タイマーはデザイナが用意したものを直接使っており、自作コードでnewしたものではありません しかしForm自体はnewしたものであったので、教えて頂いた中の紐付きにヒントを得てDisposeしてみました すると一発OKで解決することが出来ました 誠にありがとうございました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • フォームを閉じる時に保存するには?

    アクセスなのですが、右上のバツボタンでフォームを閉じる時に保存する方法はないのでしょうか? Private Sub Form_Close() DoCmd.Close acForm, Me.Name, acSaveYes End Sub これだとどうやらエラーになってしまいます。

  • Visual C#にてフォーム非表示時のタイマー

    Visual C# 2010でGUIプログラムを作っています。 フォームを最小化した時にタスクトレイにのみアイコンを表示する機能がついています。 タイマーで1分ごとに処理する必要があるのですが、最小化時(Form.visible = false)にだけ処理を実行してくれません。 最小化していない通常のフォーム表示の時はタイマーが正常に動作し、1分ごとに一定の処理をしてくれます。 目的は最小化時にタスクトレイにのみアイコンを表示し、1分ごとに処理をし、 特定の条件に当てはまった場合はアイコンの上にバルーン表示する事です。 タスクトレイにのみ表示している時でもタイマーで一定時間ごとに処理することはできた気がするのですが、 何が原因かわかりませんがいつの間にか出来なくなっていました。 どういった対策をすればよいでしょうか? private void Form1_Resize(object sender, EventArgs e) { if (OptionData.TaskTray == true) { if (this.WindowState == FormWindowState.Minimized) { //フォームを非表示にする this.Visible = false; //タスクトレイにアイコンを表示する notifyIcon1.Visible = true; } } } private void timer1_Tick(object sender, EventArgs e) { DataUpdateButton.PerformClick(); } private void notifyIcon1_DoubleClick(object sender, EventArgs e) { //フォームを表示する this.Visible = true; if (this.WindowState == FormWindowState.Minimized) { //ノーマルウィンドウに戻す this.WindowState = FormWindowState.Normal; //アクティブにする this.Activate(); if (OptionData.NoTaskTrayIcon == true) { //タスクトレイからアイコンを削除する notifyIcon1.Visible = false; } } }

  • タイマーの使い方

    VB初心者です(6.0を使っています) タイマーの使い方がよく分かっていません。 ボタンを押してからの経過時間をラベルに表示させたいと思っているのですが、 ----------------------------------------------- Private Sub Command1_Click()   Timer1.Interval = 1000   処理1   処理2    ・    ・    ・   Timer1.Interval = 0 End Sub Private Sub Timer1_Timer()   Label1.Caption = [経過時間] End Sub ----------------------------------------------- という感じに書いていると、[処理1]~をしている間はラベルが表示されなくて、 最後の[処理]が終わった直後の[経過時間]のみが表示されます。 こういう形ではタイマーは使用できないのでしょうか? 他のWebサイトなども調べてみたのですが、解決できませんでした。 どなたか教えていただけませんでしょうか?

  • visualbasic2005のタイマーについて

    visualbasic2005で一定の時間間隔で処理を行うタイマーコントロールについて質問があります。このタイマー機能を使った場合、処理時間が厳密ではないということが分かりました。そこでマルチスレッドで厳密に一定時間間隔で処理を行う方法を考えています。マルチスレッドについてはvisualbasic2005ではBackground Workerというツールで可能だということが分かりました。しかし、Background Workerの中で一定時間間隔でメソッドを呼び出し処理をするプログラムの書き方がよく分かりません。 例えば、タイマーコントロールを用いずにマルチスレッドにより現在の時刻を表示するプログラムはどのようになるのでしょうか? お忙しい中申し訳ありませんが、お分かりになる方がいらっしゃいましたらよろしくお願いします。

  • Hideについて(.NET)

    Form1をHideで非表示にし、Form2を開いた後、再びForm1を表示したいのですがうまくいきません。 [form1のイベント] Dim frmForm2 as New Form2 frmForm2.Show Me.hide Sub End [form2のイベント] Dim frmForm1 as New Form1 frmForm1.Show Me.Close Sub End としてあります。 非表示されたフォームを再表示されずに、新しくフォームが開いてしまっていると考えられるんですが、どうしたらよいでしょうか? 

  • アクセスのタイマー間隔

    アクセス2003のタイマー間隔の実行で 何回実行したかカウントを取りたいのですが変数がクリアなるのか いきません。 フォームを開いた時 Dim a As Double a=0 Private Sub Form_Timer() Dim a As Double a = a + 1 MsgBox a End Sub 返し値がすべて 1になる ご伝授お願いします

  • タイマーソフト探しています

    こんにちわ 私が探すのが下手なのかもしれませんが、もし知っている方がいらっしゃいましたら教えてください。 タイトルの通り、タイマーソフトを探しています 一定の時間を入力したら(目標時間やあと何分といったように)その時間までを、棒グラフが伸びていく、またはコップに入った水がたまっていくみたいな(円グラフでもいいですね)表示がされるタイマーが欲しいのです (表現が難しいですがなんとなくわかっていただけると嬉しいです) 数字で残り時間を感じるのではなく、目視できる感じのものです よろしくお願いします。

  • 続・タイマーと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を使っても同じでした。

  • ユーザーフォームを起動しながらタイマーのマクロを動かしたい

    現在、ユーザーフォームで入力したデータを各セルに入れてくVBAを書いています。これ自体は問題ないのですが、同時にタイマーのマクロを起動させたいのですが書き方がさっぱりわかりません。 ネットで調べて、タイマーのマクロは書けました。 タイマーのマクロというのは、特定の時間になったらユーザーフォームで打ちこんだデータのブックを送付して特定の宛先にメールするというマクロです。 このタイマーのマクロ自体は普通に動くのですが、設定した時間にユーザーフォームが開かれてるとマクロが動いてくれません。 そしてユーザーフォームは常に開かれている状態なんです。 希望としてはユーザーフォームが開かれている(入力している)時でも、はじめにメッセージボックスなどで「今からメール送信します。しばらくお待ちください。」などとメッセージを出して現状まで入力済みのデータ(ブックを)メールを送信させることが出来るのが希望です。 タイマーのマクロはWorkbook_Openに 指定時刻 = TimeValue("07:30:00") 待ち時間 = TimeValue("00:01:00") Application.OnTime TimeValue(指定時刻), "SendMail", TimeValue(待ち時間)   Call 次のメール送信 みたいな感じで書いてます。 ユーザーフォームが開いている状態でタイマーのマクロ(他のマクロ)を動かすのって無理なんですか? ちなみに、不定期なタイマーの方法がわからなかったので、それもわかれば教えていただけませんか。 一定時間感覚のタイマーはあったのですが、不定期なタイマーのマクロが調べても見つからず… タイマーのマクロを何個も書いてなんとか、一つのタイマー処理が終わったら次のタイマーマクロを呼び出すって方法を取りました。 もし、もっと簡単な書き方などあったらアドバイスお願いします。

  • フォームを表示してからメッセージボックスを表示する

    メッセージボックスが表示される前に、フォームを表示させたいです。アクセスです。 ナビゲーションウインドウからフォームをダブルクリックしてフォームを開くのですが、 今のままだとメッセージボックスが表示されてからフォームが表示されてしまいます。 フォームを表示してからメッセージボックスを表示するにはどうすればいいでしょう? Private Sub Form_Open(Cancel As Integer) MsgBox "Form_Open" End Sub だと、先ほど述べたように、メッセージボックスが表示されてからフォームが表示されてしまいます。 フォームを開いたときのイベントは複数あるようで、 Private Sub Form_Activate() MsgBox "Form_Activate" Debug.Print "Form_Activate" End Sub Private Sub Form_Current() MsgBox "Form_Current" Debug.Print "Form_Current" End Sub Private Sub Form_GotFocus() MsgBox "Form_GotFocus" Debug.Print "Form_GotFocus" End Sub Private Sub Form_Open(Cancel As Integer) MsgBox "Form_Open" Debug.Print "Form_Open" End Sub Private Sub Form_Load() MsgBox "Form_Load" Debug.Print "Form_Load" End Sub をすると、 ・Form_Load ・Form_Activate ・Form_GotFocus ・Form_Open ・Form_Current の順に開きますが、やはりフォームが最後に表示されてしまいます。 どうにかして先にフォームを表示させる方法はないでしょうか? ご回答よろしくお願いします。

このQ&Aのポイント
  • お金があるけど身分相応に振る舞わない生き方について考えます。
  • お金には困っていないけど、普通の生活を送っている人の処世術について紹介します。
  • お金があるけど、身分相応にしない人がされる周囲の反応と、うまく対処する方法を探ります。
回答を見る