Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
ВнизПомогите, плз, с динамическим созданием двумерного массива Найти похожие ветки
← →
Destroyer © (2005-07-15 22:56) [0]Динамически создаются панели, их может быть сколько угодно. На каждой пенели динамически создаются кнопки, их тоже должно быть сколько угодно. Надо создать динамический массив, который это описывал-бы. (например на 1-ой 3 кнопки, на 2-ой две и т.д.)
Т.е. массив вида: 1 1 1 1 1 1
2 2 2 2 2 2
3 3 3 3
4 4 4
5
Как сделать такой массив (неквадратный)? Или есть предложения как еще осуществить такое создание кнопок и панелей?
← →
Гаврила © (2005-07-15 23:02) [1]Двумерный массив не подходит.
Я бы сделал объектами
Type
TPanelObject = class
private
FPanel: TPanel;
FButtons: array of TButton;
end;
var
A: array of TPanelObject;
Или вместо массивов списки (TList) (я бы сделал через списки)
← →
default © (2005-07-15 23:26) [2]что-то я не понял...
почему нельзя создать одномерный массив типа числа кнопок
индекс в массиве - номер панели...
← →
Destroyer © (2005-07-15 23:27) [3]Интересно. А можно ссылочку на инфу по работе со списками и объектами. А то что-то ничего дельного найти не могу.
← →
Destroyer © (2005-07-15 23:32) [4]default, зачем замарачиваться с лишними массивами, когда, видимо, такое осуществить можно.
← →
default © (2005-07-15 23:35) [5]Destroyer © (15.07.05 23:32) [4]
"моя твоя не понимать"(c)
← →
Anatoly Podgoretsky © (2005-07-16 00:17) [6]Панель уже имеет такой список. Сами же панели тоже расположены в каком то контейнере
← →
Гаврила © (2005-07-16 09:08) [7]
> [6] Anatoly Podgoretsky ©
> Панель уже имеет такой список
Имеет, только там не одни кнопки. И третья кнопка не обязательно соответствует третьему элементу в списке панели
> [3] Destroyer © (15.07.05 23:27)
> Интересно. А можно ссылочку на инфу по работе со списками
> и объектами. А то что-то ничего дельного найти не могу.
Ну объекты (или классы) - это, собственно, то, без чего программитрвать в Delphi вообще нереально, так что не знаю даже, какие ссылки нужны. Это основы языка.
А списки - класс TList находится в модуле Classes.pas, и хорошо описан в хелпе
← →
286 © (2005-07-16 13:58) [8]Я вот прямо сейчас пишу программу с динамическими массивами
type
Tmassiv = array of array of тип массива
var
massiv : Tmassiv;
Смотри дальше:
Сначало задается размер по первому измерению (число столбцов)
SetLenght (massiv, размер);
и дальше указываешь число элементов для каждого из столбцов
SetLenght (massiv[0..размер], и число элементов)
т.е. это полностью покрывает твою задачу. Я щас делаю нечто похожее.
← →
Destroyer © (2005-07-16 17:22) [9]А можно сделать так, используя записи?
...
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, это примерно тоже, что и я предложил. Попробую и так.
← →
Destroyer © (2005-07-16 17:43) [10]Попробовал способом 286, но ошибка возникает там же. Причем видимо ошибка во втором значении двумерного массива
massiv[0,0].Create(Application);
Может я что-то не так делаю с динамическим созданием? Как правильно?
← →
Destroyer © (2005-07-16 18:09) [11]Всё дошло. Я просто стормозил. Надо так:
ButOnPan[openedpan].But[nbOnPan]:=TSpeedButton.Create(Application);
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.05 c