В режиме исполнения только пакет, я определил TFrame потомка, который публикует OnLoaded событие:Как правильно опубликовать мероприятие?
type
TMyMethod = procedure() of object;
TMyFrame = class(TFrame)
protected
FOnLoaded : TMyMethod;
procedure Loaded(); override;
published
property OnLoaded : TMyMethod read FOnLoaded write FOnLoaded;
end;
implementation
{$R *.dfm}
procedure TMyFrame.Loaded();
begin
inherited;
if(Assigned(FOnLoaded))
then FOnLoaded();
end;
В DesignTime только пакет, я зарегистрирован компонент TMyFrame следующим образом:
unit uMyRegistrations;
interface
uses
Classes, uMyFrame;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('MyTestComponents', [
TMyFrame
]);
end;
Я установил пакет времени разработки, я могу найти TMyFrame в палитре инструментов, и его событие OnLoaded отображается в инспекторе объектов.
Я перетащил TMyFrame в форму, после чего я назначил событие OnLoaded двойным щелчком от инспектора объекта. После назначения события я заметил, что при попытке открыть файл формы в Delphi появляется сообщение об ошибке нарушения прав доступа (он позволяет мне открыть файл «.pas», но я не могу переключиться на визуальный дизайнерский вид).
ли я правильно опубликовал OnLoaded событие? Если да, что еще не так?
Дальнейшая информация:
- Я использую Delphi 2007 (не знаю, если это имеет значение).
- Ошибка также возникает, если сделать то же самое с разными родительскими классами (не только для потомков TFrame).
Параметр 'Функция Assigned' должна защищать против этого уже. [Во время разработки среда IDE назначает обработчик события специальному значению, поэтому он знает, что писать в ресурсе DFM, но это 'Assigned' будет считаться неназначенным.] (Http://community.embarcadero.com/blogs/entry/assign-or-not-assign-that-is-the-question-28836) Если только что-то особенное об увольнении обработчиков событий из «Loaded», я думаю, что в этом вопросе больше. –
@RobKennedy Я думаю, что вы правы, большое вам спасибо. Я думаю, что происходит нечто большее. Я не могу полностью объяснить это, но я могу воспроизвести проблемы из метода Loaded без каких-либо тестов для 'Assigned' и без указателей на методы. –
Я принял ваш ответ, потому что добавление условия «не (csDesigning в ComponentState)» разрешило ошибку AV, и я подумал, что это была основная причина, по которой у меня был AV во время разработки. Согласно вашему обновленному ответу, условие «Назначено (...)» достаточно для «нормальных» событий. Я проверил событие TCustomForm.DoShow, и я могу подтвердить, что вы сказали, он запускает событие OnShow, подобное этому: «Если назначено (FOnShow), то FOnShow (Self);». Я задам конкретный вопрос о выполнении событий из таких методов, как Loaded. Спасибо, что вы обновили свой ответ. – ExDev