Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.049 c
2-1251168902
Sw
2009-08-25 06:55
2009.10.25
windows xp встроенный zip-архиватор


2-1251020827
EXEcER
2009-08-23 13:47
2009.10.25
Рэндом в Label


2-1251725937
Rembo
2009-08-31 17:38
2009.10.25
IdHttp.Post мультистрочная переменная


2-1251130365
andru
2009-08-24 20:12
2009.10.25
Пояснения по теме интервейсы


15-1249935362
XcCCC
2009-08-11 00:16
2009.10.25
сложение цвета





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский