TPanel в дополнительном блоке (с дизайнером)

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

Я сделал небольшое демонстрационное приложение, и все работает. Единственная проблема в том, что у меня есть около 7 панелей в одной форме для моего демонстрационного приложения. Трудно следить за этими панелями и менять их, потому что все они расположены друг над другом.

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

Я посмотрел в файл fmx форм и создал его для панели, а также создал.pas для панели.

unit2.pas:

unit Unit2;

interface

uses ...

type
  TPanel1 = class(TPanel)
  Label1: TLabel;
end;
var
  Panel1: TPanel1;

implementation
{$R *.fmx}

end.

Unit2.fmx:

object Panel1: TPanel1
  Left = 0
  Top = 0
  Caption = 'Panel1'
  ClientHeight = 551
  ClientWidth = 800
  Visible = False
  StyleLookup = 'backgroundstyle'
  object Label1: TLabel
    Position.Point = '(8,8)'
    Width = 120.000000000000000000
    Height = 15.000000000000000000
    TabOrder = 9
    Text = 'Panel1'
  end
end

Теперь я могу использовать дизайнера для дизайна моей панели. Но когда я хочу использовать его в основной форме, сделав что-то вроде:

Panel1 := TPanel1.Create(Self);
Panel1.Parent := Self;

Я получаю только стандартный TPanel, а не тот, который я разработал.

Когда я сохраняю все то же самое и просто меняю базовый класс с TPanel на TForm, он работает, как и ожидалось (.Show вместо.Parent =, конечно, для тестирования).

Что мне нужно сделать, чтобы превратить мою дизайнерскую панель в основную форму?

Спасибо за любую помощь.

2 ответа

Решение

Я бы сделал так, чтобы использовать то, что я называю встроенными формами, что является эквивалентом фреймов в FireMonkey.

Для каждой панели создайте форму и добавьте в нее панель:

type TPanelForm1 = class(TForm)
  Panel1: TPanel;
  ...

Поместите ваши элементы управления внутри панели.

В вашей основной форме создайте экземпляр каждой формы и извлеките ее панель:

procedure TForm1.FormCreate(Sender: TObject);
begin
  PF1 := TPanelForm1.Create(Self);
  PF1.Panel1.Parent := Self;
  PF1.Position := ...
  PF1.Align := ...
end;

(Установите свойства Position и Align, как требуется).

Обратите внимание, что если панели маленькие, вы можете добавить их в одну форму и установить каждый родительский элемент отдельно, для больших панелей или для лучшей модульности добавьте по одной к каждой форме.

TPanel не знает, как загрузить подкомпоненты из ресурса формы. Вот что делает формы и рамки особенными. Если у вас нет доступа к фреймам, вы можете вместо этого создать все подкомпоненты в коде. Вы можете использовать GExperts, чтобы помочь вам начать. Создайте новую форму и создайте ее так, как вы хотите, чтобы ваша панель выглядела. Выберите все компоненты на нем и используйте инструмент GExperts " Компоненты для кодирования". Это поместит некоторый код в буфер обмена. Откройте блок панели и вставьте сгенерированный код в конструктор.

constructor TPanel1.Create(AOwner: TComponent);
begin
  inherited;

  // paste GExperts-generated code here
end;

Код будет ссылаться на поля, которые не существуют в TPanel1 пока, так иди объявляй пропущенные поля в объявлении класса. Теперь вы можете отказаться от формы, которую вы проектировали, или вы можете сохранить ее для будущих модификаций дизайна. Просто вставьте изменения в предыдущий код.

Другие вопросы по тегам