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

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

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


Rendal ©   (2009-08-31 17:21:00) 

Всем привет! Требуется  после запуска формы создать с помошью конструктора 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;


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


Rendal   (2009-09-01 14:58:00) [1]

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


Leonid Troyanovsky   (2009-09-01 13:16:00) [2]


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

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

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

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

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

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

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

--
Regards, LVT.


KSergey   (2009-09-01 11:44:00) [3]

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

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


Leonid Troyanovsky   (2009-09-01 08:10:00) [4]


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

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

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

--
Regards, LVT.


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

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

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


Leonid Troyanovsky   (2009-08-31 21:58:00) [6]


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

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

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

--
Regards, LVT.


stas   (2009-08-31 21:02:00) [7]

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


Юрий Зотов   (2009-08-31 19:31:00) [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(...);


Rendal   (2009-08-31 18:27:00) [9]

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


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

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


Rendal   (2009-08-31 18:13:00) [11]

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


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

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


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

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


Rendal   (2009-08-31 17:48:00) [14]

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


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

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

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


Наверх

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