Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.15;
Скачать: CL | DM;

Вниз

Как обратиться к компоненту на форме по номеру?   Найти похожие ветки 

 
Семён   (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
2-1231075826
Hank
2009-01-04 16:30
2009.02.15
Как "загрузить" все поля в ADOQuery?


11-1196708262
Artlav
2007-12-03 21:57
2009.02.15
RichEdit и подсветка


15-1228920974
@!!ex
2008-12-10 17:56
2009.02.15
Оценил простоту и мощь Lua


8-1187889577
solo.maestro
2007-08-23 21:19
2009.02.15
Замена звуковой дорожки в видеофайле


2-1230325419
programmer90
2008-12-27 00:03
2009.02.15
Хочу большие String-и:)