额外单位的TPanel(设计师)

时间:2012-07-20 09:28:45

标签: delphi delphi-xe2 firemonkey 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 个答案:

答案 0 :(得分:3)

我这样做的方法是使用我称之为嵌入式表单的内容,即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;

(根据需要设置位置和对齐属性)。

请注意,如果面板较小,您可以将其中的一些面板添加到单个表单中,并单独设置每个父面板,对于较大的面板或为了更好的模块化,请为每个表单添加一个。

答案 1 :(得分:1)

TPanel不知道如何从表单资源加载子组件。这就是形式和框架特殊的原因。如果您无权访问框架,则可以create all the subcomponents in code代替。您可以使用GExperts来帮助您入门。创建一个新表单并按照您希望面板的外观设计它。选择其上的所有组件,并使用GExperts“components to code”工具。这将在剪贴板上放置一些代码。打开面板单元,然后在构造函数中粘贴生成的代码。

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

  // paste GExperts-generated code here
end;

代码将引用TPanel1中尚不存在的字段,因此请在类声明中声明缺少的字段。现在您可以丢弃您正在设计的表单,或者您可以将其保存以供将来的设计修改。只需将更改粘贴到上一代码即可。