前回から引き続き、C#でWindows OSを時間指定してシャットダウンするアプリケーションを作成していきます。
アプリの最終的な完成イメージは以下の動画の通りです。
時間、分、秒を設定して、シャットダウンまでの時間を任意に指定、キャンセルすることができます。
第3回目となる今回は『見た目と機能としては完成』までをプログラミングします。
簡単なプログラムを徐々にステップアップさせていきますので、その過程でプログラミングに必要な基礎知識を身につけることができます。
作業時間としては30分程度です。
説明中の見えにくい画像はクリックすることで拡大できます。
前回作成したアプリ、今回作成するアプリ
前回は『コンボボックスから選択した時間でシャットダウン』までをプログラミングしました。
今回は『コンボボックスを追加して時間・分・秒を指定した時間でシャットダウン』までを作成します。
前回の手順を応用すればコンボボックスの追加はさほど難しくはありませんが、同じものをいくつも作ると、同じ作業を何度も行う手間が発生し、コーディングのミスの頻度も増えます。
今回はそんな何度も繰り返す作業の効率化についてもご紹介していきます。
前回の続きから機能を追加していくので、『時間を指定してシャットダウン』するアプリをまだ作成していない場合は、以下のリンクを参考に作成してください。
フォームのレイアウト
まずは下の画面を参考にフォームのレイアウトを行います。
それぞれ次のように設定します。番号は上の画面の赤字に対応しています。
番号 | ツール | プロパティ Name | プロパティ Text | 備考 |
---|---|---|---|---|
① | ComboBox | cb_Hour | (未入力) | 新規追加 |
② | ComboBox | cb_Min | (未入力) | 新規追加 |
③ | ComboBox | cb_Sec | (未入力) | 新規追加 |
④ | Label | l_Hour | 時間 | 新規追加 |
⑤ | Label | l_Min | 分 | 新規追加 |
⑥ | Label | l_Sec | 秒後 | 新規追加 |
⑦ | Button | b_Shutdown | シャットダウン開始 | button_Shutdownを変更 |
⑧ | Button | b_Cancel | シャットダウンをキャンセル | button_Cancelを変更 |
前回作成した『comboBox_Hour』は削除し、新たにコンボボックス3つを追加します。
名前は『comboBox_Hour』だと長いので『cb_Hour』に省略しました。
(comboBox_Hourを削除するとエラーが表示されますが、後ほど手を加えます。)
同様に『button_Shutdown』と『button_Cancel』は名前だけ変更して『b_Shutdown』『b_Cancel』としました。
コンボボックスのプロパティの[Item]と[Text]内はプログラム中で入力するので、未入力としてください。
今回初めて使用するLabelは他と同様に[ツールボックス]から[Label]を選択し、フォーム上に配置します。
これでフォームのレイアウトは完了です。
引き続きプログラミングを行います。
プログラミング
それではプログラミングに入ります。
プログラムコードを表示するには、画面右側の[ソリューションエクスプローラー]の[Form1.cs]を右クリックして[コードの表示]を選択するか、もしくはF7キーを押します。
今回もプログラムの解説は後述します。まずはプログラムを入力しましょう。
今回はこれまで触れてこなかった『Form1』に、次のようにコードを追加します。
public Form1()
{
InitializeComponent();
for (int i = 0; i <= 24; i++)
{
cb_Hour.Items.Add(i);
}
for (int i = 0; i < 60; i++)
{
cb_Min.Items.Add(i);
cb_Sec.Items.Add(i);
}
cb_Hour.SelectedIndex = 0;
cb_Min.SelectedIndex = 0;
cb_Sec.SelectedIndex = 0;
}
次に、ボタンをクリックした時に動作する処理(メソッド)を変更しますが、その前に今回はボタンの名前を『button_Shutdown』、『button_Cancel』から『b_Shutdown』、『b_Cancel』に変更しているので、メソッドの名前もあわせて変更してしまいましょう。
メソッドの名前を他のプログラムコードに影響のないように変更するには、下の画面のようにメソッド名を右クリックして[名前の変更]を選択するか、もしくはメソッド名を選択してF2キーで入力します。
それぞれ『b_Shutdown_Click』、『b_Cancel_Click』に変更しましょう。
それでは、ボタンを押したときの処理として、b_Shutdown_Clickの内容を変更します。
private void b_Shutdown_Click(object sender, EventArgs e)
{
System.Diagnostics.Process ShutDownProc
= new System.Diagnostics.Process();
ShutDownProc.StartInfo.FileName = "shutdown.exe";
ShutDownProc.StartInfo.Arguments
= "/s /t " + (int.Parse(cb_Hour.Text) * 60 * 60
+ int.Parse(cb_Min.Text ) * 60
+ int.Parse(cb_Sec.Text ));
ShutDownProc.Start();
}
これでプログラムは完成なので、実行してみましょう。
画面上部の▶ボタン、または[F5]キーを押します。
入力ミス等がなければ、作成したフォームが表示されます。
コンボボックスから時間を選んでボタンを押してみましょう。
シャットダウン通知や、シャットダウンのキャンセル通知は表示されたでしょうか?
以上で今回のプログラミングは終了です。おつかれさまでした。
解説
プログラムの解説をします。
前回までの復習として、コンボボックスに選択肢となる数字を追加するには、下の画面のように[プロパティ]の[Items]を編集する必要がありました。
また、コンボボックスに最初に表示する数字を[プロパティ]の[Text]に入力していましたが、今回はそのどちらも省略し、プログラム上で入力しています。
前回までの内容を思い出せない場合は、記事を復習してください。
コンボボックスにアイテムを追加
最初に[Form1]で記述したコードについて解説します。
まずは『cb_Hour.Items.Add(i);』についてですが、コンボボックスにアイテムを一つ追加する際に、『コンボボックス名.Items.Add(〇〇〇)』のように用い、( )内に追加する文字列を入力します。
たとえば、単純に[cb_Hour]に0~24の数字を追加したい場合は、次のように記述します。
cb_Hour.Items.Add("0");
cb_Hour.Items.Add("1");
cb_Hour.Items.Add("2");
// …(省略)…
cb_Hour.Items.Add("22");
cb_Hour.Items.Add("23");
cb_Hour.Items.Add("24");
なお、すでに削除してしまった[comboBox_Hour]がコード中に残ったままだと、エラー表示されてしまうので、注意しましょう。
繰り返し処理(for文)
前述の書き方でも構いませんが、これではプログラムが冗長です。なにより[プロパティ]から直接編集する方が手軽です。
そこで使われるのが繰り返し処理や反復処理と呼ばれるもので、今回はfor文という繰り返し処理を使用します。
上記の処理をfor文を使って書いたものが、[Form1]の次の箇所です。
for (int i = 0; i <= 24; i++)
{
cb_Hour.Items.Add(i);
}
ここでは変数と呼ばれる『 i 』に0~24を順に代入し、{ }内の処理を0~24の25回繰り返し処理します。
for文の書き方(書式)は次のようになります。
for (①変数の初期化; ②繰り返し条件; ③変数の増分)
①変数の初期化 int i = 0
ここでは変数『 i 』の最初の値を決めます。
今回は0からカウントアップするので、i = 0と指定します。
intは型と呼ばれ『 i 』が数値であることを明示しています。
型は他にも多数ありますが、今回はint型は数値を意味するとだけ覚えていただければ構いません。
②繰り返し条件 i <= 24
ここではfor文の{ }内を繰り返す条件を決めます。
今回は①で決めた変数『 i 』の初期値0が24になるまで繰り返したいので、i <= 24と指定します。
『<=』は比較演算子と呼ばれ、『 i が24以下』という意味になります。
比較演算子は他にも多数ありますが、別の記事で詳しくご紹介します。
③変数の増分 i++
ここでは変数『 i 』が繰り返し処理中にカウントアップする増分を決めます。
今回のように0~24まで1ずつ増加させたい場合は『i++』のように指定します。
『++』は演算子と呼ばれ、他にも種類がありますが、今回は1ずつカウントアップする場合に『++』を用いると覚えていただければかまいません。
以上が、for文の解説です。
繰り返し処理については、別の記事で詳しく解説するので、ここでは、何度も繰り返し行う処理の書き方の定型文と思っていただければ構いません。
[cb_Hour]と同様に[cb_Min]、[cb_Sec]も0~60の値を入力しています。
コンボボックスで最初に選択される値を指定
前回、コンボボックスで最初に表示される値を指定する方法として、コンボボックスの[プロパティ]の[Text]に直接入力するという方法をご紹介しましたが、今回は別の方法をご紹介します。
[cb_Hour]の選択アイテムを指定しているのは、[Form1]の次の箇所です。
cb_Hour.SelectedIndex = 0;
一見すると、『 0 』という数値を直接指定しているように見えるかもしれませんが、『SelectedIndex』は、コンボボックスに入力されているアイテムのうち、0番目(最初)のアイテムを選択するというものです。
例えば、今回のように[cb_Hour]のアイテムに0~24ではなく、1~24が入力されている場合は、『cb_Hour.SelectIndex = 0;』とすると、0番目(最初)のアイテムである『 1 』が選択されます。
日常生活において数値を数える場合は『 1 』から数え始めることが多いかと思いますが、C#をはじめとする多くのプログラミング言語では、『 0 』が最初の数値となりますので、覚えておきましょう。
時間・分・秒を合算
最後に、選択された時間・分・秒を合算処理している箇所が[b_Shutdown_Click]の次の箇所です。
ShutDownProc.StartInfo.Arguments
= "/s /t " + (int.Parse(cb_Hour.Text) * 60 * 60
+ int.Parse(cb_Min.Text ) * 60
+ int.Parse(cb_Sec.Text ));
前回まで解説してきた通り、『shutdown.exe』を使ってシャットダウンを時間指定で行う場合は、オプションの『 /s /t 』の後に秒数を指定する必要があります。
今回、コンボボックスでは時間・分・秒がそれぞれの単位で入力されるので、すべて秒換算して合計します。
まず、選択された数字を数値に変換する方法は『int.Parse(コンボボックス.Text)』でした。
そして[cb_Hour]で選択された時間に60分×60秒をかけることで秒数を算出しました。
同様に[cb_Min]で選択された分には60秒をかけることで秒数を算出できます。
[cb_Sec]についてはこのまま秒として扱えるので、これらをすべて合算したものが、選択された時間・分・秒を秒換算した値となります。
以上が今回のプログラムの解説となります。
まとめ
シャットダウンタイマー作成の第3回目として、『見た目と機能としては完成』までをプログラミングしてきましたがいかがでしょうか。
今回は繰り返し処理や数値の計算など、プログラミングを始めたばかりの人には少し難しい内容だったかもしれません。
ひとつひとつの要素の詳しい解説は別途用意するので、まずは定型文のように覚えてプログラミングに慣れることから始めましょう。
自分なりに、『日』や『週』のコンボボックスを追加したり、指定できる数字を追加したりして遊んでみてください。
また、『見た目と機能としては完成』と書いた通り、見た目では当初の目標としていた機能は実装できていますが、中身のプログラムとしてはまだまだ改良できる箇所が多数あります。
次回も、今回作ったプログラムをさらに発展させて機能を追加していきます。
C#の魅力
C#はWindows OSで知られるMicrosoftが開発したプログラミング言語です。
現在、OSシェア75%という圧倒的なユーザ数を誇るWindowsですが、
Windowsデスクトップアプリケーションを作成するとなった場合、最有力として採用されるプログラミング言語のひとつがC#でしょう。
参考: TECH+『3月デスクトップOSシェア、Windowsが増加しMacが減少』
最近ではWindows以外のアプリケーション開発環境(クロスプラットフォーム)も強化され、macOS、Linux上で動作するアプリケーションに加え、iOS、Androidのスマートフォンアプリの開発も可能となっています。
また、ゲームエンジンUnityの開発言語として使用できることもC#の魅力です。
Unityは家庭用ゲーム機(PlayStation、Nintendo Switch、Xbox等)の他にもスマートフォンゲームアプリの開発も可能な人気のゲーム開発環境です。
Unityで作られた有名なゲームとしては『ポケモンGO』、『原神』等が挙げられます。
以上のように非常に汎用性が高く、多種多様な開発現場で使用でき、魅力的なプログラミング言語であるC#ですが、もう一つの特徴である『オブジェクト指向』という考え方が、プログラミング初心者にとっては高いハードルと感じてしまうかもしれません。
オブジェクト指向が難しいとされる所以は、説明する側もどうやって説明すれば伝わるのかわからず、明確な解説方法が確立されていないという点が挙げられるでしょう。
無理に一言でまとめた概念を解説をしたところで、かえってハードルが高いと感じ、習得意欲を削ぐ結果になりかねません。
今回C#の魅力を伝えるうえで便宜上オブジェクト指向という言葉を出しましたが、
C#を習得したい方は、まずはオブジェクト指向という言葉は一旦忘れてしまって構いません。
まずはC#でできることを実際にプログラミングして慣れることが、習得への第一歩だと考えています。
そのうちご自身が実現したいアプリケーションを作成していくうえで、C#の様々な機能やテクニックを覚えていくことになると思います。
C#を使っていればオブジェクト指向はその中で自然と身についていくでしょう。
とはいえ、独学でC#を習得することはなかなか難しいと感じる方も多いかもしれません。
近年はオンラインスクールを利用して短期間で集中して実務レベルまで習熟させるという方も増えています。
プログラミングのオンラインスクールを活用する場合は、現役のエンジニアが講師となるスクールが優位でしょう。開発現場で通用する質の高い実務ノウハウを学ぶことができます。
また、オンラインスクールであれば全国どこからでも受講できるため、わざわざ都会へ出たり交通費をかけることなく、ライフスタイルに合わせて効率的にスキルを身につけることができることが魅力です。
ITエンジニアとしての強力な武器となるC#を習得するための先行投資として、オンラインスクールは一つの選択肢となり得るでしょう。
無料体験できるオンラインスクールもあるため、独学でも習得できそうか、短期集中で学んだ方がいいのか、ご自身の力量を見極めてみるのもいいのではないでしょうか。
こちらの記事ではオンラインスクールを受講する価値はあるのかについて解説しています。あわせてどうぞ
コメント