![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Присвоение события [D7, Win2k]
MaXie © (2006-11-28 13:14:00)Профи! Подскажите плз. в чем возникает проблема:
Есть форма, которая которая содержит объект произвольного класса TSomeClass. В этом классе описано процедурное поле типа TNotifyEvent. При попытке присвоения метода(указателя) формы данному полю приводит к ошибке:
SomeClass.OnField := FormMethod;
где метод описан как:
procedure FormMethod(Sender :TObject);
Спасибо.
MBo (2006-11-28 14:09:00) [1]>MaXie
Стоит прочитать в книжке, что такое конструктор объекта, и для чего он нужен
MaXie (2006-11-28 14:08:00) [2]Все верно... :(
Проблема в том, что объект Alarm не был создан. После явного вызова конструктора объекта, все заработало. :)
Большое спасибо всем откликнувшимся.
Elen (2006-11-28 14:02:00) [3]
> MaXie
чему равна prOnAlarm при выполнении?
MaXie (2006-11-28 14:01:00) [4]Я понял. Создаем метод класса 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:00:00) [5]
> MaXie
Может будет проще поставить бряк на точку ошибки и посмотреть чему равна prOnAlarm
Reindeer Moss Eater (2006-11-28 13:59:00) [6]как я понимаю, должен автоматически создаться при создании формы
Ну значит и ошибка должна автоматически исправится спустя некоторое время. Надо просто ничего не делать, а подождать у моря погоды.
MaXie (2006-11-28 13:56:00) [7]Могу жутко тупить, но объект Alarm, как я понимаю, должен автоматически создаться при создании формы. Во всяком случае, без явного вызова конструктора объекта, его методы успешно вызываются. ;)
Elen (2006-11-28 13:53:00) [8]
> объект Alarm создан?
Судя по ошибке - не создан...
MBo (2006-11-28 13:52:00) [9]объект Alarm создан?
MaXie (2006-11-28 13:50:00) [10]Сорри, не подумал... :(
Exception class EAccessViolation with message 'Access violation at address 00457E62 in module 'SomeProject.exe'. Write of address 0000000C'.
MBo (2006-11-28 13:46:00) [11]>выдается ошибка. :(
существуют сотни ошибок. Мы должны догадаться, какая именно у тебя происходит, или все же приведешь сообщение об ошибке?
объект Alarm создан?
MaXie (2006-11-28 13:45:00) [12]Соответственно в описании класса есть:
TSomeForm = class(TForm)
btSet: TButton;
procedure btSetClick(Sender: TObject);
. . .
private
Alarm: TAlarm;
. . .
MaXie (2006-11-28 13:42:00) [13]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;
Экзешник компилится, но при клике выдается ошибка. :(
Elen (2006-11-28 13:34:00) [14]
> класс TSomeClass описан в отдельном юните, который через
> объявление uses просто добавлен к прочим.
Как он описан?
MaXie (2006-11-28 13:33:00) [15]Хотелось бы добавить одну оговорку, возможно она внесет дополнительную специфику в постановку заданного вопроса - класс TSomeClass описан в отдельном юните, который через объявление uses просто добавлен к прочим.
Elen (2006-11-28 13:33:00) [16]
> В том что это просто процедура, а не метод TObject'а
Вот это скорее всего...
RASkov (2006-11-28 13:31:00) [17]Покажи интерфейс TSomeClass и описание/реализацию procedure FormMethod(Sender :TObject);
Reindeer Moss Eater (2006-11-28 13:30:00) [18]В чем заключается несоответствие?
<Цитата>
В том что это просто процедура, а не метод TObject'а
Reindeer Moss Eater (2006-11-28 13:29:00) [19]А он так и описан
Неужели?
Осталось убедить в этом компилятор.
MaXie (2006-11-28 13:29:00) [20]Спасибо за быстрый отклик. :)
Возможно не совсем понял мысль, но метод соответствует требованиям типа TNotifyEvent:
TNotifyEvent = procedure(Sender: TObject) of object;
описание метода:
procedure FormMethod(Sender :TObject);
В чем заключается несоответствие?