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