質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

2回答

3424閲覧

C# フォームをタイマを利用して閉じたい

basscl

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2021/07/06 07:04

現在C#で
①プログラム起動時にMainフォーム(frmMain)が現れる。
②そのMainフォームから別のフォームを現す。
③その別のフォーム(frmStart)は15秒経過したら、閉じる
のようなことを行いたいです。

しかし、下のようにタイマ内でCloseするとできません。
何が悪いのでしょうか?
もしよろしければアドバイスなどいただきたいです。
お願いいたします。

public partial class frmMain : Form { public frmMain() { InitializeComponent(); } private void frmMain_Load(object sender, EventArgs e) { WriteLog("\r\n☆-----------------------起動開始-----------------------☆"); frmStart.Show(); } //以下タイマ処理。ここでは一度だけ呼び出し。タイマ関数内で再帰呼び出しを実行 var timer = new System.Threading.Timer(TimerCallback); timer.Change(0, Timeout.Infinite);//第一引数は、1回目の実行までの待機時間。第二引数は、それ以降のループ間隔。 } public partial class frmStart : Form { static int CountDown = 0; static string label1Text; public frmStart() { InitializeComponent(); } static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer(); private void frmStart_Load(object sender, EventArgs e) { myTimer.Tick += new EventHandler(TimerEventProcessor); myTimer.Interval = 1000; myTimer.Start(); } private static void TimerEventProcessor(Object myObject,EventArgs myEventArgs) { CountDown++; Console.WriteLine(CountDown); if (CountDown>=15) { GlobalVariables.OpenTimeLagFlg = true; Console.WriteLine("15秒経過したので終了"); myTimer.Stop(); This.close(); } } コード

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

juner

2021/07/06 07:27

`しかし、下のようにタイマ内でCloseするとできません。` の「できません」というのは、「15秒待ち続けても閉じることが無い」、「15秒後にエラーとなって閉じることが無い」 のどちらでしょうか?
neconekocat

2021/07/06 07:41 編集

まずこのコードはコンパイル通りますか? 一応言っておくとTickイベントで自殺させることは 何の問題もなく可能です。
gentaro

2021/07/06 07:40

中途半端にコードを編集して載せてるっぽい。 ぱっと見ただけでも確実にコンパイルエラーになるコード。
basscl

2021/07/06 08:49

すみません、こkのコード自体は一部修正させたものです。 また、できない というのは、「15秒待っても閉じない」 です。
neconekocat

2021/07/06 08:54

みんなが言ってるくらい明らかに「一部」修正どころではないんですよ。 ソースを丸コピして提示しないなら修正前のコードがおかしい、で解散です。 回答でも言われてますが、Tick中にthis.Close()は問題なく動作しますので。
gentaro

2021/07/06 10:44

問題の本質がわかってないのにコードを編集して(しかも間違った形で)提示しても、読んだ側に伝わるわけないので、あなたがよっぽど腕に自信があって自分は完璧に問題を把握している、という場合以外は編集せずにコードを載せましょう。 そのままなら長すぎる場合、現象が再現する最小限のコードを作って自分で動かしてみてから質問しましょう。(この過程を経るだけでも実力が身につきます)
guest

回答2

0

ベストアンサー

コードを提示する場合は、できるだけコンパイルが通る形でお願いしたいです。

  • frmStart.Show() どっかで作ったfrmStartクラスのインスタンス?それともstaticメソッド??
  • var timerの行のようにメソッド外に処理が書いてある
  • This.close()って何?

イベントハンドラ等がstaticですが、これは意図してやってるんでしょうか?

少なくとも普通に作った場合は、想定通り閉じます。

cs

1using System; 2using System.Windows.Forms; 3 4namespace Questions347963 5{ 6 public partial class Form1 : Form 7 { 8 public Form1() 9 { 10 InitializeComponent(); 11 Load += Form1_Load; 12 } 13 14 private void Form1_Load(object sender, EventArgs e) 15 => new Form2().Show(); 16 } 17}

cs

1using System; 2using System.Diagnostics; 3using System.Windows.Forms; 4 5namespace Questions347963 6{ 7 public partial class Form2 : Form 8 { 9 private int countDown; 10 private readonly Timer myTimer = new Timer { Interval = 1000, }; 11 12 public Form2() 13 { 14 InitializeComponent(); 15 Load += Form2_Load; 16 } 17 18 private void Form2_Load(object sender, EventArgs e) 19 { 20 myTimer.Tick += MyTimer_Tick; 21 myTimer.Start(); 22 } 23 24 private void MyTimer_Tick(object sender, EventArgs e) 25 { 26 countDown++; 27 Debug.WriteLine(countDown); 28 if (countDown >= 15) 29 { 30 Debug.WriteLine("15秒経過したので終了"); 31 myTimer.Stop(); 32 Close(); 33 } 34 } 35 } 36}

投稿2021/07/06 09:24

編集2023/07/27 16:31
TN8001

総合スコア9756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

提示されたソースはコンパイルできません。
動作するコードをコピペするようにしてください。

エラーとなる部分を修正して実行した結果正常に動作しました。
frmStartのLoadイベントのイベントハンドラは設定しましたか?
ご自身のプログラムが実際にどのように動作しているのかデバッガでステップ実行するなりして動作を確認するようにしてください。

投稿2021/07/06 07:40

YAmaGNZ

総合スコア10465

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問