![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите, плз, с динамическим созданием двумерного массива [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) (я бы сделал через списки)