![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Два и более обработчика события [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]идея такова - пишется обработчик-обертка, в котором в нужной последовательности вызываются дополнительные обработчики
естественно, с передачей им параметров обертки