アクセスランキング C# 作りたいものを考える | イベントと引数(各イベントの共通化と判定) - スポンサー広告挫折した人のためのC#講座

直列つなぎ。 -とある発達障害者の記録

知識と知識を繋ぐためのblog。 広汎性発達と診断されました。ぜんぜん役に立ってないけど。月収13万円(うち手取り11万)、家賃4万円で生活するひつじ人間。モウマンタイ。

  

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

 スポンサー広告

   

C# 作りたいものを考える | イベントと引数(各イベントの共通化と判定)

ブログパーツ  

 更新履歴
   12.28 画像を差し替えた。

 ひつじ!人間です。この記事はNaverまとめ用となります。
このようにしてせこせことSEOするんです。雑とか言われるけど。

 目次
  ・作りたいものを考える
  ・イベントと引数(各イベントの共通化と判定)


 本稿では、手早く作るをテーマに、通常ググっただけでは躓きがちな基本事項を押さえた、補完的な知識を提供します。網羅的かつ専門的な知識をお求めの方は、Stuck OverflowやDobon.net等をどうぞ。

 ↓長すぎる前置き。

アプリというのは、手作業だけでやるのが困難だったり、レジストリ操作など高い専門知識が必要な操作をGUIを介し、より安全かつ効率的・直感的に操作する為に製作されます。

 


 設計思想は各々製作者ごとに違うと思われますが、より本人(そして一般ユーザー)にとって使いやすく、スピーディで軽快な動作であるのが理想です。



 免責事項

 本職でもない人間が必死こいてまとめた知識のため、用語的な誤りがある場合があります。ちきんとしてサイトや書籍で細部を補完することをお勧めします。


 

 

 

本稿のTipsを読んで習得するのに15分程度を見込んでいます。


 


作りたい物を考える

 

 基本としては、毎日行っている事の代行作業です。これが全ての基本ですね。



 画面の輝度を変更したいけど、設定までいちいち開くのは面倒。ならアプリ上で、クリック1発で変更できるようにしたい

 家計簿を付けたいけど、既存のものは入力が面倒。自分仕様のものを造りたい。

 毎日の仕事や生活のスケジュール管理を、自分の思考に合わせて行いたい



 そして、そのテーマを軸に必要なソースコードをサイトやサンプルコード集・blog等から収集、その内容を理解して、アルゴリズムを書いていく※1


※1。アルゴリズムというのは、必要な結果を出力するための処理の連なりの事です。無駄がないコードほど美しく、効率が良いとされています。



 これで、質問などせずとも大抵の事は解決できます。上手くいかないのは、それら情報の整理不足なんですね。


 アプリ製作に難解なマシン語など不要です。敷居を低くすべきなのに、10段以上も上げてどうすると言いたい。


 このblogでは今、家計簿アプリを製作しておりますが、この家計簿アプリ製作を通して本格的なGUIアプリには何が必要なのか、そして手早く作るにはどうすればいいのかを学んでいただければ幸いです(手抜きとも言う)。



イベントと引数



イベントハンドラーの引数senderとeについて

 手抜きですが、変に重複しても面倒なので・・・・
Windows GUIを作る上で、外せないのがsenderとeです。Visual Studio上でButtonを配置してみましょう。

 button関連でよくあるテーマが
  どのボタンが押されたかを判定する
  各buttonのイベントを共通化する というもの。



 イベントは、デザイナー上でbuttonをダブルクリックするだけで登録することが出来ます。
        
        private void button1_Click(object sender, EventArgs e)
        {
     MessageBox.Show("button1が押されました");
    }

        private void button2_Click(object sender, EventArgs e)
        {
//削除でもOK (イベントに代入されていない)      
    }

        private void button3_Click(object sender, EventArgs e)
        {
//削除でもOK (イベントに代入されていない)          }
      }
}

Form1.Designer.cs を開いたところ。
  イベント共通化

ここで、代入する側(+=の右側)のthis.button2_Click をbutton1クリックと書き換えてしまいましょう(イベントハンドラーの共通化)。

   this.button2.Click += new System.EventHandler(this.button1_Click);
     this.button3.Click += new System.EventHandler(this.button1_Click);
             

 この記述は
 button(数字)のクリックイベントに、イベントハンドラー(button1_Click)を代入しなさいという意味です。イベントハンドラー内のコードブロック{}に、メッセージボックスなどの処理を記述していきます。

 このようにして一本化すると、button1_Clickのイベントハンドラ{}以外意味をなさなくなります。



 





 これで共通化されました。次は、どのbuttonが押されたのかを判定してみましょう。
  private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(((Button)sender).Name +"が押されました");
        }


 たったこれだけですね。ですが、何となく素通りしてしまうと見過ごしてしまう事があります。他のTips系サイトでは触れない部分を分かりやすく解説してみます。

 まず、
    MessageBox.Show(sender+"が押されました");  で実行してみましょう。

buttonが押された


 のように表示されましたね。
 これだけでも十分な気がしますが、Object sender つまりオブジェクト型のため、余分な情報まで取得してしまっています。キャスト※2して必要な型の必要なプロパティにアクセスする必要があります。

 今回はButton型のNameプロパティが必要でしたので、キャストして代入しました。
Button型はObject型に含まれていますので、(button)sender で括ることでダウンキャスト※3した訳です。

  さらに()で括り、((button)sender)とする事で全体をボックス化、一まとめにしてコンパイラへ明示して、button型objectのNameプロパティへアクセスする事を可能にしています。

  
※2 キャスト https://dobon.net/vb/dotnet/beginner/cast.html 等を参照 

※3 ダウンキャスト c# 派生クラスに基底クラスをぶち込む「ダウンキャスト」について。
 object階層
  Gimp2で製作しました(30分)
 
 
  これはよく使われる手法で、応用も効きますので覚えておきしょう。
 いろんなコントロールで使える筈です。

  



 引数 eとは

 型名の EventArgs  は「イベントデータを格納するクラスの基底クラスを表し、イベントデータを含まないイベントに使用する値を提供します。」とVisual Studio上の説明文にはあります。

 Button上でクリックした場合、その時点でのEventArgsで取得したマウス上のイベントデータを取得します。




button1イベント登録 引数eのプロパティ
先ほどのコード(プロジェクト)上で構いませんので、 今度はbutton1にmouseClickイベントを登録しましょう。
 ダブルクリックで登録出来ます。
この引数eを利用するには上述のclickイベントでは無理(っぽい)なので、マウス情報を取得するイベントを登録する必要があります。

 

 

 




   これで、引数 eのプロパティが読み込めるようになりました。クリック数や位置座標などのプロパティにアクセスできます



        private void button1_MouseClick(object sender, MouseEventArgs e)
        {
            MessageBox.Show(e.Location.X.ToString());
        }
 後はそのまんま文字列にして流し込むだけです。
 eを利用するイベントの種類もいくつかあります。




 逆にしてみよう(今思いついた)

   this.button1.Click += new System.EventHandler(this.button2_Click);
     this.button1.Click += new System.EventHandler(this.button3_Click);       

   このようにすると、今度はbutton1がclickされるたびに、button2や3内のコードも同時に実行されます(button2やbutton3のclickイベントは起こらない つまりイベントの共通化)。
 この挙動はデリゲートの概念を理解する為にも重要な要素かも知れません。




 コラム MessageBoxとConsole.WriteLine

 先ほどのイベントに
    private void button1_MouseClick(object sender, MouseEventArgs e)
        {
           Console.WriteLine(e.Location);
        }
     
  でWriteLineメソッドを追加してみます。MessageBox.Showと異なり、何も表示されませんね。この場合の出力先はVisual Studioの「出力タブ」上となっています。
 Messageボックスが煩わしい場合はこちらを使うと良いでしょう。

 出力

 

関連記事
スポンサーサイト

 挫折した人のためのC#講座

     

-   0   Comments

Leave a comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。