![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как обратиться к компоненту на форме по номеру?
Семён © (2009-01-06 19:23:00)Ну, например, на форме: Button1, Button2, Button3. Я в цикле пытаюсь:
for i:=1 to 3 do Button ???
как вот этот [i] мне прибавить? Пробовал: [], ()...
Германн (2009-01-07 01:50:00) [1]
> Было бы лучше один раз запомнить ссылки на нужные кнопки
> в массиве, а потом вместо вызова FindComponent сразу брать
> кнопку по ее индексу.
>
+1
Вот никогда ещё не использовал функцию FindComponent. И не жалею об этом. :)
Anatoly Podgoretsky (2009-01-06 23:11:00) [2]Оно самое, очень опасная вещь.
Denis__ (2009-01-06 22:49:00) [3]Китайским - это копи-паст + выделить-напечатать свое?)))
Anatoly Podgoretsky (2009-01-06 22:44:00) [4]> Denis__ (06.01.2009 22:10:20) [20]
Опа, это осталось при переделки китайским методом.
Глаза не видят очевидного.
Denis__ (2009-01-06 22:10:00) [5]2Anatoly Podgoretsky[18]
Ну это-то я знаю)) Не совсем ламер. У вас тамif B is <>TButton then
Вот я про что:)
Denis__ (2009-01-06 22:06:00) [6]Просто я уже испугаться успел:) "<>" там какое-то! Думал - что-то я не так понял из объяснений Юрия и своих рассуждений)
Anatoly Podgoretsky (2009-01-06 22:05:00) [7]
> Что я делаю не так?
В каком коде, если в моем, то добавь два END в конце. Я привел только значимую часть.
Anatoly Podgoretsky (2009-01-06 22:03:00) [8]
> Юрий Зотов © (06.01.09 21:47) [11]
Пока я по NNTP форум читал, Юрий уже успел ответить исправленым кодом, практически буква в букву.
Denis__ (2009-01-06 22:01:00) [9]2Anatoly Podgoretsky ©
[Error] Unit1.pas(34): Expression expected but '<>' found
Что я делаю не так?
Denis__ (2009-01-06 21:59:00) [10]
> 1. if B is TButton заодно делает проверку на nil. Если компонент
> не был найден, условие не выполнится.
Это я проверил, спасибо:) Странно мне показалось, теперь все понятно.
Anatoly Podgoretsky (2009-01-06 21:56:00) [11]> Denis__ (06.01.2009 21:30:07) [7]
Если нужна такая гарантия, то
var
B: TComponent;
begin
for i := 1 to 3 do
begin
B := FindComponent('Button' + IntToStr(i));
if B is <> TButton then
TButton(B).Caption := 'Ура!';
Юрий Зотов (2009-01-06 21:52:00) [12]
> Denis__ © (06.01.09 21:49) [12]
Тут неявно используются еще 2 момента:
1. if B is TButton заодно делает проверку на nil. Если компонент не был найден, условие не выполнится.
2. Если условие выполнено, то компонент точно найден и он точно кнопка. Поэтому приведение типа будет безопасным.
Denis__ (2009-01-06 21:49:00) [13]Спасибо, Юрий. Что-то у меня гигантские пробелы)) про is не знал.
Юрий Зотов (2009-01-06 21:47:00) [14]> Denis__ © (06.01.09 21:30) [7]
Так будет немного лучше:
var
B: TComponent;
begin
for i := 1 to 3 do
begin
B := FindComponent('Button' + IntToStr(i));
if B is TButton then // Это быстрее, чем сравнивать строку ClassName
TButton(B).Caption := 'Ура!'; // Приведение типа быстрее, чем AS
end;
end;
Но вообще, код все равно неоптимальный. Было бы лучше один раз запомнить ссылки на нужные кнопки в массиве, а потом вместо вызова FindComponent сразу брать кнопку по ее индексу.
Хотя, конечно, выбор наилучшего решения обычно зависит от задачи.
Правильный$Вася (2009-01-06 21:46:00) [15]
> есть в этом коде ошибки/то чего лучше не делать?
эту проверку
> if B.ClassName = 'TButton'then
> (B as TButton).Caption := 'Ура!';
лучше делать через IS, поскольку нет гарантий
а то можно на exception вывалиться при AS
Denis__ (2009-01-06 21:46:00) [16]Но от чего-то отталкиваться надо)))
Заменить TButton на TMyCoolComponent не проблема)) Но Семён видимо не пытался этот код проверить, ибо вариант[5] не компилится. TButton <> TComponent :)
Правильный$Вася (2009-01-06 21:41:00) [17]
> Denis__ © (06.01.09 21:30) [7]
вообще-то автор не говорил, что его компоненты - кнопки, тем более TButton
Denis__ (2009-01-06 21:30:00) [18]неужели скомпилилось?!
var
B: TComponent;
begin
for i := 1 to 3 do
begin
B := FindComponent('Button' + IntToStr(i));
if B <> nil then
if B.ClassName = 'TButton' then
(B as TButton).Caption := 'Ура!';
end;
end;
Юрий, как Вам кажется, есть в этом коде ошибки/то чего лучше не делать? (Пытаюсь учиться всегда:))
Семён (2009-01-06 20:56:00) [19]Большое СПАСИБО, Юрий!
Юрий Зотов (2009-01-06 20:49:00) [20]> Семён (06.01.09 19:49) [4]
> как вот этот [i] мне прибавить?
var
B: TButton;
begin
for i := 1 to 3 do
begin
B := FindComponent('Button' + IntToStr(i));
if B <> nil then
B.Caption := 'Ура!';
end;
end;