Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > WinForms массив button'ов


Автор: Master_ 11.7.2009, 17:21
Как создать Windows::Forms::Button^ в виде массива? Чтобы иметь доступ ко всем элементам как к массиву?

Это нужно для игры в пятнашки - http://ru.wikipedia.org/wiki/Пятнашки.

Автор: Master_ 11.7.2009, 22:20
Вроде сделал, но ошибк на выход за пределы размерности:
Код

    public:
        Form1(void)
        {
            InitializeComponent();//Сгенерированное форм дизигнером
            EmptyPoint = Point();//пустое место
            ArrayList alAllButtons = gcnew ArrayList;//Массив всех кнопок

            //Добавляем все кнопки на панели в этот массив
            for each (Button^ b in panel1->Controls )
                alAllButtons.Add(b);
            Point^ p = gcnew Point(320,240);
            EmptyPoint.X = 240;
            EmptyPoint.Y = 240;
            NewGame();
        }
....

private: void generate()
             {
                 Random^ r = gcnew Random;
                 Button^ tempBtn = gcnew Button;
                 for (int i=0; i<100; ++i)
                 {
                     int temp = r->Next(alAllButtons.Count );
                     // Случайная кнопка из всех
                     tempBtn = (Button^) alAllButtons[r->Next(alAllButtons.Count )];                     
                     MoveButton(tempBtn);// Перемещаем            
                 }
             }
private: void NewGame()
             {
                 generate();
             }
    };
Ругается на tempBtn = (Button^) alAllButtons[r->Next(alAllButtons.Count )];, не могу понять, в чем дело.

Автор: voov 12.7.2009, 10:59
Цитата(Master_ @  11.7.2009,  22:20 Найти цитируемый пост)
Ругается

как именно ругается?

я не силен в WinForms, но могу предположить, что массивы там тоже индексируются с нуля, а рандом генерит числа включая граничные значения. в этом случае нужно так
Код

alAllButtons[r->Next(alAllButtons.Count - 1)];

Автор: Master_ 12.7.2009, 12:15
Цитата
Необработанное исключение типа "System.ArgumentOutOfRangeException" произошло в mscorlib.dll

Дополнительные сведения: Индекс за пределами диапазона. Индекс должен быть положительным числом, а его размер не должен превышать размер коллекции.


Если добавить -1, то 
Цитата
Необработанное исключение типа "System.ArgumentOutOfRangeException" произошло в mscorlib.dll

Дополнительные сведения: Значение "maxValue" должно быть больше нуля.

То есть получается, что alAllButtons.Count == 0.
Причем при заполнении в функции Form1(void) 
Код

            for each (Button^ b in panel1->Controls )
                alAllButtons.Add(b);

alAllButtons заполняется, но ее не видно в другой функции, в той где ошибка.
 smile 

Автор: voov 12.7.2009, 17:13
Цитата(Master_ @  12.7.2009,  12:15 Найти цитируемый пост)
То есть получается, что alAllButtons.Count == 0.
Причем при заполнении в функции Form1(void) 
alAllButtons заполняется, но ее не видно в другой функции, в той где ошибка.

стоп! а где у тебя объявлен массив alAllButtons?
поидее должен быть объявлен членом класса, но я вижу локальное объявление при инициализации
Код

            ArrayList alAllButtons = gcnew ArrayList;//Массив всех кнопок

            //Добавляем все кнопки на панели в этот массив
            for each (Button^ b in panel1->Controls )
                alAllButtons.Add(b);

скорее всего в этом дело. ты просто заполняешь один массив, а смотришь в другом.


ну а по поводу исключений, естественно, нужно убедиться, что массив не пуст до вызова рандома. и если это так, то вызывать его как я писал (с -1).

Автор: diadiavova 13.7.2009, 10:12
А зачем такие сложности с массивом и прочими прибамбасами? Можно использовать TableLayoutPanel. Коллекцией, содержащей все кнопки будет коллекция Controls этой панели, а индексироваться они будут по ячейке, в которой находятся. Для того, чтобы переместить кнопку понадобится всего лишь поменять ячейку, в которой она находится. Я так делал - получилось неплохо(правда проект не сохранился smile ).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)