zoukankan      html  css  js  c++  java
  • 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;

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

  • 相关阅读:
    Nginx优化
    Mysql日常操作
    YUM源
    MySQL5.7安装手册
    自律——可以让我们活的更高级
    javascript中with的用法
    js中所有函数的参数(按值和按引用)都是按值传递的,怎么理解?
    base64编码的图片在网页中显示
    form表单提交没有跨域问题,但ajax提交存在跨域问题
    移动端1px的适配问题
  • 原文地址:https://www.cnblogs.com/jankerxp/p/7774023.html
Copyright © 2011-2022 走看看