Вопрос, поднятый пользователем, касается создания пользовательского компонента в FireMonkey (FMX), который мог бы функционировать как контейнер для других компонентов, аналогично TPopup. Основная проблема заключается в том, что при перетаскивании компонентов, таких как TEdit, в созданный контейнер, они не отображаются в правильном положении и при открытии формы компоненты дублируются. Пользователь также упомянул, что попытки использования события Notification для изменения родительского компонента не привели к успеху.
Решение проблемы
Для решения задачи необходимо изменить поведение компонента таким образом, чтобы все перетаскиваемые компоненты добавлялись в специальную область, предназначенную для них. В коде пользователя уже есть такая область — FpnlClientArea. Следует изменить метод DoAddObject, чтобы он добавлял все перетаскиваемые компоненты именно в эту область.
procedure TNaharFMXPopup.DoAddObject(const AObject: TFmxObject);
begin
if (FpnlClientArea <> nil) and not AObject.Equals(FpnlClientArea) and not AObject.Equals(ResourceLink) and
// Исключаем внутренние компоненты, которые не должны быть перетаскиваемыми
not AObject.Equals(FpnlMain) and not AObject.Equals(FlblTitle) and not AObject.Equals(FlytToolBar) and
not AObject.Equals(FbtnEdit) and not AObject.Equals(FbtnClose) and not AObject.Equals(FbtnSave) then
begin
FpnlClientArea.AddObject(AObject);
end
else
inherited;
end;
Также, чтобы избежать дублирования компонентов при открытии формы, необходимо убедиться, что все внутренние компоненты устанавливаются в режим Stored = false. Это предотвратит их сохранение в потоке компонентов.
Дополнительные рекомендации
Для улучшения пользовательского интерфейса и удобства работы с компонентом можно добавить следующие изменения:
Установить FpnlClientArea как объект типа TContent, что позволит компоненту корректно обрабатывать добавление дочерних компонентов.
Установить свойство ClipChildren для FpnlClientArea на true, чтобы дочерние компоненты не выходили за пределы клиентской области.
procedure TNaharFMXPopup.ApplyControlsProp;
begin
// ...
with FpnlClientArea do
begin
// ...
Stored := false;
ClipChildren := true; // Добавлено для ограничения области дочерних компонентов
end;
// ...
end;
Заключение
Изменение метода DoAddObject и правильная настройка внутренних компонентов позволит создать функциональный контейнер для компонентов в FireMonkey, который будет правильно обрабатывать перетаскивание и сохранение компонентов. Дополнительные настройки, такие как установка ClipChildren, помогут улучшить визуальное представление компонента.
Пользователь столкнулся с проблемой создания пользовательского компонента в FireMonkey, который корректно функционировал бы как контейнер для других компонентов, но при перетаскивании компонентов в него они отображаются не в правильных
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.