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

Вниз

Как _добавить_ действия на событие?   Найти похожие ветки 

 
Pasha L   (2008-07-21 18:16) [0]

Здравствуйте. У меня есть собственный класс, выполняющий базовые функции рисования (типа пэинта). Я создаю его и должен указать TGraphicControl, который будет являться по сути листом для рисования. Мне нужно повесить на OnMouseDown указанного контрола некоторые действия (начало рисования линии, к примеру). Как это сделать, не затронув при этом тот код, который уже висит на OnMouseDown контрола? (если я укажу MyControl.OnMouseDown=BeginPaintLine, то действия, которые раньше выполнялись на OnMouseDown, теперь выполняться перестанут).


 
AlexanderMS_   (2008-07-21 18:20) [1]

А разве нельзя назначить в OnMouseDown типа такой процедуры:
procedure MouseDown(Sender: TObject);
begin
 OldProc(Sender); // старая процедура-обработчкик
 BeginPaintLine(Sender);
end;


 
Рамиль ©   (2008-07-21 18:24) [2]

А от TGraphicControl наследоваться нельзя? Если наследуешь, достаточно перекрыть виртуальный метод MouseDown.

Если не хочешь (не можешь) наследоваться от него, то "спрячь" его в своем классе в качестве св-ва, и сделай OnMouseDown в своем классе.


 
Pasha L   (2008-07-21 19:44) [3]

Рамиль ©   (21.07.08 18:24) [2]
извините, я вас не понял.

Можно обрабатывать сообщения (движения мыши, например) с помощью методов с пометкой message (например, WM_MOUSEMOVE). Я могу повесить обработчик сообщения на определенный класс по ходу создания кода. А как повесить новый, дополнительный обрботчик на объект (к примеру, класса TControl), который указывается как аргумент в методе (моего класса), называющемся, к примеру, procedure AddMyActionOnMouseMovingTo(control:TControl). Можно ли сделать что-то вроде этого?
в общем, бывает ли что-то типа такого?:

AddNewHandlerOnMessageTo(
 Control:TControl;
 MessageIDToHandle:integer;
 ActionToExecuteOnMessage:Pointer
);


 
AlexanderMS_   (2008-07-21 20:47) [4]


> Pasha L   (21.07.08 19:44) [3]

Не знаю, правильно ли я понял ситуацию, но почему бы не так сделать:

var
OldProc : TNotifyEvent;

//////

OldProc := Control.OnMouseDone; // сохраняем старую процедуру
Control.OnMouseDone := NewProc; // присваваем новый обработчик события

///////

procedure NewProc(Sender : TObject);
begin
 OldProc(Sender); // вызываем тот обработчик, который был ранее
 // тут любые действия при OnMouseDown
end;


 
AlexanderMS_   (2008-07-21 20:49) [5]

Не OnMouseDone, а OnMouseDown, прошу прощения :)


 
Рамиль ©   (2008-07-22 09:01) [6]


> Pasha L   (21.07.08 19:44) [3]

Нет, в Delphi нельзя, в C# можно.

Все же я думаю, что в данном случае лучше наследоваться от TGraphicControl, тогда такие проблемы отпадут.

А если так
> А как повесить новый, дополнительный обрботчик на объект
> (к примеру, класса TControl), который указывается как аргумент
> в методе (моего класса)

т. е. даже не с-во класса, а аргумент метода, то я не знаю способа корректно навесить обработчик. Ибо если воспользоваться > AlexanderMS_   (21.07.08 20:47) [4] , то будет работать. НО (!) только в том случае, если обработчик будет установлен до передачи ссылки на объект в метод класса.



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

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

Наверх




Память: 0.48 MB
Время: 0.03 c
15-1215183486
Хохол
2008-07-04 18:58
2008.08.24
Пятничный флуд: Большой адронный коллайдер


2-1216662345
maksum
2008-07-21 21:45
2008.08.24
TreeNode


15-1215425702
shlst
2008-07-07 14:15
2008.08.24
asm + отладка и что бы delphi-like


2-1216301860
Mops
2008-07-17 17:37
2008.08.24
свой пункт меню


2-1216503960
batya-x
2008-07-20 01:46
2008.08.24
глюк