- - PR -
配列で並んだグループの中にピクチャーボックスの表示
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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]); } } 初心者ですので、簡単な問題かもしれませんが、宜しくお願いします。 _________________ | ||||
|
投稿日時: 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); | ||||
|
投稿日時: 2005-03-13 23:37
全部がnullということになると言うことですかね。
第三行は結局 null = new A() となるから、表示されなくなるのですか? しかし、この場合はプログラムを実行したら、グループボックスは表示されたが、画像は出ませんでした。 _________________ | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 2005-03-14 02:03
書いたほうがいいですよ?じゃないと何をするにあたっての「問題」を聞いてるのか わかりません。 で、Addする前にnewすればいい、ということではなく? 詳細はHongliangさんが説明してくださってるとおりです。 | ||||
|
投稿日時: 2005-03-14 11:12
べるさん、Hongliangさん、ありがとうございます。
やっと気づきました。前回も似ている間違いをしました。ずばりべるさんのおっしゃった通り、Addする前にnewすることでした。コードの順序が間違いました。 この掲示板では私だけこのような質問ばかりしていて、ちょっと気まずいと思っていますが... _________________ | ||||
|
投稿日時: 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