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

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

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

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

Q&A

3回答

1330閲覧

C#について質問です

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2022/12/21 05:18

編集2022/12/21 05:52

イメージ説明### 前提

記載しているコードで問題なく実行できますが、ここに簡単なタイマー機能を追加したいです。
どうすればよいかご存じの方は、ご教示お願い致します。

実現したいこと

押しボタンスイッチAをクリック後、5秒後にパイロットランプAを点灯させたい。
また押しボタンスイッチAを再度クリックすると、5秒後にパイロットランプAを消灯させたい。

押しボタンスイッチBも同様のことをさせたい。

発生している問題・エラーメッセージ

現状はエラーは特にない。

該当のソースコード

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp18 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void progressBar1_Click(object sender, EventArgs e) { progressBar1.Minimum = 0; progressBar1.Maximum = 100; progressBar1.Value = 0; } private void button1_Click(object sender, EventArgs e) { if (progressBar1.Value == 100) { progressBar1.Value = 0; } else { progressBar1.Value = 100; } } private void label1_Click(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { if (progressBar2.Value == 100) { progressBar2.Value = 0; } else { progressBar2.Value = 100; } } private void label2_Click(object sender, EventArgs e) { } private void progressBar2_Click(object sender, EventArgs e) { progressBar2.Minimum = 0; progressBar2.Maximum = 100; progressBar2.Value = 0; } } }

試したこと

なし

補足情報(FW/ツールのバージョンなど)

windows 10
visual studio 2019
windowsフォームアプリケーション 
.NET Framework 4.7.2 で作成

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/12/21 05:20

何を何で作っているか質問欄を編集して追記してください。(例: Windows 10 の Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 で作っています・・・とか) ターゲットフレームワークというのは、Visual Studio のソリューションエクスプローラーでプロジェクト名を右クリックして出てくるメニューでプロパティを選んで表示すると「対象のフレームワーク」という項目があるので、それを見てください。
退会済みユーザー

退会済みユーザー

2022/12/21 05:20

コードの表示が乱れてますので直してください。
YAmaGNZ

2022/12/21 05:33

「C# タイマー」とでも検索してみてはどうですか?
Zuishin

2022/12/21 08:53 編集

タイマーのサンプルコードがたくさんみつかると思いますが、今は async/await の方が簡単かもしれません。 private async void button1_Click(object sender, EventArgs e) { await Task.Delay(5000); progressBar1.Value = 100 - progressBar1.Value; }
退会済みユーザー

退会済みユーザー

2022/12/22 22:13

質問者さん、追加質問にも回答したのでフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。無言で放置は NG です。
guest

回答3

0

押しボタンスイッチAをクリック後、5秒後にパイロットランプAを点灯させたい。
また押しボタンスイッチAを再度クリックすると、5秒後にパイロットランプAを消灯させたい。

「パイロットランプ」がトグル動作なのであれば、それを切り替えるボタンはCheckBoxのほうがよくないですか?
CheckBox クラス (System.Windows.Forms) | Microsoft Learn

CheckBoxをボタンの見た目に変更できます。
CheckBox.Appearance プロパティ (System.Windows.Forms) | Microsoft Learn

単に遅延させるだけなら、Task.Delayがお手軽じゃないでしょうか。
Task.Delay メソッド (System.Threading.Tasks) | Microsoft Learn

投げっぱなし(fire & forget)になってしまいますが、この場合は問題ないでしょう。

cs

1using System; 2using System.Drawing; 3using System.Threading.Tasks; 4using System.Windows.Forms; 5 6namespace Qeb3c4k0qk2sh0r 7{ 8 public partial class Form1 : Form 9 { 10 public Form1() 11 { 12 InitializeComponent(); 13 14 // デザイナで設定してもよい 15 checkBox1.Appearance = Appearance.Button; 16 checkBox1.TextAlign = ContentAlignment.MiddleCenter; 17 checkBox2.Appearance = Appearance.Button; 18 checkBox2.TextAlign = ContentAlignment.MiddleCenter; 19 } 20 21 private async void checkBox1_CheckedChanged(object sender, EventArgs e) 22 { 23 if (checkBox1.Checked) 24 { 25 await Task.Delay(TimeSpan.FromSeconds(5)); 26 progressBar1.Value = 100; 27 } 28 else 29 { 30 await Task.Delay(TimeSpan.FromSeconds(5)); 31 progressBar1.Value = 0; 32 } 33 } 34 35 private async void checkBox2_CheckedChanged(object sender, EventArgs e) 36 { 37 if (checkBox2.Checked) 38 { 39 await Task.Delay(TimeSpan.FromSeconds(5)); 40 progressBar2.Value = 100; 41 } 42 else 43 { 44 await Task.Delay(TimeSpan.FromSeconds(5)); 45 progressBar2.Value = 0; 46 } 47 } 48 } 49}

投稿2022/12/21 09:11

TN8001

総合スコア9317

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

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

0

押しボタンスイッチAをクリック後、5秒後にパイロットランプAを点灯させたい。

Timer を使ってはいかが? (以下の記事の「Windowsフォームの場合」セクション参照)

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
https://atmarkit.itmedia.co.jp/ait/articles/0511/11/news117.html

(1) Form に Timer をドラッグ&ドロップしたら Interval を 5000 に設定

(2) 「押しボタンスイッチA」の Click のイベントハンドラで Timer を Start() するコードを書く

C#

1private void button1_Click(object sender, EventArgs e) 2{ 3 timer1.Start(); 4}

(3) Tick イベントのハンドラを生成しその中で「パイロットランプAを点灯」するコードと Timer を Stop() するコードを書く

C#

1private void timer1_Tick(object sender, EventArgs e) 2{ 3 パイロットランプAを点灯するコード 4 5 timer1.Stop(); 6}

ここまでやったら、アプリを動かして「押しボタンスイッチA」をクリックしたら「5秒後にパイロットランプAを点灯」となることを確認してください。

また押しボタンスイッチAを再度クリックすると、5秒後にパイロットランプAを消灯させたい。

(4) 現在点灯中か否かを判別するフラグを Form に追加する。例えば private bool isLightOn;

(5) Tick イベントのハンドラのコードに手を加えて、フラグの状態に応じて「パイロットランプA」の点灯 / 消灯を切り替えるコードを書く

C#

1private void timer1_Tick(object sender, EventArgs e) 2{ 3 if (isLightOn) 4 { 5 パイロットランプAを消灯するコード 6 7 isLightOn = false; 8 } 9 else 10 { 11 パイロットランプAを点灯するコード 12 13 isLightOn = true; 14 } 15 16 timer1.Stop(); 17}

投稿2022/12/21 06:43

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2022/12/21 07:55

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp18 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void progressBar1_Click(object sender, EventArgs e) { progressBar1.Minimum = 0; progressBar1.Maximum = 100; progressBar1.Value = 0; } private void button1_Click(object sender, EventArgs e) { timer1.Start(); } private void label1_Click(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e) { timer2.Start(); } private void label2_Click(object sender, EventArgs e) { } private void progressBar2_Click(object sender, EventArgs e) { progressBar2.Minimum = 0; progressBar2.Maximum = 100; progressBar2.Value = 0; } private void timer1_Tick(object sender, EventArgs e) { if (progressBar1.Value == 100) { progressBar1.Value = 0; } else { progressBar1.Value = 100; } timer1.Stop(); } private void timer2_Tick(object sender, EventArgs e) { if (progressBar2.Value == 100) { progressBar2.Value = 0; } else { progressBar2.Value = 100; } timer2.Stop(); } } } 回答ありがとうございました。 上記のようなコードで作成したら、うまくいったのですが 最初にソフトを立ち上げた状態がパイロットランプA、Bともに点灯しています。 これはどのように改善すればよいのでしょうか?
退会済みユーザー

退会済みユーザー

2022/12/21 08:05

初期状態はprogressBar1_Click内のprogressBar1.Value = 0;      progressBar2_Click内のprogressBar2.Value = 0; で定義したつもりなのですが なぜか初期状態がパイロットランプA、Bともに点灯しています。 ご回答宜しくお願い致します。
退会済みユーザー

退会済みユーザー

2022/12/21 08:38 編集

ProgressBar の Click イベントを使って何をするつもりですか? 質問に書いてあるようなことをするのには全くそんなイベントは必要ないはずですが? パイロットランプというのは ProgressBar のことで、「点灯」というのはその Value プロパティが 100、「消灯」というのは 0 の時のことを言っているのですよね。 ProgressBar の Value プロパティはデフォルトで 0 です。Minimum プロパティのデフォルトは 0 で、Maximum プロパティのデフォルトは 100 です。フォームにドラッグ&ドロップした時点でそうなってます。 なので初期値は何も設定する必要はなく Value は 0 すなわち「消灯」状態になっているはずです。そうなっていないのはあなたがどこかで Value を 100 に設定したとしか思えません。
KOZ6.0

2022/12/21 10:08

timer1/timer2 の Enabled プロパティを true にしていませんか?
退会済みユーザー

退会済みユーザー

2022/12/22 22:14

質問者さん、その後無言ですが、追加質問にも回答したのでフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。無言で放置は NG です。
guest

0

ここに簡単なタイマー機能を追加したいです。

ツールボックスの中に、Timerってのがありますよ

投稿2022/12/21 05:59

y_waiwai

総合スコア87747

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問