Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.21;
Скачать: CL | DM;

Вниз

Два и более обработчика события   Найти похожие ветки 

 
DeadMoroz   (2006-04-11 13:04) [0]

Привет! кто знает как написать несколько обработчиков для события, чтобы они выполнялись последовательно? В 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.
Объясните плиз поподробнее, как это должно работать!


 
Desdechado ©   (2006-04-11 13:13) [1]

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


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

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


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


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

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


 
Amoeba ©   (2006-04-11 13:28) [4]


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

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


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


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


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

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


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


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


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

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


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


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

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


 
MBo ©   (2006-04-11 14:54) [8]

Assigned


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

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

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);



Страницы: 1 вся ветка

Текущий архив: 2006.05.21;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.061 c
15-1146150656
DillerXX
2006-04-27 19:10
2006.05.21
вы когда-нибудь pas2c рабочую видили?


3-1143804426
Almikus
2006-03-31 15:27
2006.05.21
Присвоение данных полям


15-1146121470
DVM
2006-04-27 11:04
2006.05.21
Описание формата SMS сообщений


2-1146927028
AlexanderMS
2006-05-06 18:50
2006.05.21
Поиск и замена


3-1143189367
Emik
2006-03-24 11:36
2006.05.21
InterBase+SQL