Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2010, 01:42   #1
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
Восклицание Массив компонентов

Здравствуйте, у меня появился небольшой вопрос. У меня на форме есть несколько компонентов Button. Я слышал, что как-то можно обращаться с ними как с массивом. Вообще интересует, как задать событие для одного компонента, но так, чтобы оно действовало для всего массива. Ну например, проходила бы проверка нажатой кнопки по свойству Tag.

Вот, что уже есть:

Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  i, But: Byte;
begin
  But := 0;
  for i := 0 to Form1.ComponentCount - 1 do begin
    if (Components[i] is TButton) then begin
      aButtons[But] := TButton(Components[i]);
      Inc(But);
    end;
  end;
end;
Это создание массива из кнопок. А вот как создать событие для этого массива - не знаю.
ZotaC вне форума Ответить с цитированием
Старый 30.07.2010, 02:08   #2
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Это нужно обязательно "рантайм" делать? А то в "дизайне" можно ж выделить сразу несколько кнопок и назначить им один обработчик...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 30.07.2010, 02:25   #3
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Да уж, я этого не знал. Но все равно, даже если так делать, то событие создается для одной кнопки. А как, например, проверить свойство Tag в таком случае?

Я про то, что если использовать такой способ, то на какую бы кнопку ты ни нажал, произойдет одно и то же событие. Как обратиться именно к той кнопке, что нажата?
ZotaC вне форума Ответить с цитированием
Старый 30.07.2010, 02:36   #4
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Там как раз для этого есть переменная Sender...
На форуме много примеров...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 30.07.2010, 02:47   #5
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

Ну вот, например, если мне нужно сделать кнопки с помощью Image. У меня несколько кнопок, и я хочу, чтобы при наведении (onMouseMove) на каждую из них в них загружалась другая картинка. Допустим, имена кнопок такие: Up, Down, а имена изображений, соответствующих им - Up1.bmp и Down1.bmp. Для того, чтобы не создавать по 2 лишних события на каждую кнопку, где будет всего по несколько строк кода (загрузка изображения) я и хочу создать одно событие для всех кнопок.

В этом событии и будет происходить загрузка изображения:

Имя кнопки + '1.bmp';

Но у Sender нету поля 'Name'. Как же быть?
ZotaC вне форума Ответить с цитированием
Старый 30.07.2010, 03:18   #6
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Печаль Я ж говорил - на форуме много примеров.....

Цитата:
Но у Sender нету поля 'Name'. Как же быть?
Код:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var i: Integer;
begin
for i:=0 to Form1.ComponentCount-1 do
      if (Form1.Components[i] is TImage) then
            TImage(Components[i]).Picture.LoadFromFile(TImage(Components[i]).Name+'_normal.bmp');
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
TImage(Sender).Picture.LoadFromFile(TImage(Sender).Name+'_over.bmp');
end;
Где Image1MouseMove - одна процедура для всех TImage...


P.S. Лучше уж тогда из ресурсов чтоль загружать... Или в TImageList какой...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 31.07.2010, 08:11   #7
MonoLife
Пользователь
 
Регистрация: 23.04.2009
Сообщений: 53
По умолчанию

But: Byte;
...
Inc(But);
и что будет, когда кол-во кнопок превысит 255?
MonoLife вне форума Ответить с цитированием
Старый 31.07.2010, 14:22   #8
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
По умолчанию

Станет равным нулю... Оно как бы по кругу будет идти...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Старый 31.07.2010, 18:32   #9
ZotaC
Форумчанин
 
Аватар для ZotaC
 
Регистрация: 25.06.2009
Сообщений: 163
По умолчанию

MonoLife, я, хоть и пишу довольно большую программу, но это не 3D Max, не Photoshop и даже не WinAmp. Поверьте, я пытаюсь мыслить глобально, но в радиусе моего обзора не проскакивала ситуация, когда количество кнопок в моей программе превысило бы 255, иначе я написал бы там Integer.

'И что будет, когда кол-во кнопок превысит 2147483647?',- написали бы тогда вы.
ZotaC вне форума Ответить с цитированием
Старый 31.07.2010, 20:28   #10
DomiNick
Студент, не
Старожил
 
Аватар для DomiNick
 
Регистрация: 29.01.2009
Сообщений: 2,067
Восклицание

А у меня бывали неожиданные баги когда я использовал беззнаковые типы в циклах и.т.п... Так что пожалуй всё-таки лучше Integer (всего-то на 3 байта больше)...
Цитата:
'И что будет, когда кол-во кнопок превысит 2147483647?',- написали бы тогда вы.
Нет. Переменная (если её так назвать можно) ComponentCount сама типа Integer, да ещё и -1... Так что с "i: Integer;" оно не выйдет за границы...
I am the First of Cyber Evolution...
I am the First to Program your Future...
DomiNick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив компонентов uzumaxy Общие вопросы C/C++ 3 16.03.2010 21:29
Отрисовка компонентов Dr.Badnezz Компоненты Delphi 1 04.01.2009 16:50
Удаление компонентов SanekIrk Общие вопросы Delphi 8 16.08.2008 09:26
Массив компонентов TEdit Prisian Компоненты Delphi 6 28.12.2007 20:08