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

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

Два и более обработчика события [D6, Win2k]


DeadMoroz ©   (2006-04-11 13:04:00) 

Привет! кто знает как написать несколько обработчиков для события, чтобы они выполнялись последовательно? В DW6 нашел такой пример для решения подобной задачи:

procedure TForm1.FormKeyDownFIRST(Sender: TObject;
var Key: Word; Shift: TShiftState);

procedure TForm1.FormKeyDownFirstSECOND(Sender: TObject;
var Key: Word; Shift: TShiftState);

// А потом, где нужно, подставляешь соответствующий адрес
@Form1.FormKeyDown=@Form1.FormKeyDownFIRST


Но оно нихрена не работает - Говорит Not enough actual parameters.
Объясните плиз поподробнее, как это должно работать!


Бурундук   (2006-04-11 16:03:00) [1]

можно сделать объект-ретранслятор:

type
 TKeyEventRetranslator = class
 private
   FHandlers: array of TKeyEvent;
 public
   procedure Add(Handler: TKeyEvent);
   procedure EventHandler(Sender: TObject; var Key: Word; Shift: TShiftState);
 end;
     
{ TKeyEventRetranslator }

procedure TKeyEventRetranslator.Add(Handler: TKeyEvent);
begin
 //Тут, конечно, надо проверку на дубликат
 SetLength(FHandlers, Length(FHandlers)+1);
 FHandlers[Length(FHandlers)-1] := Handler;
end;

procedure TKeyEventRetranslator.EventHandler(Sender: TObject; var Key: Word; Shift: TShiftState);
var i: Integer;
begin
 for i := 0 to Length(FHandlers)-1 do
   FHandlers[i](Sender, Key, Shift);
end;

   //...
   Form1.OnKeyDown := Retranslator.EventHandler;
   Retranslator.Add(FormKeyDownFIRST);
   Retranslator.Add(FormKeyDownSECOND);


MBo   (2006-04-11 14:54:00) [2]

Assigned


DeadMoroz   (2006-04-11 14:46:00) [3]


> Обработчик может быть только один

А как определить, есть ли обработчик для этого события?


Плохиш   (2006-04-11 13:52:00) [4]


> // А потом, где нужно, подставляешь соответствующий адрес
> @Form1.FormKeyDown=@Form1.FormKeyDownFIRST


procedure TForm1.Какаятофигня;
begin
 OnKeyDown=FormKeyDownFIRST;
end;

PS. За использование Form1 вырываю руки без разговоров ;-)


Сергей М.   (2006-04-11 13:45:00) [5]


> Говорит Not enough actual parameters


А ты их передаешь, параметры-то эти самые ?

@Form1.FormKeyDown=@Form1.FormKeyDownFIRST(где они, параметры-то ? Их аж 3 штуки требуется здесь указать, а ты ни одного не указал)


Amoeba   (2006-04-11 13:28:00) [6]


> DeadMoroz   (11.04.06 13:23) [2]
> а если обработчик уже есть, например на событии BeforeDelete,
>  и я хочу в рантайме добавить еще один, который будет выполняться
> после того, что уже есть - как мне поступить?

Обработчик может быть только один. Сделать как так, как написано в твоем последнем посте невозможно.


Плохиш   (2006-04-11 13:25:00) [7]


> DeadMoroz   (11.04.06 13:23) [2]
> а если обработчик уже есть, например на событии BeforeDelete,
>  и я хочу в рантайме добавить еще один, который будет выполняться
> после того, что уже есть - как мне поступить?

Сохранить старый обработчик, присвоить свой обработчик. В своём обработчике вставить вызов старого обработчика.


DeadMoroz   (2006-04-11 13:23:00) [8]

а если обработчик уже есть, например на событии BeforeDelete, и я хочу в рантайме добавить еще один, который будет выполняться после того, что уже есть - как мне поступить?


Desdechado   (2006-04-11 13:13:00) [9]

идея такова - пишется обработчик-обертка, в котором в нужной последовательности вызываются дополнительные обработчики
естественно, с передачей им параметров обертки


Наверх

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