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

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

Как обратиться к компоненту на форме по номеру?


Страницы:   1 2

Семён ©   (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;


Страницы:   1 2

Наверх

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