C#のいくつかわからない部分について。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
テマリ

C#のいくつかわからない部分について。

#1

投稿記事 by テマリ » 7年前

C#の書籍が届くまでサイトを見たりしながら作ってみたんですが
C言語の関数のような部分とパネル背景を関数で変更がよくわかりません。
staticやpublicのメソッド部分は下URLサイトの[静的コンストラクタ]の2番目のサンプルを見て作ってみたりしました。
http://ufcpp.net/study/csharp/oo_static.html
getの部分もよくわかりません。

下記が作ってみたコードです。

コード:

using System;
using System.Drawing;
using System.Windows.Forms;

class randc
{
    static int btclick;

    static randc()
    {
        btclick = 0;
    }

    public randc()
    {
        if(btclick == 0)
        {
            Form1.panel1.BackColor = Color.LightBlue;
        }
    }

    public int randm
    {
    }
}

class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new Form1());
    }
}

class Form1 : Form
{
    Button button1;
    Panel panel1, panel2, panel3, panel4, panel5, panel6, panel7, panel8;

    public Form1()
    {
        //フォームの設定
        Text = "能プロ";
        BackColor = Color.FromArgb(0, 0, 0);
        ClientSize = new Size(1500, 1300);
        
        //パネル全般
        panel1 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(200, 200),
        };

        panel2 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(200, 300),
        };

        panel3 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(300, 200),
        };

        panel4 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(300, 300),
        };

        panel5 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(700, 200),
        };

        panel6 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(700, 300),
        };

        panel7 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(800, 200),
        };

        panel8 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(800, 300),
        };

        this.Controls.Add(panel1);
        this.Controls.Add(panel2);
        this.Controls.Add(panel3);
        this.Controls.Add(panel4);
        this.Controls.Add(panel5);
        this.Controls.Add(panel6);
        this.Controls.Add(panel7);
        this.Controls.Add(panel8);

        panel5.Click += new EventHandler(panel5_Click);
        panel6.Click += new EventHandler(panel6_Click);
        panel7.Click += new EventHandler(panel7_Click);
        panel8.Click += new EventHandler(panel8_Click);

        //ボタン全般
        button1 = new Button()
        {
            Text = "開始",
            Location = new Point(500, 420),
            Size = new Size(80, 20),
        };

        this.Controls.Add(button1);

        button1.Click += new EventHandler(button1_Click);
    }

    void button1_Click(object sender, EventArgs e)
    {
        randc rd = new randm();
        randm();
    }

    void panel5_Click(object sender, EventArgs e)
    {
        panel5.BackColor = Color.LightBlue;
    }

    void panel6_Click(object sender, EventArgs e)
    {
        panel6.BackColor = Color.LightBlue;
    }

    void panel7_Click(object sender, EventArgs e)
    {
        panel7.BackColor = Color.LightBlue;
    }

    void panel8_Click(object sender, EventArgs e)
    {
        panel8.BackColor = Color.LightBlue;
    }
}
class randcの部分を最初以外はstatic randc()が呼び出されないようにしたいです。
class randcをbtclickの値で動作が違うようにしたいです。
まだif(btclick == 0){ Form1.panle1.BackColor = Color.LightBlue; }しか書いてませんがこれにbtclickの値が1の場合2の場合とbottun1の動作をクリックした回数で分岐させようと思っています。

僕が作ろうとしているプログラムと同じようなC#のプログラムのサンプルで入門サイトのように説明があるサイトを知っていたら教えて欲しいです。

C#については入門サイトの基礎の用語ぐらいしか頭に入っていません。
読んでても頭に入らないので作りながらネットで検索したりしてやっています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C#のいくつかわからない部分について。

#2

投稿記事 by softya(ソフト屋) » 7年前

私は久しぶりにC#のコードを見るのですが、なにかすごく不思議な状態のコードになっている気がします。
この書き方は、何処を参考にされましたか? 特にpanelの辺。
素直にオブジェクト指向で組んだほうが良いと思いますがオブジェクト指向言語は未経験ですか?

気になること。
1.class randcの使い方や使い道がよく分からないので、設計意図を説明してください。

2.オブジェクトインスタンスの生成で不思議なことをしている気がする。これはどういう意味でしょうか?

コード:

        randc rd = new randm();
        randm();
3.上にも書きましたがpanelの生成です。何処のサイトを参考にされましたか?
オフトピック
それとも私がC#に無知なだけ?

コード:

        panel1 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(200, 200),
        };
4.エラーになる前のコンパイルに成功しているコードを見せてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

テマリ

Re: C#のいくつかわからない部分について。

#3

投稿記事 by テマリ » 7年前

1.class randcはC言語で書いてみます。下のコード全部をclass randcに入れるつもりです。

コード:

//ここから
int btclick = 0, seikai = 0, huseikai = 0;    //変数は二つともグローバル変数

function randm(){
    if(btclick == 0){
        ラベル1の文字を消去
        色のred,white,どちらかをランダムで選択しパネル1~4の背景色として表示。
        パネル1~4の表示を元に戻す。
        生成したランダム値は答え合わせ用の変数に入れておく。
        btclick++;
    }
    else if(btclick == 1){
        //パネル1~4とパネル5~8の答え合わせ
        if(正解){
            seikai++;
            ラベル1に[正解!]と表示。
        }else if(不正解){
            huseikai++;
            ラベル1に[不正解!]と表示。
        }
        答え合わせの変数初期化。
        btclick--;
    }
}
//ここまで
2.C#でランダム生成を検索したどこかのサイトにありました。
[フォームにパネルの登録]と似たような物かと思ってよく理解せずに書きました。

3.このサイトを参考にしました。
http://www.wgag.net/csforms/0018.html

4.

コード:

using System;
using System.Drawing;
using System.Windows.Forms;

class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new Form1());
    }
}

class Form1 : Form
{
    Button button1;
    Panel panel1, panel2, panel3, panel4, panel5, panel6, panel7, panel8;

    public Form1()
    {
        //フォームの設定
        Text = "能プロ";
        BackColor = Color.FromArgb(0, 0, 0);
        ClientSize = new Size(1500, 1300);

        //パネル全般
        panel1 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(200, 200),
        };

        panel2 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(200, 300),
        };

        panel3 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(300, 200),
        };

        panel4 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(300, 300),
        };

        panel5 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(700, 200),
        };

        panel6 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(700, 300),
        };

        panel7 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(800, 200),
        };

        panel8 = new Panel()
        {
            BorderStyle = BorderStyle.FixedSingle,
            Size = new Size(100, 100),
            Location = new Point(800, 300),
        };

        this.Controls.Add(panel1);
        this.Controls.Add(panel2);
        this.Controls.Add(panel3);
        this.Controls.Add(panel4);
        this.Controls.Add(panel5);
        this.Controls.Add(panel6);
        this.Controls.Add(panel7);
        this.Controls.Add(panel8);

        panel5.Click += new EventHandler(panel5_Click);
        panel6.Click += new EventHandler(panel6_Click);
        panel7.Click += new EventHandler(panel7_Click);
        panel8.Click += new EventHandler(panel8_Click);

        //ボタン全般
        button1 = new Button()
        {
            Text = "開始",
            Location = new Point(500, 420),
            Size = new Size(80, 20),
        };

        this.Controls.Add(button1);
    }

    void panel5_Click(object sender, EventArgs e)
    {
        panel5.BackColor = Color.LightBlue;
    }

    void panel6_Click(object sender, EventArgs e)
    {
        panel6.BackColor = Color.LightBlue;
    }

    void panel7_Click(object sender, EventArgs e)
    {
        panel7.BackColor = Color.LightBlue;
    }

    void panel8_Click(object sender, EventArgs e)
    {
        panel8.BackColor = Color.LightBlue;
    }
}
パネルクリックの動作についてはまったく手をつけていません。
パネルの部分は[プロパティ設定][フォームにパネルを登録][イベントハンドラ登録]で分けました。

オブジェクト指向言語はあまり書いたりしたことはありません。
http://www.wgag.net/csforms/index.html
上記URLのサイトがフォームを作る説明がわかりやすかったので上記を参考にして作りました。

[1.]の正解不正解を表示するラノベ1はまだ作っていません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C#のいくつかわからない部分について。

#4

投稿記事 by softya(ソフト屋) » 7年前

3.の書き方はオブジェクト初期化子ですね。失礼しました。

1.に関してはjavascriptかPHPか分かりませんが別言語が混じっています。
それと関数名とやっている内容に凄まじくギャップがあります。関数名は機能を表す名前にしてください。
それと、ちゃんと関数をもっと細かく分けたほうがよさそうなレベルだと思います。

2.関してはstaticである必然はないので、とりあえずは普通のクラスとして組みましょう。
クラスのインスタンス生成とインスタンスの変数の保持方法を調べてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

テマリ

Re: C#のいくつかわからない部分について。

#5

投稿記事 by テマリ » 7年前

C#の入門書見ましたがまずはクラスとインスタンスを置いといて書けそうな感じで書いていこうと思います。

コード:

using System;
using System.Windows.Forms;
using System.Drawing;

class noutore : Form
{
    int btclick = 0, seikai = 0, huseikai = 0;
    int riro, riti;     //色と位置
    [STAThread]
    public static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new noutore());
    }

    private TableLayoutPanel[] tlp = new TableLayoutPanel[2];
    private Label[] lbl = new Label[2 * 2 * 2];
    private Button btn = new Button();
    private TableLayoutPanel tlpx;
    private Label[] lblx = new Label[6];
    private Label lbly = new Label();

    public noutore()
    {
        this.Text = "脳トレ";
        this.Size = new Size(2 * 300, 2 * 200);
        
        //テーブルレイアウトパネルのプロパティ初期化
        for (int i = 0; i < tlp.Length; i++)
        {
            tlp[i] = new TableLayoutPanel();
            tlp[i].BorderStyle = BorderStyle.FixedSingle; 
            tlp[i].ColumnCount = 2;
            tlp[i].RowCount = 2;
            tlp[i].Size = new Size(2 * 100 + 10, 2 * 100 + 10);
            tlp[i].Parent = this;
        }
        tlp[0].Location = new Point(20, 20);
        tlp[1].Location = new Point(2 * 100 + 120 , 20);
        
        //ラベルのプロパティ初期化
        for (int j = 0; j < tlp.Length; j++)
        {
            for (int i = 0; i < lbl.Length / 2; i++)
            {
                lbl[i] = new Label();
                lbl[i].BackColor = Color.White;
                lbl[i].BorderStyle = BorderStyle.FixedSingle;
                lbl[i].Size = new Size(100, 100);
                lbl[i].Parent = tlp[j];
            }
        }

        //ボタンのプロパティ初期化
        btn.Size = new Size(50, 20);
        btn.Text = "START";
        btn.Top = 2 * 100 + 40;
        btn.Left = 20;
        btn.Click += new EventHandler(btn_Click);
        btn.Parent = this;

        //テーブルレイアウトパネルxのプロパティ初期化
        tlpx = new TableLayoutPanel();
        tlpx.BorderStyle = BorderStyle.FixedSingle;
        tlpx.ColumnCount = 3;
        tlpx.RowCount = 2;
        tlpx.Size = new Size(170, 45);
        tlpx.Parent = this;
        tlpx.Location = new Point(20, 2 * 100 + 65);

        //ラベルxのプロパティ初期化
        for (int i = 0; i < lblx.Length; i++)
        {
            lblx[i] = new Label();
            lblx[i].BorderStyle = BorderStyle.FixedSingle;
            lblx[i].Size = new Size(50, 20);
            lblx[i].Parent = tlpx;
        }
        lblx[0].BackColor = Color.Magenta;
        lblx[1].BackColor = Color.Yellow;
        lblx[2].BackColor = Color.Red;
        lblx[3].BackColor = Color.Green;
        lblx[4].BackColor = Color.Blue;
        lblx[5].BackColor = Color.Cyan;

        //ラベルyのプロパティ初期化
        lbly = new Label();
        lbly.BorderStyle = BorderStyle.FixedSingle;
        lbly.Size = new Size(70, 20);
        lbly.Location = new Point(100, 2 * 100 + 40);
        lbly.Parent = this;
    }

    //ボタン.イベントハンドラ
    void btn_Click(object sender, EventArgs e)
    {
        lbly.Text = " ";
        lbly.BackColor = Color.White;
        if(btclick == 0)
        {
            Random rand = new Random();
            riro = rand.Next(6);        // 色の数値(0~5)をランダム生成
            riti = rand.Next(4) + 4;
            // 位置の数値(4~7)をランダム生成
            if (riro == 0)
            {
                switch (riti)
                {
                    case 4: lbl[4].BackColor = Color.Magenta; break;
                    case 5: lbl[5].BackColor = Color.Magenta; break;
                    case 6: lbl[6].BackColor = Color.Magenta; break;
                    case 7: lbl[7].BackColor = Color.Magenta; break;
                    default: MessageBox.Show("設計ミス。", "お知らせ"); break;
                }
            }
            else if (riro == 1)
            {
                switch (riti)
                {
                    case 4: lbl[4].BackColor = Color.Yellow; break;
                    case 5: lbl[5].BackColor = Color.Yellow; break;
                    case 6: lbl[6].BackColor = Color.Yellow; break;
                    case 7: lbl[7].BackColor = Color.Yellow; break;
                    default: MessageBox.Show("設計ミス。", "お知らせ"); break;
                }
            }
            else if (riro == 2)
            {
                switch (riti)
                {
                    case 4: lbl[4].BackColor = Color.Red; break;
                    case 5: lbl[5].BackColor = Color.Red; break;
                    case 6: lbl[6].BackColor = Color.Red; break;
                    case 7: lbl[7].BackColor = Color.Red; break;
                    default: MessageBox.Show("設計ミス。", "お知らせ"); break;
                }
            }
            else if (riro == 3)
            {
                switch (riti)
                {
                    case 4: lbl[4].BackColor = Color.Green; break;
                    case 5: lbl[5].BackColor = Color.Green; break;
                    case 6: lbl[6].BackColor = Color.Green; break;
                    case 7: lbl[7].BackColor = Color.Green; break;
                    default: MessageBox.Show("設計ミス。", "お知らせ"); break;
                }
            }
            else if (riro == 4)
            {
                switch (riti)
                {
                    case 4: lbl[4].BackColor = Color.Blue; break;
                    case 5: lbl[5].BackColor = Color.Blue; break;
                    case 6: lbl[6].BackColor = Color.Blue; break;
                    case 7: lbl[7].BackColor = Color.Blue; break;
                    default: MessageBox.Show("設計ミス。", "お知らせ"); break;
                }
            }
            else if (riro == 5)
            {
                switch (riti)
                {
                    case 4: lbl[4].BackColor = Color.Cyan; break;
                    case 5: lbl[5].BackColor = Color.Cyan; break;
                    case 6: lbl[6].BackColor = Color.Cyan; break;
                    case 7: lbl[7].BackColor = Color.Cyan; break;
                    default: MessageBox.Show("設計ミス。", "お知らせ"); break;
                }
            }
            btclick++;
        }
        else if (btclick == 1)
        {
            btclick--;
        }

    }
}
上記を書いてみて実行してボタンを押したらエラーダイアログが出ました。

コード:

/*
アプリケーションのコンポーネントで、ハンドルされていない例外が発生しました。[続行]をクリックすると、アプリケーションはこのエラーを無視し、続行しようとします。[終了をクリックすると、アプリケーションは直ちに終了します。

オブジェクト参照がオブジェクト インスタンスに設定されていません。

以下詳細
Just-In-Time (JIT) デバッグを呼び出すための詳細については、
ダイアログ ボックスではなく、このメッセージの最後を参照してください。

************** 例外テキスト **************
System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
   場所 noutore.btn_Click(Object sender, EventArgs e) 場所 C:\Users\yusuke\documents\visual studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Program.cs:行 110
   場所 System.Windows.Forms.Control.OnClick(EventArgs e)
   場所 System.Windows.Forms.Button.OnClick(EventArgs e)
   場所 System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   場所 System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   場所 System.Windows.Forms.Control.WndProc(Message& m)
   場所 System.Windows.Forms.ButtonBase.WndProc(Message& m)
   場所 System.Windows.Forms.Button.WndProc(Message& m)
   場所 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   場所 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   場所 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** 読み込まれたアセンブリ **************
mscorlib
    アセンブリ バージョン: 4.0.0.0
    Win32 バージョン: 4.0.30319.296 (RTMGDR.030319-2900)
    コードベース: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
WindowsFormsApplication2
    アセンブリ バージョン: 1.0.0.0
    Win32 バージョン: 1.0.0.0
    コードベース: file:///C:/Users/yusuke/documents/visual%20studio%202010/Projects/WindowsFormsApplication2/WindowsFormsApplication2/bin/Release/WindowsFormsApplication2.exe
----------------------------------------
System.Windows.Forms
    アセンブリ バージョン: 4.0.0.0
    Win32 バージョン: 4.0.30319.278 built by: RTMGDR
    コードベース: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
    アセンブリ バージョン: 4.0.0.0
    Win32 バージョン: 4.0.30319.282 built by: RTMGDR
    コードベース: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System
    アセンブリ バージョン: 4.0.0.0
    Win32 バージョン: 4.0.30319.296 built by: RTMGDR
    コードベース: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
mscorlib.resources
    アセンブリ バージョン: 4.0.0.0
    Win32 バージョン: 4.0.30319.235 (RTMGDR.030319-2300)
    コードベース: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_ja_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------
System.Windows.Forms.resources
    アセンブリ バージョン: 4.0.0.0
    Win32 バージョン: 4.0.30319.235 built by: RTMGDR
    コードベース: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_ja_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------

************** JIT デバッグ **************
Just-In-Time (JIT) デバッグを有効にするには、このアプリケーション、
またはコンピューター (machine.config) の構成ファイルの jitDebugging 
値を system.windows.forms セクションで設定しなければなりません。
アプリケーションはまた、デバッグを有効にしてコンパイルされなければ
なりません。

例:

<configuration>
    <system.windows.forms jitDebugging="true" />
</configuration>

JIT デバッグが有効なときは、このダイアログ ボックスで処理するよりも、
ハンドルされていない例外はすべてコンピューターに登録された
JIT デバッガーに設定されなければなりません。
*/
1.何が原因か教えて欲しいです。
2.C# 2010 Expressのコード書いてる時に文字がズラーっと出てくる設定を変える方法を教えて欲しいです。
3.private,public,クラスの安全性?とかはどうして必要なのか教えて欲しいです。
4.C言語でのsleep関数と同じような物がC#にもあるのか教えて欲しいです。
5.C#にマクロはないのでしょうか?
6.テーブルレイアウトパネルのセル内のラベルをセル一個一個の中心に置きたいんですがそういうプロパティはありますか?

Locationの値を掛け算とかでやってるのはマクロか変数でラベルの数やフォームやラベル等の位置やサイズを適用させるためです。
最初のプログラムということで小さめのプログラムを作って後々簡単に大きくしようという魂胆です。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: C#のいくつかわからない部分について。

#6

投稿記事 by YuO » 7年前

C#にはVisual Studioという強力なデバッグ環境があるので,それを使わないのは勿体ないのですが……。
テマリ さんが書きました:上記を書いてみて実行してボタンを押したらエラーダイアログが出ました。
デバッグ実行 ([デバッグ] - [デバッグ開始],ショートカットはF5) をしてください。
基本的に,[デバッグなしで開始]する必要性は乏しいです。
テマリ さんが書きました:1.何が原因か教えて欲しいです。
ダイアログにある通り,
テマリ さんが書きました:

コード:

オブジェクト参照がオブジェクト インスタンスに設定されていません。
が原因です。
場所は,
テマリ さんが書きました:

コード:

   場所 noutore.btn_Click(Object sender, EventArgs e) 場所 C:\Users\yusuke\documents\visual studio 2010\Projects\WindowsFormsApplication2\WindowsFormsApplication2\Program.cs:行 110
に示されています。
つまり,
テマリ さんが書きました:

コード:

                    case 5: lbl[5].BackColor = Color.Magenta; break;
にあたります。
デバッグ実行したらここで止まって,自動変数ウィンドウあたりを見れば,lbl[5]がnull参照であることがわかると思います。

lblの初期化は
テマリ さんが書きました:

コード:

        //ラベルのプロパティ初期化
        for (int j = 0; j < tlp.Length; j++)
        {
            for (int i = 0; i < lbl.Length / 2; i++)
            {
                lbl[i] = new Label();
                lbl[i].BackColor = Color.White;
                lbl[i].BorderStyle = BorderStyle.FixedSingle;
                lbl[i].Size = new Size(100, 100);
                lbl[i].Parent = tlp[j];
            }
        }
でやっているようですが,ここは明らかにおかしいです。

コード:

for (var i = 0; i < lbl.Length; ++i)
{
    lbl[i] = new Label();
    lbl[i].BackColor = Color.White;
    lbl[i].BorderStyle = BorderStyle.FixedSingle;
    lbl[i].Size = new Size(100, 100);
    tlp[i / 4].Controls.Add(lbl[i], i % 2, (i / 2) % 2);
}
のように,必要があります。

コードで書く前に,Visual Studioのデザイナを使って設定することを覚えた方が良いでしょう。
テマリ さんが書きました:2.C# 2010 Expressのコード書いてる時に文字がズラーっと出てくる設定を変える方法を教えて欲しいです。
「文字がズラーっと出てくる設定」とは何ですか。
また,それをどう変えたいのですか。
テマリ さんが書きました:3.private,public,クラスの安全性?とかはどうして必要なのか教えて欲しいです。
privateフィールドは,クラスが状態を安全に持つために必要です。
publicメンバへのアクセスによって,privateフィールドが矛盾した状態にならないように作られます。
詳しくはクラスベースのオブジェクト指向について学んで下さい。

他のprivateメンバは,publicメンバやprivateメンバの下請けです。
テマリ さんが書きました:4.C言語でのsleep関数と同じような物がC#にもあるのか教えて欲しいです。
少なくとも国際標準規格のC言語にsleepという関数は存在しません。
そのスレッドを最低でも指定した時間停止させるには,System.Threading.ThreadのSleepメソッドや,System.Threading.Tasks.TaskのDelayメソッドがあります。
ただし,これらはUIスレッドでは (asyncメソッド中でawaitと共にTask.Delayを行う場合を除いて) 使うことは推奨されませんし,通常使いません。

asyncでないイベントハンドラでは,よっぽど短期間で終わる処理を除いてTaskなりBackgroundWorkerなりに実行内容を丸投げするのが普通です。
# Modelの呼び出しを同期でやって,変更結果を非同期で受け取る,という実装も多いとは思いますが。
テマリ さんが書きました:5.C#にマクロはないのでしょうか?
ありません。
  • 定数定義を目的とするマクロ
    constを使うかstatic readonlyなフィールドまたはstaticな読み取り専用プロパティを使います。
    constの場合は完全に定数なので組み込み型のみ利用可能で,他のアセンブリへの参照であってもコンパイル時に展開されます。
    このため,円周率πなどの,(有意な範囲内で)変更しないことが確定しているもののみに使います。
  • インライン展開される関数を目的とするマクロ
    メソッドを定義します。
  • 記述の簡易化を目的とするマクロ
    直接の代替方法はないですが,Visual StudioにはT4 templateがあるので,基本的に困ることはないでしょう。
  • 条件コンパイルを目的とするマクロ
    条件コンパイル自体は残っています。また,System.Diagnostics.ConditionalAttributeを使って,特定のコンパイルシンボルが定義されているときのみ呼び出されるメソッド等を定義可能です。
テマリ さんが書きました:6.テーブルレイアウトパネルのセル内のラベルをセル一個一個の中心に置きたいんですがそういうプロパティはありますか?
各コントロールのAnchorプロパティを指定すれば可能です。
チュートリアル : TableLayoutPanel を使用した Windows フォーム上のコントロールの配置

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: C#のいくつかわからない部分について。

#7

投稿記事 by softya(ソフト屋) » 7年前

1.何が原因か教えて欲しいです。
デバッガで見ると分かりますが、初期化していないlblに代入しようとしています。

2.C# 2010 Expressのコード書いてる時に文字がズラーっと出てくる設定を変える方法を教えて欲しいです。
インテリセンスとかの自動補完のことでしょうか? 便利なので普通はOFFにしないんですけどね。
http://msdn.microsoft.com/ja-jp/library ... 90%29.aspx

3.private,public,クラスの安全性?とかはどうして必要なのか教えて欲しいです。
それはオブジェクト指向の基本ですので検索すれば色々出てきますので学んでください。
カプセル化といいます。
「カプセル化 - Wikipedia」
http://ja.wikipedia.org/wiki/%E3%82%AB% ... B%E5%8C%96
ようするに、関数やら変数はできるだけ内部に閉じ込めて変更できる状況を限定的にすることでバグを減らし将来の変更に備えるのです。

4.C言語でのsleep関数と同じような物がC#にもあるのか教えて欲しいです。
ウィンドウアプリはC#だろうとC++だろうとsleepしてはいけません。
一定周期で処理をしたい時はタイマーを使います。
「タイマ - C# フォーム しっかり入門」
http://www.wgag.net/csforms/0026.html

と書いていたらYuOさんが書き込んでくれたので、途中ですが終わります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

テマリ

Re: C#のいくつかわからない部分について。

#8

投稿記事 by テマリ » 7年前

ソフトやさんYuOさんありです。

コード:

using System;
using System.Windows.Forms;
using System.Drawing;

class noutore : Form
{
    int btclick = 0, seikai = 0, huseikai = 0;
    int riro, riti;     //色と位置
    [STAThread]
    public static void Main()
    {
        Application.EnableVisualStyles();
        Application.Run(new noutore());
    }

    private TableLayoutPanel[] tlp = new TableLayoutPanel[2];
    private Label[] lbl = new Label[2 * 2 * 2];
    private Button btn = new Button();
    private TableLayoutPanel tlpx;
    private Label[] lblx = new Label[6];
    private Label lbly = new Label();

    public noutore()
    {
        this.Text = "脳トレ";
        this.Size = new Size(2 * 300, 2 * 200);
        
        //テーブルレイアウトパネルのプロパティ初期化
        for (int i = 0; i < tlp.Length; i++)
        {
            tlp[i] = new TableLayoutPanel();
            tlp[i].BorderStyle = BorderStyle.FixedSingle; 
            tlp[i].ColumnCount = 2;
            tlp[i].RowCount = 2;
            tlp[i].Size = new Size(2 * 100 + 10, 2 * 100 + 10);
            tlp[i].Parent = this;
        }
        tlp[0].Location = new Point(20, 20);
        tlp[1].Location = new Point(2 * 100 + 120 , 20);
        
        //ラベルのプロパティ初期化
        for (int i = 0; i < lbl.Length; i++)
        {
            lbl[i] = new Label();
            lbl[i].BackColor = Color.White;
            lbl[i].BorderStyle = BorderStyle.FixedSingle;
            lbl[i].Size = new Size(100, 100);
            tlp[i / 4].Controls.Add(lbl[i], i % 2, (i / 2) % 2);
        }

        //ボタンのプロパティ初期化
        btn.Size = new Size(50, 20);
        btn.Text = "START";
        btn.Top = 2 * 100 + 40;
        btn.Left = 20;
        btn.Click += new EventHandler(btn_Click);
        btn.Parent = this;

        //テーブルレイアウトパネルxのプロパティ初期化
        tlpx = new TableLayoutPanel();
        tlpx.BorderStyle = BorderStyle.FixedSingle;
        tlpx.ColumnCount = 3;
        tlpx.RowCount = 2;
        tlpx.Size = new Size(170, 45);
        tlpx.Parent = this;
        tlpx.Location = new Point(20, 2 * 100 + 65);

        //ラベルxのプロパティ初期化
        for (int i = 0; i < lblx.Length; i++)
        {
            lblx[i] = new Label();
            lblx[i].BorderStyle = BorderStyle.FixedSingle;
            lblx[i].Size = new Size(50, 20);
            tlpx.Controls.Add(lblx[i], i % 3, (i / 3) % 2);
        }
        lblx[0].BackColor = Color.Magenta;
        lblx[1].BackColor = Color.Yellow;
        lblx[2].BackColor = Color.Red;
        lblx[3].BackColor = Color.Green;
        lblx[4].BackColor = Color.Blue;
        lblx[5].BackColor = Color.Cyan;

        //ラベルyのプロパティ初期化
        lbly = new Label();
        lbly.BorderStyle = BorderStyle.FixedSingle;
        lbly.Size = new Size(70, 20);
        lbly.Location = new Point(100, 2 * 100 + 40);
        lbly.Parent = this;
    }

    //ボタン.イベントハンドラ
    void btn_Click(object sender, EventArgs e)
    {
        lbly.Text = ""; lbly.BackColor = Color.White;
        if(btclick == 0)
        {
            Random rand = new Random();
            riro = rand.Next(6);        // 色の数値(0~5)をランダム生成
            riti = rand.Next(4) + 4;    // 位置の数値(4~7)をランダム生成
            if (riro == 0){ lbl[riti].BackColor = Color.Magenta; }
            else if (riro == 1){ lbl[riti].BackColor = Color.Yellow; }
            else if (riro == 2){ lbl[riti].BackColor = Color.Red; }
            else if (riro == 3){ lbl[riti].BackColor = Color.Green; }
            else if (riro == 4){ lbl[riti].BackColor = Color.Blue; }
            else if (riro == 5){ lbl[riti].BackColor = Color.Cyan; }

            btclick++;
        }
        else if (btclick == 1)
        {
            btclick--;
        }
    }
}
こんな感じでひとまずできたんですがAnchorやオブジェクト指向ってのがよくわからなくて聞いてばかりでMSDNを見てもわからないし、なんか効率悪いので家にある書籍大体読んで高校認定試験と基本情報処理技術者の勉強ある程度終わらせといてからC#の本を何冊か読んだ後にまた作ってみようと思います。
勝手な都合で途中でやめてしまってすみません。
遅くなるかもしれませんが作ったら見せたいので自己宣伝、ということでまた書き込みに来ます。
後、中卒で資格なしでプログラマの募集を面接受けてさせてもらってきます。不採用でもいい経験だと思って受けさせてもらってきます。

ありがとうございました。また来ます。

閉鎖

“C言語何でも質問掲示板” へ戻る