Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Присвоение события [D7, Win2k]


Страницы:   1 2

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);

В чем заключается несоответствие?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо