Ошибка при использовании кастомного класса TFrame в Firemonkey Delphi 10.3
Введение
В процессе разработки приложений с использованием Firemonkey в Delphi 10.3 пользователи могут столкнуться с проблемой, связанной с наследованием кастомных классов TFrame. В частности, при наследовании TFrameObserver от TCustomFrame и последующем наследовании TfStore от TFrameObserver возникает ошибка, связанная с несуществующим свойством Size.Width.
Проблема
При создании кастомного типа TCustomFrame, который является производным от TFrame, и добавлении функциональности через интерфейс IObserver в классе TFrameObserver, а затем наследовании TfStore от TFrameObserver, разработчики могут столкнуться с ошибкой при открытии проекта в режиме дизайна или выполнения:
Property fStore.Size.Width does not exist
Ошибка связана с тем, что в файле .fmx удаляются свойства Size.Width, Size.Height и Size.PlatformDefault, а вместо них добавляются свойства ClientWidth и ClientHeight. Если использовать прямое наследование от TFrame вместо TCustomFrame, проблема исчезает.
Репродукция проблемы
Для воспроизведения ошибки необходимо создать новый проект Firemonkey и добавить в него TFrame, который наследуется от тестового класса, аналогичного представленному в вопросе.
Подробное описание
В приведенном коде из контекста использования интерфейса IFrameTest и класса TFrameTest для создания производных классов TFrameITest и TFrame1 может возникнуть ошибка, аналогичная описанной выше. Ключевым моментом является использование кастомного класса TCustomFrame в качестве базового для наследования.
Решение
Для корректного наследования кастомных TFrame необходимо использовать специальные возможности IDE. Создайте базовый кастомный TFrame с помощью IDE, а затем создайте производный класс также через IDE, выбрав "Файл / Новый / другой... / Наследуемые элементы / выбрать первый кастомный TFrame". Если требуется использовать интерфейс, определите его в базовом классе и добавьте в классную декларацию.
И соответствующий файл .fmx будет содержать определение TFrame3 с заданными размерами.
Для производного класса TFrame4 код будет следующим:
unit Unit4;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls,
Unit3;
type
TFrame4 = class(TFrame3)
private
{ Private declarations }
public
procedure Test; override;
end;
var
Frame4: TFrame4;
implementation
{$R *.fmx}
{ TFrame4 }
procedure TFrame4.Test;
begin
ShowMessage('TFrame4.Test');
end;
end.
И соответствующий файл .fmx должен содержать наследование Frame4: TFrame4 с заданными размерами.
Заключение
Ошибка связана с особенностями работы IDE и необходимо следовать определенным правилам для корректного наследования кастомных TFrame. Если требуется использование IDE для управления кастомными TFrame, важно соблюдать порядок и процедуры, предусмотренные в IDE.
Важное примечание
Это не проблема в Delphi, а скорее особенность использования кастомных компонентов, для которых IDE выполняет специальную магию. Следование правилам и рекомендациям разработчиков позволит избежать подобных ошибок.
При использовании кастомного класса `TFrame` в Firemonkey Delphi 10.3 возникает ошибка, связанная с наследованием и удалением свойств в IDE.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.