Форум: "Начинающим";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];
ВнизПрисвоение события Найти похожие ветки
← →
MaXie (2006-11-28 13:14) [0]Профи! Подскажите плз. в чем возникает проблема:
Есть форма, которая которая содержит объект произвольного класса TSomeClass. В этом классе описано процедурное поле типа TNotifyEvent. При попытке присвоения метода(указателя) формы данному полю приводит к ошибке:
SomeClass.OnField := FormMethod;
где метод описан как:
procedure FormMethod(Sender :TObject);
Спасибо.
← →
Reindeer Moss Eater © (2006-11-28 13:22) [1]где метод описан как:
procedure FormMethod(Sender :TObject);
А должен быть описан не так, а как TNotifyEvent
← →
Elen © (2006-11-28 13:25) [2]
> [1] Reindeer Moss Eater © (28.11.06 13:22)
> где метод описан как:
>
> procedure FormMethod(Sender :TObject);
>
> А должен быть описан не так, а как TNotifyEvent
А он так и описан : вот из справки type TNotifyEvent = procedure (Sender: TObject) ofobject;
А как описан SomeClass.OnField&
← →
MaXie (2006-11-28 13:29) [3]Спасибо за быстрый отклик. :)
Возможно не совсем понял мысль, но метод соответствует требованиям типа TNotifyEvent:
TNotifyEvent = procedure(Sender: TObject) of object;
описание метода:
procedure FormMethod(Sender :TObject);
В чем заключается несоответствие?
← →
Reindeer Moss Eater © (2006-11-28 13:29) [4]А он так и описан
Неужели?
Осталось убедить в этом компилятор.
← →
Reindeer Moss Eater © (2006-11-28 13:30) [5]В чем заключается несоответствие?
<Цитата>
В том что это просто процедура, а не метод TObject"а
← →
RASkov (2006-11-28 13:31) [6]Покажи интерфейс TSomeClass и описание/реализацию procedure FormMethod(Sender :TObject);
← →
Elen © (2006-11-28 13:33) [7]
> В том что это просто процедура, а не метод TObject"а
Вот это скорее всего...
← →
MaXie (2006-11-28 13:33) [8]Хотелось бы добавить одну оговорку, возможно она внесет дополнительную специфику в постановку заданного вопроса - класс TSomeClass описан в отдельном юните, который через объявление uses просто добавлен к прочим.
← →
Elen © (2006-11-28 13:34) [9]
> класс TSomeClass описан в отдельном юните, который через
> объявление uses просто добавлен к прочим.
Как он описан?
← →
MaXie (2006-11-28 13:42) [10]TSomeClass описан следующим образом(прошу прощения за подмену наименований полей и имени класса):
unit untAlarm;
interface
uses
Classes;
type
TAlarm = class(TObject)
FOnAlarm :TNotifyEvent;
FOffAlarm :TNotifyEvent;
published
public
property OnAlarm :TNotifyEvent read FOnAlarm write FOnAlarm;
property OffAlarm :TNotifyEvent read FOffAlarm write FOffAlarm;
end;
Процедура FromMethod(Sender :TObject):
public
procedure prOnAlarm(Sender :TObject);
. . .
procedure TSomeForm.prOnAlarm(Sender :TObject);
begin
ShowMessage("OnAlarm");
end;
По клику на кнопке пытаюсь присвоить:
procedure TSomeForm.btSetClick(Sender: TObject);
begin
Alarm.OnAlarm := prOnAlarm;
end;
Экзешник компилится, но при клике выдается ошибка. :(
← →
MaXie (2006-11-28 13:45) [11]Соответственно в описании класса есть:
TSomeForm = class(TForm)
btSet: TButton;
procedure btSetClick(Sender: TObject);
. . .
private
Alarm: TAlarm;
. . .
← →
MBo © (2006-11-28 13:46) [12]>выдается ошибка. :(
существуют сотни ошибок. Мы должны догадаться, какая именно у тебя происходит, или все же приведешь сообщение об ошибке?
объект Alarm создан?
← →
MaXie (2006-11-28 13:50) [13]Сорри, не подумал... :(
Exception class EAccessViolation with message "Access violation at address 00457E62 in module "SomeProject.exe". Write of address 0000000C".
← →
MBo © (2006-11-28 13:52) [14]объект Alarm создан?
← →
Elen © (2006-11-28 13:53) [15]
> объект Alarm создан?
Судя по ошибке - не создан...
← →
MaXie (2006-11-28 13:56) [16]Могу жутко тупить, но объект Alarm, как я понимаю, должен автоматически создаться при создании формы. Во всяком случае, без явного вызова конструктора объекта, его методы успешно вызываются. ;)
← →
Reindeer Moss Eater © (2006-11-28 13:59) [17]как я понимаю, должен автоматически создаться при создании формы
Ну значит и ошибка должна автоматически исправится спустя некоторое время. Надо просто ничего не делать, а подождать у моря погоды.
← →
Elen © (2006-11-28 14:00) [18]
> MaXie
Может будет проще поставить бряк на точку ошибки и посмотреть чему равна prOnAlarm
← →
MaXie (2006-11-28 14:01) [19]Я понял. Создаем метод класса TAlarm:
type
TAlarm = class(TObject)
....
public
procedure prTEST;
Описываем реализацию метода:
procedure TAlarm.prTEST;
begin
ShowMessage("Объект создан!");
end;
Добавляем в юнит где описана форма:
procedure TSomeForm.btSetClick(Sender: TObject);
begin
Alarm.prTEST;
Alarm.OnAlarm := prOnAlarm;
end;
Компилим, запускаем, кликаем, видим окошко с сообщением "Объект создан!", после чего получаем сообщение об ошибке...
← →
Elen © (2006-11-28 14:02) [20]
> MaXie
чему равна prOnAlarm при выполнении?
← →
MaXie (2006-11-28 14:08) [21]Все верно... :(
Проблема в том, что объект Alarm не был создан. После явного вызова конструктора объекта, все заработало. :)
Большое спасибо всем откликнувшимся.
← →
MBo © (2006-11-28 14:09) [22]>MaXie
Стоит прочитать в книжке, что такое конструктор объекта, и для чего он нужен
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.12.17;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.044 c