Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.014 c
15-1215082276
VLK32
2008-07-03 14:51
2008.08.24
Редактор кода в CodeGear RAD 2007


15-1215534864
Dreamse
2008-07-08 20:34
2008.08.24
Компиляция драйвера на Delphi


2-1216200887
multiflex
2008-07-16 13:34
2008.08.24
Не полная блокировка файла


15-1214401508
Поросенок Винни-Пух
2008-06-25 17:45
2008.08.24
А помните, как многие здесь ржали над парадоксальным?


15-1215076787
Сергей_77
2008-07-03 13:19
2008.08.24
Поиск работы




   Наверх