Как поймать "Access violation"
Есть у меня на форме компонент TreeView.
Я в нем на событии OnMouseDown делаю такую вещь:
{
TPoint pp;
pp.x=X;
pp.y=Y;
::ClientToScreen(Objects->Handle,&pp);
Objects->Selected=Objects->GetNodeAt(X,Y);
PopupMenu1->Popup(pp.x,pp.y);
}
Это для того чтоб при щелчке на ноде правой кнопкой сначала выделялась эта нода, а затем показывалось PopUp-меню. (кстати Objects - это просто название TreeView).
Все работает нормально до тех пор пока я не ткну правой кнопкой по пустому месту компонента (мимо ноды то есть). При этом вылетает ошибка "Access violation". и вылетает она на предпоследней строчке, видимо на функции GetNodeAt(X,Y). Подскажите как бы мне избежать этой ошибки или просто перехватить ее (как обычно поступают с исключениями)?
Заранее спасибо.
Добавлено: извини, сразу не всё внимательно прочёл. Посмотри, что возвращает GetNodeAt и какие ей даются X/Y.
Есть у меня на форме компонент TreeView.
Я в нем на событии OnMouseDown делаю такую вещь:
{
TPoint pp;
pp.x=X;
pp.y=Y;
::ClientToScreen(Objects->Handle,&pp);
Objects->Selected=Objects->GetNodeAt(X,Y);
PopupMenu1->Popup(pp.x,pp.y);
}
Это для того чтоб при щелчке на ноде правой кнопкой сначала выделялась эта нода, а затем показывалось PopUp-меню. (кстати Objects - это просто название TreeView).
Все работает нормально до тех пор пока я не ткну правой кнопкой по пустому месту компонента (мимо ноды то есть). При этом вылетает ошибка "Access violation". и вылетает она на предпоследней строчке, видимо на функции GetNodeAt(X,Y). Подскажите как бы мне избежать этой ошибки или просто перехватить ее (как обычно поступают с исключениями)?
Заранее спасибо.
Добавь вначале своего кода:
.nornad
Достойный ответ. Если нод не выбран - функция генерирует исключение.
А по поводу
То дело в том что ItemIndex в начале кода наверняка какой-то определенный. Он должен поменяться как раз за счет вызова функции GetNodeAt.
Надо каким-то образом до вызова этой функции проверять эти координаты.
А по поводу
То дело в том что ItemIndex в начале кода наверняка какой-то определенный. Он должен поменяться как раз за счет вызова функции GetNodeAt.
Надо каким-то образом до вызова этой функции проверять эти координаты.
А самому проверить - не никак?
Вопервых я ошибся - свойство ItemIndex у компонента отсутствует.
Что бы проверить что не один узел не выбран необходимо проверять Selected на равенство NULL. Во вторых функция возвращает опять же нулл если не один узел не выбран - но при этом никакой ошибки не возникает. Т.е. ошибка у тебя гдето дальше скорее всего ты пытаешься обрабатывать полученный узел - например так:
PopupMenu1->Items->Add(NewItem);
NewItem->Caption = "Menu Item " + Objects->Selected->Text;
Ошибка доступа при этом гарантирована, если валидность указателя не проверяется - или не перехватывается исключение
Есть ещё третий вариант. Иногда билдер мажет мимо строки, на которой падает. Редко, но бывает. В данном случае могло бы падать на пусто PopupMenu1, например...
Есть ещё третий вариант. Иногда билдер мажет мимо строки, на которой падает. Редко, но бывает. В данном случае могло бы падать на пусто PopupMenu1, например...
На пустом меню тоже не падает - как уже сказал выше - скорей всего в последствии пытается обратиться к полученному узлу. В этом случае ошибка возникает.
------
Вобщем проблема решена, и все намного проще чем мы думали. Я добавил в код проверку
и все заработало. Насколько я понял проблема все таки была в этой строчке:
Ведь если тыкаешь мышкой на пустом месте, то GetNodeAt возвращает NULL, и мы при этом пытаемся присвоить свойству Selected значение NULL. Видимо это и вызывает ошибку.
P.S. kot_ что-то тебе плюсик не ставится. Говорит что надо поставить плюсик кому-нибудь еще сначала, хотя я поставил перед этим плюсик .nornad
Если PopupMenu1 будет NULL, то упадёт. ;)
Я именно это имел в виду, когда предположил, что PopupMenu1 пустой.
Ведь если тыкаешь мышкой на пустом месте, то GetNodeAt возвращает NULL, и мы при этом пытаемся присвоить свойству Selected значение NULL. Видимо это и вызывает ошибку.
Нет никакой ошибки это не вызовет - просто снимется выделение и все. Судя по всему - ты гдето пытаешься обработать выбранный узел, не проверяя его на нулл
P.S. kot_ что-то тебе плюсик не ставится. Говорит что надо поставить плюсик кому-нибудь еще сначала, хотя я поставил перед этим плюсик .nornad
На форуме установлено ограничение - нельзя добавить репутацию, не добавив предварительно 10 после последнего. Так что не мучайся.