![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: нет Всего: 23 |
Создаю рисунок:
На процедуру iMouseDown программа не идет, предварительно выдав ошибку: Access violation at address 00000000. Read of address 00000000 в указанной строке. Что не правильно? Как сгенерировать iMouseDown? Image2 существует. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Такой обработчик просто не существует. Обработчик это метод, указатель которого записывается в специальное свойство тип которого метод. Обработчик вызывается изнутри класса только в том случае если он назначен, т.е. имело место присваивание, например button1.OnClick := UserDefinedMethod; Метод UserDefinedMethod - должен быть объявлен (и реализован) у любого класса, главное чтоб параметры соответсвовали типу метода OnClick (в данном случае это TNotfyEvent). После присвоения объект уже знает что есть обработчик и вызывает его по наступлению события. В данном случае вызов производится без предварительного присваивания метода. А что есть присваивание метода? Просто присваивание адреса точки его входа. Поскольку туда не было ничего записано, то по умолчанию там NIL а ему в памяти соотвествует значение 0. Т.е. программа пытается перейти к выполнению команд по нулевому адресу, а в Windows адреса этого диапазона являются запрещенными для любого использования. Т.е. в переводе это "ошибка доступа к адресу 0000, невозможно прочитать оттуда нифига" т.е. речь в данном случае идет о попытке прочитать несуществующие команды несуществующей процедуры по запрещенному адресу. А всего то нужно было присвоить обработчик -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: нет Всего: 23 |
Есть спасибо, но...
Почему проходит обычная процедура? Если я пишу:
alexeis1, объясни, пожалуйста, в чем же здесь отличие? Что-есть что? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Отличий в общем-то немного, но главное, то что событие это свойство, которое должно иметь значение. Т.е. это не сама процедура а место куда ее нужно записать. Когда записал, то она работает как обычная процедура, за исключением того, что в любые методы класса всегда передается один скрытый параметр - указатель на объект к котрому он принадлежит Self (В С++ это this), а обработчик сообщения кроме этого параметра должен принимать еще указатель на тот класс который его вызвыл, т.е. Sender, это делается для того чтобы один и тот же обработчик можно было присваивать разным объектам, даже объектам разных классов! Иногда это удобно, если для всех них должен выполнятся сходный код. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |