FMX从TCustomXXX继承控件的子控件,无法同时显示的问题

这个问题,我在盒子发了,也没有满意的结果。

(http://bbs.2ccc.com/topic.asp?topicid=535134)



模仿FMX的标准TPanel控件(这个控件没有什么实现的代码),自己写了个Panel,可以实现改变颜色及Stroke等属性,就是增加这几个属性:
    //Appreance
    property Fill;
    property Stroke;
    property Cornered;
    property CornerSize;
    property FaceColor;

通过以下2个方法加载Style及得到Style的TRectangle对象

    function GetStyleObject: TFmxObject; override;
    procedure ApplyStyle; override;

实现代码:
function TMyPanel.GetStyleObject: TFmxObject;
begin
  if StyleLookup.IsEmpty then
   Result := TStyleManager.GetStyleResource(DefStyleName)
  else
    inherited;
end;

procedure TMyPanel.ApplyStyle;
begin
  inherited;

  if FindStyleResource<TRectangle>(DefStyleName, FAppreance) then
  begin
    if FAppreance <> nil then
    begin
      FAppreance.Fill.Assign(FFill);
      FAppreance.Stroke.Assign(FStroke);
      if FCornered then
        FAppreance.Corners := [TCorner.TopLeft, TCorner.TopRight, TCorner.BottomLeft, TCorner.BottomRight]
      else
        FAppreance.Corners := [];
      FAppreance.CornerType := TCornerType.Round;
      FAppreance.XRadius := FCornerSize;
      FAppreance.YRadius := FCornerSize;
      FAppreance.Align := TAlignLayout.Client;
      FAppreance.Anchors := [TAnchorKind.akLeft, TAnchorKind.akTop];
    end;
  end;
end;

FAppreance就是Style中的Rectangle

但是,有一个大问题,这样的控件当设置了Parent时,只能显示最后创建的一个,前面的全部不显示,不管其Parent是不是一样的。估计是丢失了Style,所以对象存在,但是显示不了。
简单跟踪了下,在设置控件Parent,发生了许多事,看的晕乎乎。

就是创建多个Panel时,为什么只显示最后一个Panel!!!!!

这几天又在折腾这个问题,现在DELPHI帮助里的 FMX控件开发指导,还是DELPHIXE5还是XE6时候的帮助,无语了,都不一样了,还误导开发者。


上面代码的GetStyleObject方法的写法是不对的

因为是用自己的Style资源,所以还是得明确从Res文件加载,


function TJKCustomPanelButton.GetStyleObject: TFmxObject;
begin
  if StyleLookup = '' then
  begin
    //Result := TStyleManager.GetStyleResource(DefJkPanelButtonStyleName);
    Result := TStyleStreaming.LoadFromResource(HInstance, DefJkPanelButtonStyleName, RT_RCDATA);
  end
  else
    inherited GetStyleObject;
end;

这样就可以了,深层原因就不知道了,这里的代码转的厉害,看的晕呼呼。

posted @ 2017-07-31 01:50  舞天涯  阅读(170)  评论(0编辑  收藏  举报