Форум: "Основная";
Текущий архив: 2006.05.21;
Скачать: [xml.tar.bz2];
ВнизДва и более обработчика события Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.011 c