- 題名: コントロール配列の外部操作
- 日時: 2009/10/06 21:53:40
- ID: 25524
- この記事の返信元:
- (なし)
- この記事への返信:
- [25525] Re[1]: コントロール配列の外部操作2009/10/06 22:22:44
- ツリーを表示
Modifiersプロパティって、実際は Designer.cs 側のクラス宣言で partial class Form1 { ・・・・・・ private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.TextBox textBox3; } とアクセス指定子を宣言しているだけなんですが、 この場合 private なので外部からは Form1 frm = new Form1(); frm.textBox3.Text = "Hello World!"; ← ここでビルドエラー!! と呼び出せなくなります。 ただし提示のソースの場合、Form1 クラスのメソッド内で プライベートメンバを配列にして、クラス Test のメソッドに渡しているわけですから クラス Test からパラメータ変数介して Form1 の TextBox にアクセスできるのは当然ですよね。
>> そう考えると、配列でFormコントロールを他クラスのメソッドに渡して使うのは、場合によって、いいんでしょうか? >上記コードの場合、コントロールの参照を配列で渡しているだけですので >Form 側で解放処理が行われるから問題ありません。 例えれば、社内秘の住所録を手帳に書いて持ち出したようなものですかねー。 コントロール(実際の家屋)をコピーしたわけではないので、コントロールの後始末とは 関係ないという考えで合ってると思います。 デザイン画面で追加したコントロールについては、自動で InitializeComponent に 初期化処理が書かれると思います。これがコンストラクタで呼ばれます。破棄するときは Dispose です。InitializeComponent で作成されたオブジェクトを破棄するようなコードが 自動で書かれています。 ここまでは Form 内にコーディングされていますので、 > ただ、Formで扱われるコントロールは、そのForm内で掃除(ガベージコレクタ)してあげないといけない投稿を見た覚えがあります。 を満たしていると思います。自分でコードから追加したコントロールについては 自分で後始末も考える必要があるかと思います。 # ちなみにガベージコレクタは呼び出しません。ガベージコレクタの対象にするだけです。 問題が起こるとすれば、コントロール(実際の家屋)が破棄されてるのにアドレス参照(手帳の住所)が 残っていた場合に壊れた家を訪れることになること。 また、本来、社内秘のコントロール(家屋)に外部から破棄命令を出せること。 以上のことから、 > 他クラスからの操作はしない方がいいとも考えています。 という考え方が出てきます。 このあたりはオブジェクト指向とか、カプセル化あたりを取り扱った書籍で解説 されていそうですが、拾い読みして本来の意味が把握できていない印象を受けました。 所詮、概念なので、それに引きずられる必要はありませんが、そういった考え方を実現 できるような設計も可能です。 今回の場合、考え方としては全く逆で、出来上がったコントロールを配列に入れて 共通処理を行なうのではなく、複数の TextBox を管理するような部品を作っておいて それを Form1、Form2 で使うとか。 http://www.atmarkit.co.jp/fdotnet/dotnettips/324winbaseform/winbaseform.html いや「デザイン画面では自由に設計したコントロールに対して、共通機能だけ付ける 必要がある」となったら、外部モジュールに渡すのではなく、内部クラスに渡して 処理する形にするとか。
分類:[.NET]
2009/10/06(Tue) 22:06:03 編集(投稿者)
2009/10/06(Tue) 22:03:36 編集(投稿者)
ここでは、初めて書き込みいたします。
皆さん、よろしくお願いいたします。
早速ですが、Formコントロールについて質問があります。
よろしければ、ご教授頂けると幸いです。
>>>サンプルソース
//form1.cs
/*
Form1には、3個のテキストボックスと
2個のボタンを貼り付けています。
*/
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 Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
TextBox[] txts = { this.textBox1, this.textBox2, this.textBox3 };
Test objTest = new Test();
objTest.read(txts);
}
private void button2_Click(object sender, EventArgs e)
{
TextBox[] txts = { this.textBox1, this.textBox2, this.textBox3 };
Test objTest = new Test();
objTest.write(txts);
}
}
}
//test.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
class Test
{
/// <summary>
/// textBoxの読み込み
/// </summary>
/// <param name="txts">テキストボックスの配列</param>
public void read(System.Windows.Forms.TextBox[] txts)
{
for (int i = 0; i < txts.Length; i++)
{
Console.Write(txts[i].Text);
}
}
/// <summary>
/// textBoxの書き込み
/// </summary>
/// <param name="txts">テキストボックスの配列</param>
public void write(System.Windows.Forms.TextBox[] txts)
{
for (int i = 0; i < txts.Length; i++)
{
txts[i].Text = "書き換え";
}
}
}
}
質問:
サンプルにあるtextBox1から3は、Modifiersプロパティをprivate設定しています。
Modifiersプロパティは、privateで設定されている際、外部から参照できないという意味で捉えていました。
しかし、エラーが出ずに、テキストボックスを処理できるため理由がわかりません。
■余談
Formクラスにコードが集中しており他のクラスに処理をわけたくて、
短いサンプルコードを書きました。
最初は、コンパイル時にエラーが出ると思っていました。
よろしければ、ご回答頂けると幸いです。
以上、よろしくお願いいたします。