В процессе разработки приложения на Delphi 7 с использованием MDI-формы и пакетов (packages) может возникнуть задача доступа к переменным основного приложения из дочерних форм, расположенных в пакетах. В данной статье мы рассмотрим, как можно решить эту задачу, сохраняя при этом принципы хорошего дизайна и инкапсуляции.
Проблема доступа к переменным
Основная проблема, с которой сталкиваются разработчики, заключается в том, что дочерние формы не имеют прямого доступа к переменным основного приложения. Это связано с тем, что дочерние формы не обладают информацией о родительской форме, и, следовательно, не могут напрямую обращаться к ней. Это является хорошей практикой проектирования и соответствует принципам инкапсуляции. Идеальный вариант подразумевает, что дочерние формы могут быть размещены в любом контейнере, не зависимо от реализации.
Решение с использованием интерфейсов
Для решения задачи необходимо создать механизм, который позволит дочерним формам получать информацию от своего хоста, не зная при этом о деталях его реализации. Это естественным образом приводит к использованию интерфейсов.
Шаг 1: Определение интерфейса
Сначала нужно определить, какую информацию хост должен предоставлять дочерним формам. Например:
type
IAppProps = interface
['{...}'] // Уникальный GUID для интерфейса
function GetUserName: string;
property UserName: string read GetUserName;
// Другие свойства и/или методы по мере необходимости
end;
Шаг 2: Реализация интерфейса в хосте
Далее необходимо реализовать данный интерфейс в основном приложении или в другом классе, который будет служить хостом для дочерних форм:
type
TMainForm = class(TForm, IAppProps)
...
function GetUserName: string;
...
end;
Дочерние формы должны иметь возможность получать ссылку на интерфейс IAppProps:
type
TBaseChildForm = class(TForm)
private
FAppProps: IAppProps;
public
property AppProps: IAppProps read FAppProps write FAppProps;
end;
Шаг 4: Передача интерфейса при создании дочерней формы
Когда хост создает дочернюю форму, он просто назначает ссылку на интерфейс:
ChildForm.AppProps := Self;
Теперь дочерняя форма может обращаться к переменным основного приложения через интерфейс IAppProps, не зная о внутреннем устройстве хоста.
Альтернативный подход с использованием SysUtils.Supports
В качестве альтернативы можно использовать функцию SysUtils.Supports, которая возвращает интерфейс, если он поддерживается. Пример реализации:
Определение интерфейса в основном приложении.
Использование SysUtils.Supports для получения интерфейса в дочерних формах.
type
IMainFormProperties = interface
['{2F4913C6-09D6-472B-8D03-9A04B312B36C}']
// Определение свойств и методов
end;
В дочерних формах:
var
cnt : integer;
iApp : IMainFormProperties;
begin
if Supports(Application.MainForm, IMainFormProperties, iApp) then
begin
// Работа с интерфейсом
end;
end;
Заключение
Мы рассмотрели два способа доступа к переменным основного приложения из дочерних форм в MDI-интерфейсе Delphi 7. Оба подхода позволяют сохранить принципы инкапсуляции и гибкости в проектировании приложений. Выбор метода зависит от конкретных требований и предпочтений разработчика.
Статья о доступе к переменным основного приложения в MDI-интерфейсе Delphi 7 через использование интерфейсов и инкапсуляцию для сохранения принципов хорошего дизайна.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.