Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как _добавить_ действия на событие? [D7, XP]


Pasha L ©   (2008-07-21 18:16:00) 

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


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


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

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

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

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

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


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

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


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


> 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;


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

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

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

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


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

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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо