0

ユーザーがボタンを押すと、画像が9つのピクチャボックスの1つに配置されるプログラムのセクションを作成しようとしています。ボタンをクリックするたびに、異なるピクチャボックスが選択されます。ただし、それに到達する前に、メソッドに渡そうとしている配列を表示するのに問題があります。

Slots と SlotsUsed の 2 つの配列があり、プログラムの開始時にそれらを初期化しようとしています。ただし、「Button1」内で呼び出されるメソッド「randomBox」にそれらを渡そうとすると、ビジュアルスタジオはそれらが存在しないと言います。コード全体でこれらの配列を表示するにはどうすればよいですか?

どうもありがとうアンソニー

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace pin_program
{
    public partial class Mainscreen : Form
    {
        //Sets where users files are to be stored (for later use)
        string activeDir = @"C:\Users\Tony\Downloads\Programs\pin program\Users";

        public Mainscreen()
        {
            InitializeComponent();
        }

        //method to generate random number
        private int RandomNumber(int min, int max)
        {
            Random random = new Random();
            return random.Next(min, max);
        }

        public void randomBox(int pictureVal, PictureBox[] Slots, bool[] SlotsUsed)
        {
            //generate random number
            int j = RandomNumber(0, 9);

            if (SlotsUsed[j] == false)
            {
                // Create image, assign it and set slots value to used
                Image newImage = Image.FromFile(@"C:\Users\Tony\Downloads\Programs\pin program\pin program\pin program\Images\" + pictureVal + ".jpg");
                Slots[j].Image = newImage;
                SlotsUsed[j] = true;
            }
            else
                do
                {
                    j = RandomNumber(0, 9);
                } while (SlotsUsed[j] == false);

            return;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //for use later
            string userName = textBox1.Text;
            //for use later
            label1.Visible = true;

            //test call of method.
            randomBox(1, Slots, SlotsUsed);
        }

        public void Mainscreen_Load(object sender, EventArgs e)
        {
            //array for slots
            PictureBox[] Slots = new PictureBox[9];
            Slots[0] = pictureBox1;
            Slots[1] = pictureBox2;
            Slots[2] = pictureBox3;
            Slots[3] = pictureBox4;
            Slots[4] = pictureBox5;
            Slots[5] = pictureBox6;
            Slots[6] = pictureBox7;
            Slots[7] = pictureBox8;
            Slots[8] = pictureBox9;

            //array for used slots
            bool[] SlotsUsed = new bool[9];
            for (int i = 0; i != (SlotsUsed.Length); i++)
            {
                SlotsUsed[i] = false;
            }
        }
    }
}

編集:何らかの理由でコメントを投稿できないようですので、ここで質問します。配列をローカルではなくインスタンス変数として宣言するにはどうすればよいですか? インスタンス変数には、私が知っているかもしれない別の名前がありますか?

乾杯

4

2 に答える 2

2

Slots現在、 とSlotsUsedローカル変数として宣言していますMainscreen_Loadそれらはフォーム内のインスタンス変数である必要があります。そうしないと、他の場所でそれらを参照することができず、実際、論理的に他の場所に存在しません。これらはフォームの状態の一部であるため、インスタンス変数にする必要があります。

さらに、乱数を生成するためのアプローチが壊れています。詳細については、乱数に関する私の記事を参照してください。

また、単一のコレクションを使用することを検討し、最初はシャッフルしてから、必要に応じてアイテムを削除することを検討してください。そうすれば、画像がなくなったときに簡単に判断できます。未使用のスロットが見つかるまでループする必要はありません。

于 2012-07-16T16:00:14.583 に答える
0

これを行う最も簡単な方法は、フィールドを宣言することです。

protected PictureBox[] Slots

Form クラス内 (メソッドの外。

于 2012-07-16T16:00:24.363 に答える