zoukankan      html  css  js  c++  java
  • FireMonkey自定义控件的Style的一个注意的地方

    当我们自定义控件的时候,如果是直接从TStyledControl或TPresentedControl继承的时候,当设置控件Style时,一定要注意控件Style的Root容器(一般是TLayout)的Align属性的设置。因为在设计时,默认Align属性是Center,然后通过资源文件加载Style,但是这样有一个问题,当我们创建完控件,重新设置控件大小的时候,这时候控件的大小变了,但是控件的Style不会改变,因为Style的Align= Center,所以改变控件的大小会出问题。但是在设计的时候又不能设置为Client或Contents,这样会满屏,很不方便。所以只能是保存为Style后,在记事本文件中打开Style文件,把Style的Root对象的Align手动改为Client或Contents。

    为这个问题也纠结了一天了,因为如果从StdControl继承的控件,没这问题。如果从TStyledControl或TPresentedControl继承,但是不重写GetStyleObject方法,采用默认Style名称的话,也没这问题。但是当采用自定义Style,通过GetStyleObject从资源文件获取Style的时候,就会有这个问题。

    function TMyPanel.GetStyleObject: TFmxObject;
    begin
        Result := nil;
        if StyleLookup.IsEmpty then
        begin
            Result := TStyleStreaming.LoadFromResource(HInstance, 'MyPanelStyle', rt_rcdata);
            Exit
        end;
        if Result = nil then
            Result := inherited GetStyleObject;
    end;        

    但是,为什么会有这个问题啊,因为在ApplyStyleLookup里面已经有代码设置Style对象的Align = Contents

    procedure TStyledControl.ApplyStyleLookup;
      procedure InternalApplyStyle(const StyleObject: TFmxObject);
      var
        StyleControl: TControl;
      begin
        FStyleState := TStyleState.Applying;
        try
          if StyleObject is TControl then
          begin
            StyleControl := TControl(StyleObject);
            FAdjustSizeValue := TPointF.Create(StyleControl.Width, StyleControl.Height);
            StyleControl.Visible := True;
            StyleControl.FAlign := TAlignLayout.None;
            StyleControl.FAnchors := AnchorAlign[TAlignLayout.None];
            try
              StyleControl.BoundsRect := StyleControl.Margins.PaddingRect(LocalRect);
            finally
              StyleControl.FAlign := TAlignLayout.Contents;  //这里,设置了Style控件的对齐,对于自定义控件的Style不起作用??????
              StyleControl.FAnchors := AnchorAlign[TAlignLayout.Contents];
            end;
            FResourceLink := StyleObject;
            StyleControl.SetAcceptsControls(False);
            InsertObject(0, StyleControl);
            { }
            StyleControl.Stored := False;
            StyleControl.Lock;
            ApplyStyle;
            FUpdateEffects := True;
            DoApplyStyleLookup;
          end
          else
          begin
            FResourceLink := StyleObject;
            InsertObject(0, StyleObject);
            { }
            StyleObject.Stored := False;
            ApplyStyle;
            DoApplyStyleLookup;
          end;
          FStyleState := TStyleState.Applied;
        except
          FStyleState := TStyleState.Error;
          raise;
        end;
      end;
    var
      StyleObject: TFmxObject;
      SaveDisableAlign: Boolean;
    begin
      if FIsNeedStyleLookup and (Scene <> nil) and not InPaintTo then
      begin
        FIsNeedStyleLookup := False;
    
        if not (csDesigning in ComponentState) and (Scene.StyleBook = nil) then
        begin
          if not FStyleLookup.IsEmpty then
            StyleObject := TStyleCache.Current.FindResource(FStyleLookup)
          else
            StyleObject := TStyleCache.Current.FindResource(GetDefaultStyleLookupName);
        end
        else
          StyleObject := nil;
        if StyleObject = nil then
          StyleObject := GetStyleObject;
        if StyleObject <> nil then
        begin
          SaveDisableAlign := FDisableAlign;
          try
            FDisableAlign := True;
            InternalApplyStyle(StyleObject);
          finally
            FDisableAlign := SaveDisableAlign;
            Realign;
          end;
        end;
      end;
    end;

    跟踪也发现自定义Style也设置了这个,为什么不起作用呢??????

  • 相关阅读:
    nsis打包
    学习记录:ST表
    学习记录:快速幂
    学习记录:哈夫曼树
    学习记录:二叉树
    学习记录:康托展开 与 逆康托展开
    堆排序简介
    动态规划水题集
    lower_bound( ) 与 upper_bound( )
    琐碎的一点技巧
  • 原文地址:https://www.cnblogs.com/jankerxp/p/11253224.html
Copyright © 2011-2022 走看看