Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
Время: 5.186 c
15-1164646508
Гарри Поттер
2006-11-27 19:55
2006.12.17
Как побезопасней сеть настроить?


2-1164635692
Draught
2006-11-27 16:54
2006.12.17
Событие DBEdit - нажатие Enter или другой заданой клавиши


1-1162229507
Morrison
2006-10-30 20:31
2006.12.17
Работа со SciZipFile. Как создать архив и запаковать туда файлы?


2-1163964531
flock
2006-11-19 22:28
2006.12.17
Число


15-1164491860
ProgRAMmer Dimonych
2006-11-26 00:57
2006.12.17
Безо всяких приколов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский