Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Оптимизация FMX-приложений: Разделение TTabControl на отдельные модули с использованием TFrame

Delphi , Компоненты и Классы , Вкладки и Страницы

FMX-приложения на Delphi часто включают в себя сложные интерфейсы с множеством вкладок, что может привести к усложнению основной формы и неэффективному использованию ресурсов, поскольку содержимое вкладок инициализируется независимо от их видимости. В данной статье рассмотрим подход к оптимизации таких приложений, используя TFrame для разделения TTabControl на отдельные модули.

Проблема

В вашем FMX-приложении используется TTabControl с 10 вкладками, видимость которых зависит от состояния приложения и прав пользователя. Хотя текущее решение работает, оно неэстетично, так как все компоненты находятся в одной форме, и содержимое вкладок инициализируется даже если они никогда не становятся видимыми.

Решение

Использование TFrame позволяет создать отдельные модули для каждой вкладки, которые будут инициализированы только при необходимости. Каждый TFrame может существовать только один раз и легко доступен для манипуляций из других частей приложения.

Пример кода

type
  TFormMain = class(TForm)
    TabControl: TTabControl;
    procedure FormCreate(Sender: TObject);
  private
    procedure AddTab<T: TTabItem>(out Tab: T);
  public
    TabA: TTabItemFrame<TFrameA>;
    TabB: TTabItemFrame<TFrameB>;
    TabC: TTabItemFrame<TFrameC>;
  end;

var
  FormMain: TFormMain;

implementation

procedure TFormMain.FormCreate(Sender: TObject);
begin
  AddTab(TabA);
  AddTab(TabB);
  AddTab(TTabC);
  TabA.Activate;
end;

procedure TFormMain.AddTab<T>(out Tab: T);
begin
  Tab := TabControl.Add(T) as T;
end;

// Остальной код ...

type
  TFrameBase = class(TFrame)
  public
    class function GetTitle: string; virtual; abstract;
  end;

type
  TFrameA = class(TFrameBase)
    Label1: TLabel;
  public
    class function GetTitle: string; override;
  end;

constructor TTabItemFrame<T>.Create(AOwner: TComponent);
begin
  inherited;
  Text := T.GetTitle;
  Visible := False;
end;

function TTabItemFrame<T>.Activate: T;
begin
  Visible := True;
  TabControl.ActiveTab := Self;
  Result := FFrame;
end;

procedure TTabItemFrame<T>.Show;
begin
  inherited;
  FFrame := T.Create(Self);
  FFrame.Parent := Self;
end;

// Остальной код инициализации TFrameBase, TTabItemFrame и конкретных TFrame

Альтернативный ответ

Некоторые разработчики могут посчитать необходимым освобождать фреймы при их скрытии, но это может быть неэффективно в терминах производительности, так как создание фрейма является дорогостоящей операцией. Вместо этого можно проверить, был ли уже создан фрейм, и создать его только при необходимости.

Подтвержденный ответ

Использование глобальных переменных для каждого фрейма позволяет фреймам использовать модуль основной формы в части реализации и легко получать доступ к другим фреймам и их компонентам без добавления соответствующих модулей в список использования. Вкладки изначально невидимы, и их фреймы не инициализированы. Активация вкладки (например, TabA.Activate) показывает вкладку и устанавливает на неё фокус. Доступ к компонентам фрейма осуществляется через TabA.Frame.Label1. Скрытие вкладки (TabA.Visible := False) скрывает вкладку и освобождает фрейм для освобождения памяти.

Обсуждение и улучшения

Использование шаблонов (generics) в данном случае является очень полезным, так как оно упрощает реализацию и повышает читаемость кода. Однако, прямой доступ к компонентам других фреймов может быть не лучшей практикой. Вместо этого следует использовать четко определенные интерфейсы для взаимодействия между фреймами.

В качестве улучшения можно рассмотреть использование форм вместо фреймов, что позволит использовать стили во время разработки. Это также упрощает доступ к заголовку формы для использования в качестве названия вкладки.

Вывод

Разделение TTabControl на отдельные модули с использованием TFrame позволяет оптимизировать использование ресурсов и упростить структуру приложения, делая его более модульным и легким для поддержки.

Этот подход может быть полезен для разработчиков, сталкивающихся с аналогичными проблемами в своих FMX-приложениях на Delphi.

Создано по материалам из источника по ссылке.

В статье рассматривается метод оптимизации FMX-приложений в Delphi через разделение сложного интерфейса с TTabControl на модульные TFrame для улучшения эффективности использования ресурсов.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Вкладки и Страницы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-22 14:38:39/0.01016902923584/0