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

Вниз

Создание объявлений для большого числа компонентов.   Найти похожие ветки 

 
Rendal ©   (2009-08-31 17:21) [0]

Всем привет! Требуется  после запуска формы создать с помошью конструктора n компонентов TImage, для того, чтобы в последствии можно было бы получить доступ к i-му.

Проблема в том, что возникает ошибка: Необъявлен i-ый компонент. Каким образом можно объявить компонент после запуска формы?

А также, какой тип имеет название компонента?
P.S. Это потребуется для процедуры в параметрах которой стоит номер компонента:
Например:

procedure moveleft(ComponentName:string;x:integer);
begin
  // объявитькомпонент
  Component:=TImage.Create(nil);
  Component.name:=ComponentName;
  ComponentName.Left:=ComponentName.Left-x;
end;


В процедуре, конечно полная ерунда. Хотелось бы узнать, как это можно записать по-другому.


 
Медвежонок Пятачок ©   (2009-08-31 17:36) [1]

Каким образом можно объявить компонент после запуска формы?

1. форма не запускается.
2. объявить что-либо можно только во время программирования. до компиляции.


 
Rendal ©   (2009-08-31 17:48) [2]

Т.е. мне придется объявлять все n-компонентов, даже если их тысяча?


 
Медвежонок Пятачок ©   (2009-08-31 17:53) [3]

если хочешь объявлять, то объявлять придется.


 
Vitalts   (2009-08-31 18:12) [4]

Динамические массивы в помощь


 
Rendal ©   (2009-08-31 18:13) [5]

Массивы из компонентов? Это что-то новенькое)


 
Медвежонок Пятачок ©   (2009-08-31 18:19) [6]

зато сантехники на формуме программистов - дело привычное


 
Rendal ©   (2009-08-31 18:27) [7]

более чем привычное)


 
Юрий Зотов ©   (2009-08-31 19:31) [8]

> Rendal ©   (31.08.09 18:13) [5]

> Массивы из компонентов? Это что-то новенькое)

А что в этом странного? Самая обычная вещь, ничего нового. Тип элементов массива может быть любым - хоть компонент, хоть вообще процедура.

Именно массив компонентов Вам и нужен.

var
 A: array of TImage;

procedure TForm1.MoveLeft(X: integer);
var
 C: TImage;
begin
 C := TImage.Create(Self);
 try
   C.Left := C.Left - X;
   C.Parent := Self;
   SetLength(A, Length(A) + 1);
   A[High(A)] := C
 except
   C.Free;
   raise
 end
end;

А имена созданным в run-time компонентам присваивать незачем, имя только в design-time требуется. Работайте с ними через массив, например:
A[i].LoadFromFile(...);


 
stas ©   (2009-08-31 21:02) [9]

Rendal ©   (31.08.09 17:21)
Можно для этих целей использовать, TStringList, TObjectList.


 
Leonid Troyanovsky ©   (2009-08-31 21:58) [10]


> Юрий Зотов ©   (31.08.09 19:31) [8]

> А что в этом странного?

Вот, для конструктора даже raise излишен.
Возможно, что Array properties спасут ОРД.

--
Regards, LVT.


 
Юрий Зотов ©   (2009-09-01 00:35) [11]

> Leonid Troyanovsky ©   (31.08.09 21:58) [10]

Не понял. Совсем.


 
Leonid Troyanovsky ©   (2009-09-01 08:10) [12]


> Юрий Зотов ©   (01.09.09 00:35) [11]

> Не понял. Совсем.

Юрий, ты, безусловно, гигант мысли,
но спасаем мы вопрошающего.

--
Regards, LVT.


 
KSergey ©   (2009-09-01 11:44) [13]

> Leonid Troyanovsky ©   (31.08.09 21:58) [10]
> > Юрий Зотов ©   (31.08.09 19:31) [8]
> Вот, для конструктора даже raise излишен.

Пачиму? не вижу в нем излишества в приведенном коде.


 
Leonid Troyanovsky ©   (2009-09-01 13:16) [14]


> KSergey ©   (01.09.09 11:44) [13]

> > Вот, для конструктора даже raise излишен.

> Пачиму? не вижу в нем излишества в приведенном коде.

Приведен-то не конструктор.

Большое количество объектов удобно держать в контейнере,
создавая их в его конструкторе. При желании можно, конечно,
и форму использовать как контейнер, но, в данном случае, проще
отдельный компонент, например, собственник всех изображений.
Любое исключение в конструкторе приведет к вызову
его деструктора, где все насозданное и удалится.

Для доступа по имени - array property, на основе, хоть FindComponent.

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

--
Regards, LVT.


 
Rendal ©   (2009-09-01 14:58) [15]

Спс за процедуру! Если я правильно понял: если я вызову процедуру 100 раз, то получу массив из 100 компонентов, причем без необходимости указания типа всех ста компоненитов. Также можно получить и доступ к i-ому. Это как раз то, что было нужно!



Страницы: 1 вся ветка

Текущий архив: 2009.10.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.021 c
2-1251266538
Риг
2009-08-26 10:02
2009.10.25
Зависание в THread


2-1251091205
belmol
2009-08-24 09:20
2009.10.25
directx


15-1250890438
Германн
2009-08-22 01:33
2009.10.25
Extra-USB порты на матплате.


2-1251206612
Дмитрий_
2009-08-25 17:23
2009.10.25
TStrngList.AddObject..?


15-1251149186
KilkennyCat
2009-08-25 01:26
2009.10.25
Что может быть причиной удаления файлов на XFS