Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1230991906
demon
2009-01-03 17:11
2009.02.15
Падсказка над иконкой в трее


2-1231418330
bioss
2009-01-08 15:38
2009.02.15
Как перевести каретку в начало текстового файла?


15-1229929438
Slider007
2008-12-22 10:03
2009.02.15
С днем рождения ! 20 декабря 2008 суббота


15-1229688631
Кое кто
2008-12-19 15:10
2009.02.15
Как переводиться have got?


2-1231259024
Семён
2009-01-06 19:23
2009.02.15
Как обратиться к компоненту на форме по номеру?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский