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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2010, 21:58   #1
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию Обработчик OnClick у массива кнопок

Я конечно поимаю - всех уже забадал за сегодня но у меня остался, возможно последний вопрос...
Создаю массивом кнопки(30 шт, массив локальный в процедура создания формы):
Код:
for i:=1 to 30 do
begin
a[i]:=TButton.Create(self);
a[i].Name:='b'+inttostr(i);
a[i].Parent:=form1;
a[i].Width:=25;
a[i].Height:=25;
a[i].Top:=424;
a[i].Caption:=inttostr(i);
a[i].OnClick:=??????
try
a[i].Left:=24+a[i-1].Left;
except
a[i].Left:=30;
end;
Хочу сделать так чтобы при нажатии на i-ую кнопку, ее Enabled становился False, а у всех остальных кнопок массива Enabled становился true...
Пытался самостоятельно написать обработчик, но ничего не получается...
Мне раньше говорили, что в таких случаях с tag нужно работать, но я плохо понимаю, что это такое, а тем более не умею этим правильно пользоваться...И кстати...думал массив обьявить как глобальный, но фигня какая то - все эти кнопки смещаются как то косо.
Ненавижу быть как все, но люблю, чтобы все были как я.
MyLastHit вне форума Ответить с цитированием
Старый 14.12.2010, 22:03   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1. Каждый обработчик имеет параметр Sender
2. Пример это может выглядеть так
Код:
if (Sender is TButton) then (Sender as TButton).Enabled := False;
UPD:
Цитата:
очу сделать так чтобы при нажатии на i-ую кнопку, ее Enabled становился False, а у всех остальных кнопок массива Enabled становился true...
Может я не понимаю чего, но это попросту не реализуемо, т.к. у вас цикл от 1 до 30 и где участвует, как счетчик, именно i, и вопрос в таком случае просто не имеет смысла.

3. А еще есть свойство Tag - для хранения чего угодно.
BOBAH13 вне форума Ответить с цитированием
Старый 14.12.2010, 22:06   #3
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

А может лучше "одна нажата - остальные отжаты" ?
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Старый 14.12.2010, 22:10   #4
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию

Код:
(Sender as TButton).Enabled := False;
Спасибо! Это ведь действие с определенной кнопкой? А как на все кнопки массива разом подействовать через обработчик? Ну те сначала сделать у всех enabled:=true; а потом у нажатой enabled:=false.
Цитата:
А может лучше "одна нажата - остальные отжаты" ?
Мне бы принцип понять, а там "Нажата, отжата, активна, неактивна и тд" уже дело вкуса... Но сейчас нужно именно с Enabled работать...
Ненавижу быть как все, но люблю, чтобы все были как я.

Последний раз редактировалось MyLastHit; 14.12.2010 в 22:14.
MyLastHit вне форума Ответить с цитированием
Старый 14.12.2010, 22:33   #5
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Код:
procedure Tform1.a_click(Sender: TObject);
var
i:integer;
begin
for i:=1 to 30 do
begin
if a[i]=sender then
  a[i].Enabled:=false
  else
  a[i].Enabled:=true;
end;
end;

...
a[i].OnClick:=a_click;
это надо?
vovk вне форума Ответить с цитированием
Старый 14.12.2010, 22:35   #6
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию

Массив a[1..30] у меня локальный внутри процедуры создания формы...
Ненавижу быть как все, но люблю, чтобы все были как я.
MyLastHit вне форума Ответить с цитированием
Старый 14.12.2010, 22:43   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
type
  TForm1 = class(TForm)
    ...
    procedure ButtonClick(Sender: TObject);
  private
    ...
    a: array[1..30] of TButton;  //перетащить массив сюда
  public
  end;
...
procedure TForm1.ButtonClick(Sender: TObject);
var i: Integer;
begin
  for i:=1 to 30 do TButton(Sender).Enabled:=TButton(Sender)<>a[i];
end;
Массив a должен быть проинициализирован как в #1
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 14.12.2010 в 22:52.
Аватар вне форума Ответить с цитированием
Старый 14.12.2010, 22:54   #8
MyLastHit
Очень суровый
Участник клуба
 
Аватар для MyLastHit
 
Регистрация: 17.12.2009
Сообщений: 1,988
По умолчанию

Аватар, перенес массив в приваты, написал твой код, эфекта - 0...

Абдейт: Основываясь на твоем коде и на коде Вован13, вот что написал, насколько правильно ХЗ, но работает...
Цитата:
for i:=1 to 30 do a[i].Enabled:=true;
if (Sender is TsButton) then (Sender as TsButton).Enabled := False;
Ненавижу быть как все, но люблю, чтобы все были как я.

Последний раз редактировалось MyLastHit; 14.12.2010 в 23:02.
MyLastHit вне форума Ответить с цитированием
Старый 14.12.2010, 23:00   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Извини ошибся:

Код:
for i:=1 to 30 do a[i].Enabled:=TButton(Sender)<>a[i];
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 14.12.2010, 23:07   #10
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

Цитата:
Массив a[1..30] у меня локальный внутри процедуры создания формы...
ну можно так
Код:
procedure TForm1.a_click(Sender: TObject);
var
i:integer;
owner_:TForm;
begin
owner_:= ((sender as TButton).Owner as TForm);
for i:=0 to owner_.ControlCount -1 do
begin
if owner_.Controls[i] is TButton then
 if (owner_.ControlS[i] as TButton).tag=15 then
 (owner_.ControlS[i] as TButton).Enabled:=sender<>owner_.ControlS[i]; //тут сплагиатим))
end;
end;

......
.....
.....
a[i].tag:=15;
a[i].OnClick:=a_click;
vovk вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не срабатывает onclick zeharon JavaScript, Ajax 5 15.06.2010 09:11
Имитация onclick Qami JavaScript, Ajax 4 11.03.2010 23:52
getElement onClick Paguo-86PK JavaScript, Ajax 10 18.09.2009 23:11
OnClick для массива компонентов Dj_smart Компоненты Delphi 5 30.04.2008 14:16