Вниз
Скачать: 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
1-1197018990
Rav
2007-12-07 12:16
2008.08.24
Как преобразовать TField.DisplayWidth в ListView.Column[x].Width?


2-1216590932
timekiller
2008-07-21 01:55
2008.08.24
Как выделить строку в TMemo?


15-1212584346
Andy BitOff
2008-06-04 16:59
2008.08.24
Перестала выключаться машина!


2-1216281741
ZLO
2008-07-17 12:02
2008.08.24
Assert


15-1214923204
clickmaker
2008-07-01 18:40
2008.08.24
StarTeam 2008 и русские имена файлов




   Наверх