Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

Помогите, плз, с динамическим созданием двумерного массива   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.055 c
9-1113211643
Nic87
2005-04-11 13:27
2005.08.07
NFGE - DEMO


14-1121371013
Gamer
2005-07-14 23:56
2005.08.07
UpGrade компа


1-1121867507
MegaVolt
2005-07-20 17:51
2005.08.07
Перекрыл Seek у TFileStream теперь не могу узнать Size :(


3-1119957729
AlexTregubov
2005-06-28 15:22
2005.08.07
Как проверить наличие поля в таблице


10-1098875056
Николай
2004-10-27 15:04
2005.08.07
Проблема MS Access