Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Переопределение событий

272
17 апреля 2005 года
vladsoft
512 / / 20.08.2000
Всем привет.
Недавно столкнулся с очень не прятной вещью, в своем компоненте я переопределяю ряд событий, которые мне нужны
Код:
в h файле:
TDragOverEvent     m_pOldDragOver;
в констукторе компонента:
m_pOldDragOver=this->OnDragOver;
this->onDragOver=this->smDragOver;

void __fastcall TsmTreeView::smDragOver(TObject *Sender, TObject *Source, int X, int Y, TDragState State, bool &Accept)
{
// вызываю сохраненный адрес
if (this->m_pOldDragOver)
        this->m_pOldDragOver(Sender,Source,X,Y,State,Accept);
// своя обработка
TTreeNode *node;
bool test;
AnsiString str;
TcxDragControlObject * DragObject;
DragObject = dynamic_cast<TcxDragControlObject*>(Source);
if(Sender->ClassNameIs("TsmTreeView")&& dynamic_cast<TsmTreeView *>(DragObject->Control)==this ) {
    node=this->GetNodeAt(X, Y);
    if (node!=NULL && node!=ddNode && ddNode->IndexOf(node)==-1) {
     ddTarget=node;
     Accept=true;
    }
    else {
     ddTarget=NULL;
     Accept = false;
    }
 }
else {
       ddTarget=NULL;
       Accept = false;
   }
}


Это все работает нормально..
А вот интересное начинается вот когда..
Из этого компонента сделал bpl потом у этого компонента определяю событие OnDragOver и получается вот что:
Обработка события внутри(smDarOver) компонента хериться, а обработка события которое определил в designed time работает.
То есть при определении еще одного события, то оно перехкрывает обработку этого события в самом компоненте, хотя я сохраняю адреса всех обработчиков ????:???:
10
17 апреля 2005 года
Freeman
3.2K / / 06.03.2004
Цитата:
Originally posted by vladsoft
Обработка события внутри(smDarOver) компонента хериться, а обработка события которое определил в designed time работает.


Сразу видно, что это твой первый компонент. Обычно пишут не так.

У Борланда в основном все вызовы обработчиков событий идут из виртуальных или динамаческих методов, которые и надо перекрывать. Появляется возможность делать свои действия или до обработчика, или после него.

Для проверки предположения конкретно для твоего события исходники VCL ковырять лень. Надеюсь, сам разберешься, раз компоненты писать взялся.

272
18 апреля 2005 года
vladsoft
512 / / 20.08.2000
Цитата:
Originally posted by Freeman
Сразу видно, что это твой первый компонент. Обычно пишут не так.

У Борланда в основном все вызовы обработчиков событий идут из виртуальных или динамаческих методов, которые и надо перекрывать. Появляется возможность делать свои действия или до обработчика, или после него.

Для проверки предположения конкретно для твоего события исходники VCL ковырять лень. Надеюсь, сам разберешься, раз компоненты писать взялся.


Спасибо? сейчас полезу в VCL...

272
18 апреля 2005 года
vladsoft
512 / / 20.08.2000
Цитата:
Originally posted by vladsoft
Привет... полазил я в исходниках CustomTreeView ничего что могло бы прояснить ситуацию не нашел, откопал только одну функцию:
procedure TCustomTreeView.CMDrag(var Message: TCMDrag);
begin
inherited;
with Message, DragRec^ do
case DragMessage of
dmDragMove:
with ScreenToClient(Pos) do
DoDragOver(Source, X, Y, Message.Result <> 0);
dmDragLeave:
begin
TDragObject(Source).HideDragImage;
FLastDropTarget := DropTarget;
DropTarget := nil;
TDragObject(Source).ShowDragImage;
end;
dmDragDrop: FLastDropTarget := nil;
end;
end;
А вот как сделать как ты говоришь так и не нашел, (

:{

272
18 апреля 2005 года
vladsoft
512 / / 20.08.2000
Насколько я понял inherited позволяет вызвать родительскую обработку... НО когда пользоваатель создавал событие, то моё не происходило(то есть родительское)... что-то не пойму как ту все крутится вертится...
246
18 апреля 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by vladsoft
Всем привет.
Недавно столкнулся с очень не прятной вещью, в своем компоненте я переопределяю ряд событий, которые мне нужны
...
Это все работает нормально..
А вот интересное начинается вот когда..
Из этого компонента сделал bpl потом у этого компонента определяю событие OnDragOver и получается вот что:
Обработка события внутри(smDarOver) компонента хериться, а обработка события которое определил в designed time работает.
То есть при определении еще одного события, то оно перехкрывает обработку этого события в самом компоненте, хотя я сохраняю адреса всех обработчиков ????:???:


...
Override DragOver to add additional code that executes before the OnDragOver event handler is called...

272
18 апреля 2005 года
vladsoft
512 / / 20.08.2000
Цитата:
Originally posted by GIZMO
...
Override DragOver to add additional code that executes before the OnDragOver event handler is called...


Я тоже это читал а вот как сделать млин мне бы сабж маленький на эту тему... :(

272
18 апреля 2005 года
vladsoft
512 / / 20.08.2000
Цитата:
Originally posted by vladsoft
Я тоже это читал а вот как сделать млин мне бы сабж маленький на эту тему... :(


Все разобрался.. спасибо

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог