我试图创建(首先)一个简单的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创建的。如果我更改按钮上的文本并关闭/打开项目,则会出现另一个按钮。更改新按钮上的文本关闭/打开另一个创建。等等。
答案 0 :(得分:2)
似乎VCL中已知的 SetSubComponent 功能不适用于FMX。如上所述,重复设置request.FILES
是可行的方法。此外, SetSubComponent 也不能很好地与Stored = false设置一起使用。
答案 1 :(得分:1)
这是因为流式处理过程也会创建按钮。您需要使用存储的FALSE属性标记按钮(以及您要创建的任何其他组件),如下所示:
property btnDelete : TButton read imgDelete; stored FALSE;
这将停止存储按钮(因此重新加载)。但我不认为这与你原来的问题有关(尽管看起来确实如此......)。请参阅我之前的评论,我认为是这样。