Delphi Visual FMX组件

时间:2016-10-18 06:46:46

标签: delphi firemonkey

我试图创建(首先)一个简单的FMX组件。 目标是在组件内部有一个标签,当我点击标签以响应他的内部onclick事件时。

const
  _MS_Color_Transparent_Buttons    = claWhite;
  _MS_Color_Light_Background       = claWhite;
  _MS_Color_Dark_Background        = $FF1F2222;
  _MS_Color_Medium_Dark_Background = $FF3D454C;
  _MS_Color_Active_Selection       = $FF0281FD;
  _MS_Color_Separation_Lines       = $FFE1E0E0;

type
  TPosItemLayout = class(TLayout)
  private
    { Private declarations }
  protected
    { Protected declarations }
    LayMarker        : TLayout;
    rectMarker       : TRectangle;
    labelDescription : TLabel;

    procedure ToggleComponent(Sender : TObject);
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy;                    override;
  published
    { Published declarations }
  end;

constructor TPosItemLayout.Create(AOwner: TComponent);
begin
  inherited;
  Self.ClipChildren := True;
  Self.Parent       := AOwner as TFmxObject;
  Self.Position.X   := 0;
  Self.Height       := 153;
  Self.HitTest      := True;

  LayMarker            := TLayout.Create(Self);
  LayMarker.Parent     := Self;
  LayMarker.Position.X := 0;
  LayMarker.Position.Y := 0;
  LayMarker.Height     := 153;
  LayMarker.Width      := 3;
  LayMarker.Align      := TAlignLayout.Left;
  LayMarker.HitTest    := True;

//rectMarker
  rectMarker              := TRectangle.Create(LayMarker);
  rectMarker.Parent       := LayMarker;
  rectMarker.Position.X   := 0;
  rectMarker.Position.Y   := 0;
  rectMarker.Height       := 153;
  rectMarker.Width        := 3;
  rectMarker.Fill.Color   := _MS_Color_Active_Selection;
  rectMarker.Fill.Kind    := TBrushKind.Solid;
  rectMarker.Stroke.Color := _MS_Color_Active_Selection;
  rectMarker.Stroke.Kind  := TBrushKind.None;
  rectMarker.Align        := TAlignLayout.Client;
  rectMarker.HitTest      := True;

//lbFirstDecription - Parent LayDescription
  labelDescription                         := TLabel.Create(Self);
  labelDescription.Parent                  := Self;
  labelDescription.Position.Y              := 8;
  labelDescription.Height                  := 23;
  labelDescription.Align                   := TAlignLayout.Horizontal;
  labelDescription.StyledSettings          := labelDescription.StyledSettings - [TStyledSetting.FontColor, TStyledSetting.Size];
  labelDescription.FontColor               := claBlack;
  labelDescription.TextSettings.Font.Size  := 16;
  labelDescription.TextSettings.HorzAlign  := TTextAlign.Leading;
  labelDescription.TextSettings.VertAlign  := TTextAlign.Center;
  labelDescription.Text                    := 'Description';
  labelDescription.WordWrap                := False;
  labelDescription.HitTest                 := True;
  labelDescription.OnClick                 := ToggleComponent;
end;

destructor TPosItemLayout.Destroy;
begin

  inherited;
end;

procedure TPosItemLayout.ToggleComponent(Sender: TObject);
begin
  showmessage('toggle');
end;

在我的测试应用程序中,我点击然后标签,但没有任何事情发生。

我试着玩最热门但没什么。

我想念的是什么?

如何才能让它发挥作用?

编辑1 我已经改变了代码。隐藏原始代码的onclick :( 以下代码是行为semibizar。

type 
  TPosItemLayout = class(TLayout)
  private
    { Private declarations }
  protected
    { Protected declarations }
    imgDelete : TButton;

    procedure ToggleComponent(Sender : TObject);
  public
    { Public declarations }
    constructor Create(AOwner: TComponent); override;
    destructor  Destroy;                    override;
  published
    { Published declarations }
    property btnDelete  : TButton read imgDelete;
  end;

procedure Register;

implementation

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

{ TPosItemLayout }

constructor TPosItemLayout.Create(AOwner: TComponent);
var ImgStream : TResourceStream;
begin
  inherited;
  Self.ClipChildren := True;
  Self.Position.X   := 0;
  Self.Height       := 153;
  Self.Width        := 400;

  imgDelete                := TButton.Create(Self);
  imgDelete.Parent         := Self;
  imgDelete.Width          := 60;
  imgDelete.Height         := 24;
  imgDelete.HitTest        := True;
  imgDelete.Align          := TAlignLayout.Right;
  imgDelete.Text           := 'E';
  imgDelete.OnClick        := ToggleComponent;
end;

destructor TPosItemLayout.Destroy;
begin

  inherited;
end;

procedure TPosItemLayout.ToggleComponent(Sender: TObject);
begin
  imgDelete.Text := 'Click';
end;

在设计时它会创建按钮并对齐 但是在运行时2按钮被打包..一个响应点击并做了打算做什么..另一个doesent什么都不做。

如何跟踪此问题?

这个混乱是由IDE创建的。如果我更改按钮上的文本并关闭/打开项目,则会出现另一个按钮。更改新按钮上的文本关闭/打开另一个创建。等等。

2 个答案:

答案 0 :(得分:2)

似乎VCL中已知的 SetSubComponent 功能不适用于FMX。如上所述,重复设置request.FILES是可行的方法。此外, SetSubComponent 也不能很好地与Stored = false设置一起使用。

答案 1 :(得分:1)

这是因为流式处理过程也会创建按钮。您需要使用存储的FALSE属性标记按钮(以及您要创建的任何其他组件),如下所示:

property btnDelete  : TButton read imgDelete; stored FALSE;

这将停止存储按钮(因此重新加载)。但我不认为这与你原来的问题有关(尽管看起来确实如此......)。请参阅我之前的评论,我认为是这样。