C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C# 実行時エラーの原因


(過去ログ 57 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■32539 / inTopicNo.1)  C# 実行時エラーの原因
  
□投稿者/ chobi (16回)-(2009/02/08(Sun) 23:02:46)

分類:[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
引用返信 編集キー/
■32541 / inTopicNo.2)  Re[1]: C# 実行時エラーの原因
□投稿者/ επιστημη (1690回)-(2009/02/08(Sun) 23:22:18)
επιστημη さんの Web サイト
> 下記コードのcolとrow (ボタンとパネルの要素数)を大きくすると実行時エラーになります。
> 因みにcol=100/row=50はセーフでcol=200/row=100はアウトです。
> 1枚のフォームに貼り付けられる要素数の上限みたいのがあるのでしょうか?

どう考えても無限てこたーないわな。
2万枚のPanelに耐えられるかというと...無理がありそう。

載んでるメモリ量でも変わってくるでしょう。
Vista64 で メモリざくざく積んでどうだか。
Panelなんか貼らずに"絵"を描けば無問題でしょう。

引用返信 編集キー/
■32546 / inTopicNo.3)  Re[2]: C# 実行時エラーの原因
□投稿者/ Azulean (290回)-(2009/02/09(Mon) 07:49:16)
ウィンドウ数の制限ってことであれば、この辺とか。
http://blogs.msdn.com/oldnewthing/archive/2007/07/18/3926581.aspx
引用返信 編集キー/
■32552 / inTopicNo.4)  Re[3]: C# 実行時エラーの原因
□投稿者/ Jitta (573回)-(2009/02/09(Mon) 12:05:33)
2009/02/09(Mon) 12:07:03 編集(投稿者)

No32546 (Azulean さん) に返信
> ウィンドウ数の制限ってことであれば、この辺とか。
> http://blogs.msdn.com/oldnewthing/archive/2007/07/18/3926581.aspx

捕捉^H^H補足:
コントロールは、内部ではウィンドウとして表現されています。
どのコントロールも、CreateWindow 関数で作られ、ウィンドウ ハンドルを持ちます。
http://msdn.microsoft.com/ja-jp/library/cc410713.aspx

NativeErrorCode は、WinError.h で定義されている番号です。今回は、ERROR_NO_MORE_USER_HANDLES です。
引用返信 編集キー/
■32619 / inTopicNo.5)  Re[4]: C# 実行時エラーの原因
□投稿者/ chobi (17回)-(2009/02/10(Tue) 22:17:54)
すみません。質問したの忘れていました。m( _ _ )m
実行環境によって、(確保できるメモリ)で変わるという事ですね。
当たり前か・・・・
ありがとうございました。
Drawするのはいかにもめんどくさい・・・・
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -