Только что обновился на Tokyo и сразу влетел на ошибку в компоненте TMediaPlayerControl. Этот компонент вообще не держится на форме в дизайнере и исчезает с формы при первом же клике мыши по форме. Саму ошибку я зарегистрировал в Embarcadero и дело собственно не в ней.
Разбираясь с этой проблемой, я обнаружил следующий непонятный текст в файле FMX.Media.pas:
constructor TMediaPlayerControl.Create(AOwner: TComponent);
begin
inherited; TMessageManager.DefaultManager.SubscribeToMessage(TAfterCreateFormHandle, FormHandleAfterCreated);
TMessageManager.DefaultManager.SubscribeToMessage(TBeforeDestroyFormHandle, FormHandleBeforeDestroyed);
end;
Здесь интересен метод FormHandleAfterCreated. Его текст такой:
procedure TMediaPlayerControl.FormHandleAfterCreated(const Sender: TObject; const Msg: TMessage);
begin
if (FMediaPlayer <> nil) and (FMediaPlayer.FMedia <> nil) then
begin
if Sender is TForm then Parent := TForm(Sender);
end;
end;
То есть, разработчики здесь через подписанный метод, ни много ни мало, пытаются инициализировать Parent компонента! Но странность здесь в том, что этот метод никогда не будет вызван для компонента, так как сообщение TAfterCreateFormHandle генерится формой сразу после создания Handle формы, что собственно ясно даже из его названия (HandleAfterCreated). То есть, до того, как будут проинициализированы компоненты формы и вызваны их конструкторы с подпиской на этот класс. Следовательно и Parent компонента TMediPlayerControl в этом случае не будет проинициализирован.
Аналогичное использование подписки на TAfterCreateFormHandle я обнаружил и в компоненте TWebBrowser. То есть и там подписка из конструктора никогда не сработает, но тем не менее она и там есть!
Отсюда вопрос. А корректно ли вообще использовать подписки на TAfterCreateFormHandle в конструкторах компонентов? Или здесь есть какой-то скрытый смысл?
PS. Может быть дело в том, что разработчики компонент сами были введены в заблуждение следующими строками файла FMX.Forms.pas?
/// <summary>Notification about creating real form</summary>
TAfterCreateFormHandle = class(System.Messaging.TMessage<TCommonCustomForm>);
То есть, здесь в комментарии сказано, что класс TAfterCreateFormHandle это уведомление о создании формы, а не уведомление, о создании Handle формы, как следует даже из его названия.
Вопрос
Viktor Chekrygin
Добрый день.
Только что обновился на Tokyo и сразу влетел на ошибку в компоненте TMediaPlayerControl. Этот компонент вообще не держится на форме в дизайнере и исчезает с формы при первом же клике мыши по форме. Саму ошибку я зарегистрировал в Embarcadero и дело собственно не в ней.
Разбираясь с этой проблемой, я обнаружил следующий непонятный текст в файле FMX.Media.pas:
constructor TMediaPlayerControl.Create(AOwner: TComponent);
begin
inherited;
TMessageManager.DefaultManager.SubscribeToMessage(TAfterCreateFormHandle, FormHandleAfterCreated);
TMessageManager.DefaultManager.SubscribeToMessage(TBeforeDestroyFormHandle, FormHandleBeforeDestroyed);
end;
Здесь интересен метод FormHandleAfterCreated. Его текст такой:
procedure TMediaPlayerControl.FormHandleAfterCreated(const Sender: TObject; const Msg: TMessage);
begin
if (FMediaPlayer <> nil) and (FMediaPlayer.FMedia <> nil) then
begin
if Sender is TForm then
Parent := TForm(Sender);
end;
end;
То есть, разработчики здесь через подписанный метод, ни много ни мало, пытаются инициализировать Parent компонента! Но странность здесь в том, что этот метод никогда не будет вызван для компонента, так как сообщение TAfterCreateFormHandle генерится формой сразу после создания Handle формы, что собственно ясно даже из его названия (HandleAfterCreated). То есть, до того, как будут проинициализированы компоненты формы и вызваны их конструкторы с подпиской на этот класс. Следовательно и Parent компонента TMediPlayerControl в этом случае не будет проинициализирован.
Аналогичное использование подписки на TAfterCreateFormHandle я обнаружил и в компоненте TWebBrowser. То есть и там подписка из конструктора никогда не сработает, но тем не менее она и там есть!
Отсюда вопрос. А корректно ли вообще использовать подписки на TAfterCreateFormHandle в конструкторах компонентов? Или здесь есть какой-то скрытый смысл?
PS. Может быть дело в том, что разработчики компонент сами были введены в заблуждение следующими строками файла FMX.Forms.pas?
/// <summary>Notification about creating real form</summary>
TAfterCreateFormHandle = class(System.Messaging.TMessage<TCommonCustomForm>);
То есть, здесь в комментарии сказано, что класс TAfterCreateFormHandle это уведомление о создании формы, а не уведомление, о создании Handle формы, как следует даже из его названия.
Изменено пользователем Viktor ChekryginСсылка на комментарий
12 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.