如何从Firemonkey TPopUp创建自己的对话框组件?

时间:2014-06-09 00:11:40

标签: delphi firemonkey delphi-xe5 firemonkey-fm3

[Delphi XE5 Up2]

我正在尝试使用TPopUp来继承和创建一个组件,遵循与CalendarFlyout的Flyouts演示中公开的相同的想法。我将不使用日历,但我希望这个空间空闲,以便我可以放置任何其他我想要的FMX组件。

我使用新组件向导制作了组件并添加了一些控件:

unit PopupTest;

interface

uses
  System.SysUtils, System.Classes, FMX.Types, FMX.Controls,
  FMX.Layouts, FMX.StdCtrls;

type
  TPopupTest = class(TPopup)
  private
    FPanel        : TPanel;
    FLayoutButton : TLayout;
    FCloseButton  : TButton;
    FSaveButton   : TButton;
    FClientArea   : TLayout;
  protected
    procedure   OnClose(Sender: TObject);
    procedure   OnSave(Sender: TObject);
  public
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy; override;
  published
    { Published declarations }
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('Samples', [TPopupTest]);
end;

{ TPopupTest }

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

  FPanel                   := TPanel.Create(self);
  FPanel.Position.X        := 0;
  FPanel.Position.Y        := 0;
  FPanel.Margins.Left      := 10;
  FPanel.Margins.Right     := 10;
  FPanel.Margins.Top       := 10;
  FPanel.Margins.Bottom    := 10;
  FPanel.StyleLookup       := 'flyoutpanel';
  FPanel.Align             := TAlignLayout.alClient;
  FPanel.Visible           := True;

  FLayoutButton            := TLayout.Create(FPanel);
  FLayoutButton.Align      := TAlignLayout.alBottom;
  FLayoutButton.Height     := 22;

  FCloseButton             := TButton.Create(FLayoutButton);
  FCloseButton.Align       := TAlignLayout.alLeft;
  FCloseButton.StyleLookup := 'flyoutbutton';
  FCloseButton.Text        := 'Fechar';
  FCloseButton.OnClick     := OnClose;

  FSaveButton              := TButton.Create(FLayoutButton);
  FSaveButton.Align        := TAlignLayout.alLeft;
  FSaveButton.StyleLookup  := 'flyoutbutton';
  FSaveButton.Text         := 'Salvar';
  FSaveButton.OnClick      := OnSave;

  FClientArea              := TLayout.Create(FPanel);
  FClientArea.Align        := TAlignLayout.alClient;

  Width                    := 100;
  Height                   := 100;
end;

destructor TPopupTest.Destroy;
begin
  FClientArea.Free;
  FCloseButton.Free;
  FSaveButton.Free;
  FLayoutButton.Free;
  FPanel.Free;

  inherited;
end;

procedure TPopupTest.OnClose(Sender: TObject);
begin

end;

procedure TPopupTest.OnSave(Sender: TObject);
begin

end;

end.

我做了几次测试,没有出现任何内容,只是弹出窗口,内部没有任何内容。我正在使用MetropoliUI样式,内部控件的组件上的样式基于该样式。

为简单起见,我已删除其他所有内容并进行编译和测试。

我使用TPopUp有几个原因,但主要的是我的“对话框”将被插入到表单上,我将添加一些TEdits,它们将通过LiveBinding连接到同一个DataSet等形成。所以不需要用其他所有内容创建另一个表单,并保留所有上下文(至少我相信这是正确的事情)

我在寻找:

  • 显示所有内部控件的缺失
  • 如何确保FClientArea,即TLayout可供用户添加其他控件?

最终结果是这样的: Flyout

在中间区域是TLayout,我可以放弃其他控件,如TEdit。

1 个答案:

答案 0 :(得分:1)

当您在表单中创建TPopupTest时,您必须将创建者的所有者设置为您的表单以及父级。

将单位更改为类似的内容会使其显示但不完全像您所描绘的那样,您将需要稍微改进一下。我的解决方案也许不是最好的,但至少你现在可以看到一些东西。

constructor TPopupTest.Create(AOwner: TComponent);
var
PopPanel: TPanel;
PopLayout: TLayout;
PopClose: TButton;
PopSave: TButton;
PopClientArea: TLayout;
begin
  inherited;

  PopPanel                   := TPanel.Create(Owner);
  PopPanel.Position.X        := 0;
  PopPanel.Position.Y        := 0;
  PopPanel.Margins.Left      := 10;
  PopPanel.Margins.Right     := 10;
  PopPanel.Margins.Top       := 10;
  PopPanel.Margins.Bottom    := 10;
  PopPanel.StyleLookup       := 'flyoutpanel';
  PopPanel.Parent            := Owner as TFmxObject;
  PopPanel.Align             := TAlignLayout.alClient;
  PopPanel.Visible           := True;

  PopLayout            := TLayout.Create(Owner);
  PopLayout.Parent     := PopPanel;
  PopLayout.Align      := TAlignLayout.alBottom;
  PopLayout.Height     := 22;

  PopClose             := TButton.Create(Owner);
  PopClose.Parent      := PopLayout;
  PopClose.Align       := TAlignLayout.alLeft;
  PopClose.StyleLookup := 'flyoutbutton';
  PopClose.Text        := 'Fechar';
  PopClose.OnClick     := OnClose;

  PopSave              := TButton.Create(Owner);
  PopSave.Parent       := PopLayout;
  PopSave.Align        := TAlignLayout.alLeft;
  PopSave.StyleLookup  := 'flyoutbutton';
  PopSave.Text         := 'Salvar';
  PopSave.OnClick      := OnSave;

  PopClientArea              := TLayout.Create(Owner);
  PopClientArea.Parent       := PopPanel;
  PopClientArea.Align        := TAlignLayout.alClient;

  FPanel:= PopPanel;
  FLayoutButton:= PopLayout;
  FSaveButton:= PopSave;
  FCloseButton:= PopClose;
  FClientArea:= PopClientArea;

  Width                    := 100;
  Height                   := 100;
end;