в 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 работает.
То есть при определении еще одного события, то оно перехкрывает обработку этого события в самом компоненте, хотя я сохраняю адреса всех обработчиков ????:???:
Цитата:
Originally posted by vladsoft
Обработка события внутри(smDarOver) компонента хериться, а обработка события которое определил в designed time работает.
Обработка события внутри(smDarOver) компонента хериться, а обработка события которое определил в designed time работает.
Сразу видно, что это твой первый компонент. Обычно пишут не так.
У Борланда в основном все вызовы обработчиков событий идут из виртуальных или динамаческих методов, которые и надо перекрывать. Появляется возможность делать свои действия или до обработчика, или после него.
Для проверки предположения конкретно для твоего события исходники VCL ковырять лень. Надеюсь, сам разберешься, раз компоненты писать взялся.
Цитата:
Originally posted by Freeman
Сразу видно, что это твой первый компонент. Обычно пишут не так.
У Борланда в основном все вызовы обработчиков событий идут из виртуальных или динамаческих методов, которые и надо перекрывать. Появляется возможность делать свои действия или до обработчика, или после него.
Для проверки предположения конкретно для твоего события исходники VCL ковырять лень. Надеюсь, сам разберешься, раз компоненты писать взялся.
Сразу видно, что это твой первый компонент. Обычно пишут не так.
У Борланда в основном все вызовы обработчиков событий идут из виртуальных или динамаческих методов, которые и надо перекрывать. Появляется возможность делать свои действия или до обработчика, или после него.
Для проверки предположения конкретно для твоего события исходники VCL ковырять лень. Надеюсь, сам разберешься, раз компоненты писать взялся.
Спасибо? сейчас полезу в VCL...
Цитата:
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;
А вот как сделать как ты говоришь так и не нашел, (
Привет... полазил я в исходниках 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;
А вот как сделать как ты говоришь так и не нашел, (
:{
Насколько я понял inherited позволяет вызвать родительскую обработку... НО когда пользоваатель создавал событие, то моё не происходило(то есть родительское)... что-то не пойму как ту все крутится вертится...
Цитата:
Originally posted by vladsoft
Всем привет.
Недавно столкнулся с очень не прятной вещью, в своем компоненте я переопределяю ряд событий, которые мне нужны
...
Это все работает нормально..
А вот интересное начинается вот когда..
Из этого компонента сделал bpl потом у этого компонента определяю событие OnDragOver и получается вот что:
Обработка события внутри(smDarOver) компонента хериться, а обработка события которое определил в designed time работает.
То есть при определении еще одного события, то оно перехкрывает обработку этого события в самом компоненте, хотя я сохраняю адреса всех обработчиков ????:???:
Всем привет.
Недавно столкнулся с очень не прятной вещью, в своем компоненте я переопределяю ряд событий, которые мне нужны
...
Это все работает нормально..
А вот интересное начинается вот когда..
Из этого компонента сделал bpl потом у этого компонента определяю событие OnDragOver и получается вот что:
Обработка события внутри(smDarOver) компонента хериться, а обработка события которое определил в designed time работает.
То есть при определении еще одного события, то оно перехкрывает обработку этого события в самом компоненте, хотя я сохраняю адреса всех обработчиков ????:???:
...
Override DragOver to add additional code that executes before the OnDragOver event handler is called...
Цитата:
Originally posted by GIZMO
...
Override DragOver to add additional code that executes before the OnDragOver event handler is called...
...
Override DragOver to add additional code that executes before the OnDragOver event handler is called...
Я тоже это читал а вот как сделать млин мне бы сабж маленький на эту тему... :(
Цитата:
Originally posted by vladsoft
Я тоже это читал а вот как сделать млин мне бы сабж маленький на эту тему... :(
Я тоже это читал а вот как сделать млин мне бы сабж маленький на эту тему... :(
Все разобрался.. спасибо