スポンサーサイト

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

InitializeComponent()とクラスの分割についての話

3,000Hitありがとうございます!!わーい!

ご訪問&拍手もありがとうございます~。

のんびりやっていきますのでよろしくお願いします~。



さて。

何回か前の記事

「'InitializeComponent' は現在のコンテキスト内に存在しません。」とか言って怒られるんだけどなんなの?

みたいに言ってましたが、原因がわかりました。



だって作ってねーもん。(ばーん)



そりゃそうだだってデザイナー使わず全部べた打ちして作ったんだもん自分で定義してないメソッド呼び出せるはずないじゃないかアホかアチャー

無意識にVisualStudioに頼っていたということですねまだまだ自立が足りない。

というわけで今日はInitializeComponent()とクラスの分割についてのお話。

多分知ってる人が多いと思うけど自力で理解できたのが嬉しいから書いておく。



InitializeComponent()ってそもそもなんで出てくるの。

InitializeComponent()は、Visual studioで「Windowsフォーム」を作成すると勝手に生成されます。

右クリック→追加でWindowsフォーム「sampleForm.cs」を作ると

sampleForm.cs

using System; 
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Project1
{
public partial class sampleForm : Form
{
public sampleForm()
{
InitializeComponent();
}
}
}


ほら、勝手にInitializeComponent()がいる!

そして、同時に生成される謎のファイル

「sampleForm.Designer.cs」!!

誰! 何この子!!

デザインビューでなくコードビューで中を見てみると

namespace Project1 
{
partial class sampleForm
{
///
/// 必要なデザイナー変数です。
///

private System.ComponentModel.IContainer components = null;

///
/// 使用中のリソースをすべてクリーンアップします。
///

/// マネージ リソースが破棄される場合 true、破棄されない場合は false です。
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows フォーム デザイナーで生成されたコード

///
/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
/// コード エディターで変更しないでください。
///

private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.Text = "sampleForm";
}

#endregion
}
}


だそうです。

デザインビューを使うとこの子もいっしょに生成されるんです。

そして注目すべきはここ

private void InitializeComponent()


こいつだ!!!!
そしてその下を見ていくと、どうやら「this」つまりこのフォームそのものの設定をしているんですね。

さてここで、デザインビューからボタンを一個追加してみます。
そしてボタンをダブルクリックしボタンイベントも追加。、

すると、

sampleForm.cs

using System; 
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Project1
{
public partial class sampleForm : Form
{
public sampleForm()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{

}
}
}


sampelForm.csには勝手にボタンクリックイベントが追加されます。

そして、

sampleForm.Designer.cs

namespace Project1 
{
partial class sampleForm
{
///
/// 必要なデザイナー変数です。
///

private System.ComponentModel.IContainer components = null;

///
/// 使用中のリソースをすべてクリーンアップします。
///

/// マネージ リソースが破棄される場合 true、破棄されない場合は false です。
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region Windows フォーム デザイナーで生成されたコード

///
/// デザイナー サポートに必要なメソッドです。このメソッドの内容を
/// コード エディターで変更しないでください。
///

private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(102, 111);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.UseVisualStyleBackColor = true;
this.button1.Click += new System.EventHandler(this.button1_Click);
//
// sampleForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(284, 262);
this.Controls.Add(this.button1);
this.Name = "sampleForm";
this.Text = "sampleForm";
this.ResumeLayout(false);

}

#endregion

private System.Windows.Forms.Button button1;
}
}


なんかめっちゃ増えてる!!



でもよく読んでいくと

this.button1 = new System.Windows.Forms.Button();


ボタンをインスタンス化して

this.button1.Name = "button1";


ボタンに名前つけて

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


ボタンにクリックイベント追加して

this.Controls.Add(this.button1);


フォームに作ったボタン追加して

private System.Windows.Forms.Button button1;


(順番は前後するけれど)ボタンを宣言して…

って自力で追加するのとそんなに処理変わらないわけです。
他にごちゃごちゃ書いてあるのは色とかサイズとか位置の設定だし。

そういうコンポーネント(Component)の初期化(Initialize)をしてくれるのが

InitializeComponent()メソッドなわけだー。なるほど。
じゃあ自力べた打ちプログラムにはいらないわー。



…それでは、なぜデザイナーなんてもの勝手に作るんだ!?と思うかもですけど、
デザイン部とコードを切り離して既述するのは合理的な考え方だよな。

このデザイナーコード、Visual studioで開発するといつもお世話になるから特別なコードなんだと思い込んでたけど

sampleForm.Designer.cs

partial class sampleForm


ここ見ると、単なるsampleFormの分割クラスなんですねー。

参考:方法: 1 つのクラスを複数の部分クラスに分割する (クラス デザイナー)



Visual studioとかEclipseとか統合開発環境って結構気を使ってコードの自動生成してくれるから大量の文字列におののいてるとこあったけど、

コードが読めれば臆することはない! …かもな!



いやー積年の疑問と畏怖が払拭されて爽やかな気分だわーと喜びつつふとVisual studioに目をやったら。



「sampleForm.resx」



なんかまた自動生成されてるーーーー!!
お前は誰だー!!!????



次回「新たなる謎 リソースファイル!!」

ただし次回の予定は未定だ!!

今回はこの辺りでっ!!
関連記事

コメント

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