|
分類:[C#]
vs2005 .net2.0 実行/開発:xp home sp2
いつもお世話になってます。 突然ですが、「人工生命/ステーィブン・レビー著」の94〜95ページの1次元セルオートマトン書いてます。 下記コードのcolとrow (ボタンとパネルの要素数)を大きくすると実行時エラーになります。 因みにcol=100/row=50はセーフでcol=200/row=100はアウトです。 1枚のフォームに貼り付けられる要素数の上限みたいのがあるのでしょうか?
(1) 発生場所 --> Application.Run(new Form1()); (2) エラーコード System.ComponentModel.Win32Exception はハンドルされませんでした。 Message="ウィンドウのハンドルを作成中にエラーが発生しました。" Source="System.Windows.Forms" ErrorCode=-2147467259 NativeErrorCode=1158
(3) ソース using System; using System.Drawing; using System.Windows.Forms;
public partial class Form1 : Form { public const int length = 10; public const int col = 100; public const int row = 50; private const byte White = 0; private const byte Black = 1; private bt[] button = new bt[col]; private pn[,] panel = new pn[col,row]; public Form1() { InitializeComponent(); this.Width = (button.Length) * length + 10; this.Height = (row + 1) * length + 30; this.Text = "セルオートマトン1次元"; for (int i = 0; i < button.Length; ++i) { button[i] = new bt(); button[i].Location = new Point(i * length, 0); this.Controls.Add(button[i]); button[i].Click+=new EventHandler(bt_Click); for (int j = 0; j < row; ++j) { panel[i, j] = new pn(); panel[i, j].Location = new Point((i) * length, (j + 1) * length); this.Controls.Add(panel[i, j]); } } }
private void ColorChang() { for (int j = 0; j < row; ++j) { for (int i = 1; i < col-1; ++i) { panel[i, j].PanelColor = GetButtonStatus(i,j); } } }
private byte GetButtonStatus(int col,int row) { byte[] btstat = new byte[3] { 4, 2, 1 }; int ReturnStatNo = 0; const byte ErrorCode=10; if (row == 0) { ReturnStatNo = button[col - 1].buttoncolor * btstat[0] + button[col].buttoncolor * btstat[1] + button[col + 1].buttoncolor * btstat[2]; } else { ReturnStatNo = panel[col - 1, row-1].PanelColor * btstat[0] + panel[col, row-1].PanelColor * btstat[1] + panel[col + 1,row-1].PanelColor * btstat[2]; } switch(ReturnStatNo) { case 0: return White; case 1: return Black; case 2: return Black; case 3: return Black; case 4: return Black; case 5: return White; case 6: return White; case 7: return White; default: return ErrorCode; } }
private void bt_Click(object sender, EventArgs e) { int btnIndex = 0; for (int i = 0; i < button.Length; ++i) { if (sender.Equals(button[i])) { btnIndex = i; if (button[btnIndex].BackColor == Color.White) { button[btnIndex].BackColor = Color.Black; } else { button[btnIndex].BackColor = Color.White; } break; } } ColorChang(); } }
#region ボタン public class bt : Button { private const byte White = 0; private const byte Black = 1; public byte buttoncolor = White; public bt() { this.Size = new Size(Form1.length, Form1.length); this.BackColor = Color.White; this.BackColorChanged+=new EventHandler(bt_BackColorChanged); }
private void bt_BackColorChanged(object sender, EventArgs e) { if (this.BackColor == Color.White) { this.buttoncolor = White; } else { this.buttoncolor = Black; } } } #endregion
#region パネルだけどピクチャボックス
public class pn : PictureBox { private const byte White = 0; private const byte Black = 1; private byte panelcolor = White; public pn() { this.Size = new Size(Form1.length, Form1.length); this.BackColor = Color.White; this.BorderStyle = BorderStyle.FixedSingle; }
public byte PanelColor { get { return this.panelcolor; } set { if (value==1) { this.BackColor = Color.Black; this.panelcolor = value; } else if (value == 0) { this.BackColor = Color.White; this.panelcolor = value; } else { MessageBox.Show("おまえはあほか"); } } } } #endregion
|