Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.17;
Скачать: CL | DM;

Вниз

Присвоение события   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.062 c
8-1146557385
zoltan
2006-05-02 12:09
2006.12.17
Как найти площадь фигуры произвольной формы


2-1164964269
Cobra
2006-12-01 12:11
2006.12.17
Моя форма непрямоугольная


15-1164489734
Дмитрий Белькевич
2006-11-26 00:22
2006.12.17
Выполнение праллельных тредов на нескольких камнях


2-1164883305
Creative
2006-11-30 13:41
2006.12.17
Как на API будет "если зажат Shift"?


15-1164317844
LarryLamer
2006-11-24 00:37
2006.12.17
Реализация управлениями баз данных