Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамически созданный рисунок, Не реагрует на нажатие мышью 
:(
    Опции темы
anwe
Дата 4.12.2006, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



Создаю рисунок:
Код

type
procedure iMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
...
var   i:TImage;
procedure TForm1.Button1Click(Sender: TObject);
begin
i:=TImage.Create(Form1);
i.Parent:=Form1;
i.Left:=20;
i.Top:=30;
i.Picture:=Image2.Picture;
i.OnMouseDown(Sender,mbLeft,[ssLeft],X,Y);     //здесь ошибка
...
end;

procedure TForm1.iMouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
begin
...
end;

На процедуру iMouseDown программа не идет, предварительно выдав ошибку:
Access violation at address 00000000. Read of address 00000000 в указанной строке.

Что не правильно? Как сгенерировать iMouseDown?
Image2 существует.
PM MAIL   Вверх
Alexeis
Дата 4.12.2006, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(anwe @  4.12.2006,  00:55 Найти цитируемый пост)
i.OnMouseDown(Sender,mbLeft,[ssLeft],X,Y);

Такой обработчик просто не существует. Обработчик это метод, указатель которого записывается в специальное свойство тип которого метод. Обработчик вызывается изнутри класса только в том случае если он назначен, т.е. имело место присваивание, например 
button1.OnClick := UserDefinedMethod;
Метод UserDefinedMethod - должен быть объявлен (и реализован) у любого класса, главное чтоб параметры соответсвовали типу метода  OnClick (в данном случае это TNotfyEvent). 
После присвоения объект уже знает что есть обработчик и вызывает его по наступлению события.

В данном случае вызов
Цитата(anwe @  4.12.2006,  00:55 Найти цитируемый пост)
i.OnMouseDown(Sender,mbLeft,[ssLeft],X,Y);  

производится без предварительного присваивания метода. А что есть присваивание метода? Просто присваивание адреса точки его входа. Поскольку туда не было ничего записано, то по умолчанию там NIL а ему в памяти соотвествует значение 0. Т.е. программа пытается перейти к выполнению команд по нулевому адресу, а в Windows адреса этого диапазона являются запрещенными для любого использования. Т.е. в переводе это "ошибка доступа к адресу 0000, невозможно прочитать оттуда нифига" т.е. речь в данном случае идет о попытке прочитать несуществующие команды несуществующей процедуры по запрещенному адресу.

А всего то нужно было присвоить обработчик  smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
anwe
Дата 4.12.2006, 02:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 748
Регистрация: 2.9.2006

Репутация: нет
Всего: 23



Есть спасибо, но...
Почему проходит обычная процедура? Если я пишу:
Код

procedure proverka;
begin
...
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
proverka;
end;
то все получается?

alexeis1, объясни, пожалуйста, в чем же здесь отличие? Что-есть что?
PM MAIL   Вверх
Alexeis
Дата 4.12.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(anwe @  4.12.2006,  02:12 Найти цитируемый пост)
объясни, пожалуйста, в чем же здесь отличие? Что-есть что? 

Отличий в общем-то немного, но главное, то что событие это свойство, которое должно иметь значение. Т.е. это не сама процедура а место куда ее нужно записать. Когда записал, то она работает как обычная процедура, за исключением того, что в любые методы класса всегда передается один скрытый параметр - указатель на объект к котрому он принадлежит Self (В С++ это this), а обработчик сообщения кроме этого параметра должен принимать еще указатель на тот класс который его вызвыл, т.е. Sender, это делается для того чтобы один и тот же обработчик можно было присваивать разным объектам, даже объектам разных классов! Иногда это удобно, если для всех них должен выполнятся сходный код.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0529 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.