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