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

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

Имя TComponent в качестве переменной? [D6, Win2k]


Valeris ©   (2002-10-23 10:31:00) 

Помогите плиз.

Есть 15 ProgressBar (ProgressBar1, ProgressBar2...ProgressBar15), как бы так сделать чтобы в зависимости от значения переменной i(1..15) можно было обращаться к нужному ProgressBar.


panov   (2002-10-23 12:32:00) [1]

procedureform1.GetProgressBar( constnBar: Integer): TProgressBar;
begin
Result := TProgressBar(FindComponent("ProgressBar"+IntToStr(nBar)));
end;


Alex4444444444   (2002-10-23 12:25:00) [2]

В run-time просто сделайте массив. (Я так понял, все проблемы как раз из-за design-time.) Потом, кто ж мешает в run-time писать .Create(MyForm) ?


Skier   (2002-10-23 12:18:00) [3]

>Alex4444444444


> Они все на форме...


Это в случае когда компоненты
создаются в design-time...<


Alex4444444444   (2002-10-23 12:16:00) [4]

А почему не перебирать Components? Они все на форме (обычно :)


Юрий Зотов   (2002-10-23 12:11:00) [5]

Да, можно. Но будет еще медленнее, причем намного. Это, конечно, тоже способ, но не самый лучший. Если ProgressBar"ы положены на форму в design-time, то простая замена массива Controls на массив Components будет действительно универсальной и без рекурсий. Если же они создаются в run-time - логично использовать массив или список.


Dynamit   (2002-10-23 11:41:00) [6]


> Юрий Зотов


Один мой преподаватель шутил: "Итерациями, батенька, итерациями".
Можно же перебрать контролы и в рекурсию, если они суть контейнеры!


Юрий Зотов   (2002-10-23 11:22:00) [7]

> Метод медленный, зато универсальный

Медленный - да. Универсальный - нет. Сработает ТОЛЬКО для TProgressBar"ов, лежаших на самой форме. А если на панели, в GroubBox"е или где угодно еще - не сработает .


Dynamit   (2002-10-23 10:43:00) [8]

Извини, забыл исправить:

Var
j: Integer;
begin
For j:=0 To XForm.ControlCount-1 Do
If XForm.Controls[j] is TProgressBar Then
Begin
If (XForm.Controls[j] As TProgressBar).Name="ProgressBar"+IntToStr(i) Then
Begin
//действия
End;
End;
end;


Dynamit   (2002-10-23 10:42:00) [9]


Var
j: Integer;
begin
For j:=0 To XForm.ControlCount-1 Do
If PCBoxes.Controls[j] is TProgressBar Then
Begin
If (PCBoxes.Controls[j] As TProgressBar).Name="ProgressBar"+IntToStr(i) Then
Begin
//действия
End;
End;
end;


XForm - контейнер, владелец объектов ProgressBar.

Метод медленный, зато универсальный


Skier   (2002-10-23 10:36:00) [10]

>Valeris
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1035271147&n=0


Smithson   (2002-10-23 10:33:00) [11]

Вариант самый простой - массив прогресбаров. Если они создаются не динамически, а на этапе проектирования, то присвой каждому в значение Tag числа 1..15 и ищи по этому значению в Form1.Components или Form1.Controls


Наверх

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