- PR -

配列で並んだグループの中にピクチャーボックスの表示

1
投稿者投稿内容
Gogol
会議室デビュー日: 2005/02/19
投稿数: 11
投稿日時: 2005-03-13 22:34
いつもお世話になっております。いつも簡単な質問ばかりで申し訳ないですが、ピクチャーボックスを以下の通りに表示させたいですが、以下のコードには何か問題があるのでしょうか。

//
// groupBoxes
//
int grpCnt = 0;
int grpnumX = this.lineX;
int grpnumY = this.lineY;

for(i = 0; i < grpnumX; i++ )
{
for(j = 0; j < grpnumY; j++ )
{

this.groupBoxes[i+j*10] = new System.Windows.Forms.GroupBox();
this.groupBoxes[i+j*10].Controls.Add(this.pictureBoxes[i+j*10]);
this.groupBoxes[i+j*10].Location = new System.Drawing.Point(32+(i*64), 32+(j*64));
this.groupBoxes[i+j*10].Name = "groupBox" + grpCnt.ToString();
this.groupBoxes[i+j*10].Size = new System.Drawing.Size(56, 56);
this.groupBoxes[i+j*10].TabIndex = grpCnt + 3 ;
this.groupBoxes[i+j*10].TabStop = false;
this.groupBoxes[i+j*10].Text = "";

//
// pictureBoxes
//
this.pictureBoxes[i+j*10] = new System.Windows.Forms.PictureBox();
this.pictureBoxes[i+j*10].Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
this.pictureBoxes[i+j*10].Location = new System.Drawing.Point(8, 16);
this.pictureBoxes[i+j*10].Name = "pictureBox"+grpCnt.ToString();
this.pictureBoxes[i+j*10].Size = new System.Drawing.Size(40, 32);
this.pictureBoxes[i+j*10].TabStop = false;

grpCnt++;

}

}

for(i = 0; i < grpnumX; i++ )
{
for(j = 0; j < grpnumY; j++ )
{
this.Controls.Add(this.groupBoxes[i+j*10]);
}

}

初心者ですので、簡単な問題かもしれませんが、宜しくお願いします。
_________________
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-03-13 23:00
配列作成時は全ての要素がnull(構造体配列は0ですが)で初期化されるのは分かってますね?

次のコードがどうなるか考えてみて下さい。

A a = null;
A b = a;
a = new A();
System.Console.WriteLine(b == a);
System.Console.WriteLine(b == null);
Gogol
会議室デビュー日: 2005/02/19
投稿数: 11
投稿日時: 2005-03-13 23:37
全部がnullということになると言うことですかね。
第三行は結局 null = new A() となるから、表示されなくなるのですか?
しかし、この場合はプログラムを実行したら、グループボックスは表示されたが、画像は出ませんでした。



_________________
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-03-13 23:58
では状況を始めに示されたのに限りなく近づけた例にしてみましょうか。

Control[] a = new Control[1];
Control[] b = new Control[1];
a[0] = new Control();
a[0].Controls.Add(b[0]);
b[0] = new Control();
System.Console.WriteLine(a[0].Controls.Count);

一見全く違うように見えますが、私の前回の投稿と意味はほぼ同じです。

[ メッセージ編集済み 編集者: Hongliang 編集日時 2005-03-13 23:59 ]
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-14 02:03
引用:
Gogolさんの書き込み (2005-03-13 22:34) より:
いつもお世話になっております。いつも簡単な質問ばかりで申し訳ないですが、ピクチャーボックスを以下の通りに表示させたいですが、以下のコードには何か問題があるのでしょうか。

要するに何がしたいのですか??せめて「以下の通り」の部分くらいは日本語で
書いたほうがいいですよ?じゃないと何をするにあたっての「問題」を聞いてるのか
わかりません。

で、Addする前にnewすればいい、ということではなく?

詳細はHongliangさんが説明してくださってるとおりです。
Gogol
会議室デビュー日: 2005/02/19
投稿数: 11
投稿日時: 2005-03-14 11:12
べるさん、Hongliangさん、ありがとうございます。
やっと気づきました。前回も似ている間違いをしました。ずばりべるさんのおっしゃった通り、Addする前にnewすることでした。コードの順序が間違いました。

この掲示板では私だけこのような質問ばかりしていて、ちょっと気まずいと思っていますが...
_________________
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2005-03-14 22:36
引用:
この掲示板では私だけこのような質問ばかりしていて、ちょっと気まずいと思っていますが...

いや、質問の内容自体は私は特に悪くないと思いますが。どちらかというと質問の
「しかた」です。こういうときはここを見てもらうのが定番になっているのかな。
http://www.hyuki.com/writing/techask.html

今考えたら私もさっきはちゃんとわかってなかった。これはnullの問題じゃなくて
newの問題ですね。

Label L1 = new Label();
L1.Text = "string1";
Label L2 = L1;
L1 = new Label();
L1.Text = "string2";
MessageBox.Show(L2.Text);

上の4行目で新しいLabelの領域が確保されてL1の参照が切り替わるけど、そのとき
L2の参照は、元々L1が指していた領域のまま、という感じですかね。だから、
「null = new A() となるから」なんてことはないですよね。
1

スキルアップ/キャリアアップ(JOB@IT)