Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > неявное обращение к процедуре


Автор: Grig 25.5.2005, 02:49
Вот, товарищи, возникла такая проблема:
Допустим на форме расположено 50 Radiobutton-ов
Под названиями R1, R2..R50.
как создать примерно такую процедуру???:

Код

for i:=1 to 50 do
  begin
    procedure TForm1.RadioButton[i]Click(Sender: TObject);
      begin

      end;
  end;

Автор: <Spawn> 25.5.2005, 04:43
Если у них один обрабочик, то просто, правда тебе нужно будет создать массив указателей на TRadioButton:


Код

var 
  RadioButtons: array[1..50] of TRadioButton; //Где то до вызова :)

//Потом вызываешь так
for i := 1 to 50 do
  RadioButtonClick(RadioButtons[i]);


Если же обработчики разные, то можешь сделать так:

Код

var
  RadioButtonEvents: array[1..50] of TNotifyEvent; //Опять же массив нужно заполнить, например в OnCreate :)

for i := 1 to 50 do
  RadioButtonEvents[i](nil);  //ni только в том случае, если ты ни как параметр Sender внутри не используешь


Либо даже так, но этот способ будет значительно тормознее(особенно при наличии большого количество других компонентов на форме):

Код

procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
  RadioButton: TRadioButton;
begin
  for i := 1 to 50 do
  begin
    RadioButton := FindComponent(Format('R%d', [i])) as TRadioButton;
    if Assigned(RadioButton) and Assigned(RadioButton.OnClick) then
      RadioButton.OnClick(RadioButton);
  end;
end;

Автор: Dynamic 25.5.2005, 06:37
Или так:
Код

   TForm1 = class(TForm)
   // здесь всякие другие твои объявления
    procedure RadioBtClick(Sender: TObject);
   end;

// ..........

procedure TForm1.RadioBtClick(Sender: TObject);
begin
   if Sender is TRadioButton then
   case TRadioButton(Sender).Tag of
     0: ;
     1: ;
     // .................
    end;
end
;

А в инспекторе всем радиокнопкам устанавливаешь нужные теги и один общий OnClick - RadioBtClick().

Автор: Grig 25.5.2005, 09:11
Я наверное не совсем точно выразился...
Вы подумали что мне надо вызвать 50 процедур а они на каждой кнопке разные...
Дело в другом: Есть одна процедура, которую надо повешать на все 50 событий.
Код

for i:=1 to 50 do    
  begin    
    procedure TForm1.RadioButton[i]Click(Sender: TObject);    
      begin    
         en_but;////////Это имя процедуры!///////
      end;    
  end;


Пробовал конечно использовать предложенный Вами код:


Код

procedure TForm1.RadioBtClick(Sender: TObject);    
begin    
   if Sender is TRadioButton then    
   case TRadioButton(Sender).Tag of    
    
     1..50: en_but;    

    end;    
end;

Но в моем случае это не работает так как надо...
Может есть другие варианты?

Автор: Dynamic 25.5.2005, 10:16
В твоем случае можно просто написать:
Код

procedure TForm1.RadioBtClick(Sender: TObject);    
begin    
   if Sender is TRadioButton then en_but;
end;
Этот обработчик назначил всем нужным контролам?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)