Delphi t额外装置中的面板(带设计师)

Delphi t额外装置中的面板(带设计师),delphi,delphi-xe2,firemonkey,tpanel,Delphi,Delphi Xe2,Firemonkey,Tpanel,我想创建一个单窗口应用程序,其中可以从一个小菜单访问多个面板。我想从一侧将面板滑入 我已经做了一个小的演示应用程序和一切工作。唯一的问题是,我的演示应用程序在一种形式中有大约7个面板。很难对这些面板进行概述和更改,因为它们都是相互重叠的 所以我想为每个面板创建一个额外的单元,在这里我可以像我想要的那样设计和更改面板,然后用代码将它们添加到主窗体中 我查看了一个forms fmx文件,为一个面板创建了一个文件,还为面板创建了一个.pas文件 单元2.pas: unit Unit2; interf

我想创建一个单窗口应用程序,其中可以从一个小菜单访问多个面板。我想从一侧将面板滑入

我已经做了一个小的演示应用程序和一切工作。唯一的问题是,我的演示应用程序在一种形式中有大约7个面板。很难对这些面板进行概述和更改,因为它们都是相互重叠的

所以我想为每个面板创建一个额外的单元,在这里我可以像我想要的那样设计和更改面板,然后用代码将它们添加到主窗体中

我查看了一个forms fmx文件,为一个面板创建了一个文件,还为面板创建了一个.pas文件

单元2.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=当然要测试)

我该怎么做,才能让我设计的面板进入主窗体


谢谢您的帮助。

TPanel
不知道如何从表单资源加载子组件。这就是表格和框架的特殊之处。如果您没有访问帧的权限,则可以改为。您可以使用GExperts来帮助您入门。创建一个新窗体,并按照您希望的面板外观进行设计。选择上面的所有组件,并使用GExperts“”工具。这将在剪贴板上放置一些代码。打开面板单元,在构造函数中粘贴生成的代码

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

  // paste GExperts-generated code here
end;

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

TPanel
不知道如何从表单资源加载子组件。这就是表格和框架的特殊之处。如果您没有访问帧的权限,则可以改为。您可以使用GExperts来帮助您入门。创建一个新窗体,并按照您希望的面板外观进行设计。选择上面的所有组件,并使用GExperts“”工具。这将在剪贴板上放置一些代码。打开面板单元,在构造函数中粘贴生成的代码

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

  // paste GExperts-generated code here
end;

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

我这样做的方法是使用我称之为嵌入式表单的东西,这是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;
(根据需要设置位置和对齐特性)


请注意,如果面板很小,您可以将多个面板添加到单个表单中,并单独设置每个父级,为了更大的面板或更好的模块化,请在每个表单中添加一个。我这样做的方法是使用我称之为嵌入式表单的东西,这是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;
(根据需要设置位置和对齐特性)


请注意,如果面板很小,您可以将多个面板添加到一个表单中,并单独设置每个父级,为了更大的面板或更好的模块化,请在每个表单中添加一个。这就是他们引入框架的原因…同意@whosrdaddy,将每个面板放在每个单元内的一个TFrame中,然后通过1)创建框架,2)将每个框架的父级设置为窗体的主面板,在主窗体上交换它们。我已经写过,这个问题在Firemonkey中。Firemonkey中没有框架。@whosrdaddy:你肯定看到我删除的答案了吗?@AndreasRejbrand:没有看到:)这就是他们引入框架的原因…同意@whosrdaddy,将每个面板放在每个单元的一个TFrame中,然后在主窗体上交换它们1)创建框架,2)将每个帧的父帧设置为窗体的主面板。我已经写过,这个问题在Firemonkey中。Firemonkey中没有框架。@whosrdaddy:你肯定看到我删除的答案了吗?@AndreasRejbrand:没有看到:)这是我经过几个小时的搜索和尝试后发现的。我只建议使用TLayout而不是panel。我认为,TPanel vs.TLayout完全取决于您希望它的外观,它们没有样式,更适合这种动作。当然,您可以嵌入任何控件。例如,TTreeView,如果这是您设计的方便子单元。这是我经过几个小时的搜索和尝试后发现的。我只建议使用TLayout而不是panel。我认为,TPanel vs.TLayout完全取决于您希望它的外观,它们没有样式,更适合这种动作。当然,您可以嵌入任何控件。例如,t查看是否适合您的设计。