Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите, плз, с динамическим созданием двумерного массива [D7, WinXP]


Destroyer ©   (2005-07-15 22:56:00) 

Динамически создаются панели, их может быть сколько угодно. На каждой пенели динамически создаются кнопки, их тоже должно быть сколько угодно. Надо создать динамический массив, который это описывал-бы. (например на 1-ой 3 кнопки, на 2-ой две и т.д.)
Т.е. массив вида: 1 1 1 1 1 1
                 2 2 2 2 2 2
                 3   3   3 3
                     4   4 4
                         5  
Как сделать такой массив (неквадратный)? Или есть предложения как еще осуществить такое создание кнопок и панелей?


Destroyer   (2005-07-16 18:09:00) [1]

Всё дошло. Я просто стормозил. Надо так:
ButOnPan[openedpan].But[nbOnPan]:=TSpeedButton.Create(Application);


Destroyer   (2005-07-16 17:43:00) [2]

Попробовал способом 286, но ошибка возникает там же. Причем видимо ошибка во втором значении двумерного массива
massiv[0,0].Create(Application);
Может я что-то не так делаю с динамическим созданием? Как правильно?


Destroyer   (2005-07-16 17:22:00) [3]

А можно сделать так, используя записи?
...
RecButOnPan=record
But:array of TSpeedButton;
end;
...
var
ButOnPan                :array of RecButOnPan;
openedpan               :integer;// индекс открытой панели
nbOnPan                 :integer;// индекс кнопки на открытой панели

procedure TForm1.Button1Click(Sender: TObject);
begin
openedpan:=0; // пусть открыта панель с индексом 0
// выделим память для панелей
setlength(ButOnPan,2); // допустим 2-ве панели
// выделим память для кнопок на панелях
nbOnPan:=nbOnPan+1;     // кноопок становится на 1 больше
if high(ButOnPan[openedpan].But)<0 then // если первая кнопка, то один элемент в массиве
begin
 setlength(ButOnPan[openedpan].But,1); // если первая кнопка, то элемент в массиве один
 nbOnPan:=0;               // индекс кнопки =0
end
else // если не первая, то
setlength(ButOnPan[openedpan].but,nbOnPan+1);   // ButOnPan[индекс панели на которой создавать кнопки].but,сколько всего кнопок
// создаём кнопки
ButOnPan[openedpan].But[nbOnPan].Create(Application);  // <-- тут ошибка access violation. Read of adress  что-то типа 00000000

end;
Выходит за пределы массива. Но почему? Вроде всё должно быть ок.
286, это примерно тоже, что и я предложил. Попробую и так.


286   (2005-07-16 13:58:00) [4]

Я вот прямо сейчас пишу программу с динамическими массивами
type
 Tmassiv = array of array of тип массива
var
 massiv : Tmassiv;
Смотри дальше:
Сначало задается размер по первому измерению (число столбцов)
 SetLenght (massiv, размер);
и дальше указываешь число элементов для каждого из столбцов
 SetLenght (massiv[0..размер], и число элементов)
т.е. это полностью покрывает твою задачу. Я щас делаю нечто похожее.


Гаврила   (2005-07-16 09:08:00) [5]


>  [6] Anatoly Podgoretsky ©  


> Панель уже имеет такой список


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


> [3] Destroyer ©   (15.07.05 23:27)
> Интересно. А можно ссылочку на инфу по работе со списками
> и объектами. А то что-то ничего дельного найти не могу.


Ну объекты (или классы) -  это, собственно, то, без чего программитрвать в Delphi вообще нереально, так что не знаю даже, какие ссылки нужны. Это основы языка.
А списки - класс TList находится в модуле Classes.pas, и хорошо описан в хелпе


Anatoly Podgoretsky   (2005-07-16 00:17:00) [6]

Панель уже имеет такой список. Сами же панели тоже расположены в каком то контейнере


default   (2005-07-15 23:35:00) [7]

Destroyer ©   (15.07.05 23:32) [4]
"моя твоя не понимать"(c)


Destroyer   (2005-07-15 23:32:00) [8]

default, зачем замарачиваться с лишними массивами, когда, видимо, такое осуществить можно.


Destroyer   (2005-07-15 23:27:00) [9]

Интересно. А можно ссылочку на инфу по работе со списками и объектами. А то что-то ничего дельного найти не могу.


default   (2005-07-15 23:26:00) [10]

что-то я не понял...
почему нельзя создать одномерный массив типа числа кнопок
индекс в массиве - номер панели...


Гаврила   (2005-07-15 23:02:00) [11]

Двумерный массив не подходит.
Я бы сделал объектами

Type
 TPanelObject = class
 private
   FPanel: TPanel;
   FButtons: array of TButton;
 end;

var
 A: array of TPanelObject;

Или вместо массивов списки (TList) (я бы сделал через списки)


Наверх

Титульная страница Поиск, карта сайта Написать письмо