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