• How to works the "Styles" and how create it in coding on FMX projects? by Emailx45


    盒子上的朋友Emailx45,发表这篇文章,用代码建立FMX的Styles并如何使用。原文是英文发表的,我大致译过来:

    场景:

    -- RAD Studio 11.1 Alexandria
    -- FireMonkey 32x/64x

    -- 思考……


    ——思考……

    如何使用“Styles”以及如何在 FMX 项目中通过代码来创建它?

    首先,让我们了解一下,更不用说,这一切是如何运作的!

    当然,我不是“创造者”,那样的话,我没有所有的细节......

    应用程序(项目)的默认样式将驻留在“应用程序”对象中,并将保存在项目的资源文件中。

    RAD Studio 对于FireMonkey 框架,在其内部定义中包含了已知的至少 3 种样式的所有基本定义,即:Win styles, Next Style and iOS Style.

    所以“它”不会显示在您的表单或项目中的其他任何地方......(当然,如果您有一个“BookStyle”组件,您可以看到从您选择的样式文件加载的定义)。

    现在是最有趣的部分:文件中保存的样式实际上是与表单资源文件(*.FMX)相同或非常相似的资源文件(*.Style)。

    因此,这些文件中包含的资源在项目打开(显示在 IDE 中)和/或编译(在软件运行时使用)时被解释。

    因此,您可以在 FireMonkey 中手动编辑“*.Style”文件。

    另一方面,使用样式的 VCL 项目有另一种使用此类资源的方式。因此,这两个框架及其资源文件之间没有兼容性。

    在这篇简短的论文之后,让我们开始通过代码编写我们自己的Styles。

    这一切都从创建一个“container”开始,以容纳新Style使用的所有元素。

    对于 FireMonkey,最好的类是“TLayout”,原因很明显:它不会出现在屏幕上(透明),它可以在项目中大量使用,它可以容纳其他容器(视觉与否)等...

    “TLayout”广泛用于在 FireMonkey 中创建Style。

    在StyleBook对象的样式编辑器中,您会发现“TLayout”对象容纳了样式定义中的其他对象。

    现在,了解了这么多,是可以按照自己的意愿创建自己的Style的时候了。

    注意:有些样式以“二进制”方式存储在文件中,但是通过适合此任务的函数以相同的方式读取。

    祝你好运。

    以下是具体的代码:

    var
      ViewFormMain: TViewFormMain;
    
    implementation
    
    {$R *.fmx}
    
    var
      MyStyleLayout          : TLayout;
      MyStyleLayoutSurface         : TRectangle;
      MyStyleLayoutSurfaceAnim     : TRectAnimation;
      MyStyleLayoutSurfaceColorAnim: TColorAnimation;
      MyStyleLayoutGlyph          : TImage;
      MyStyleLayoutGlyphFloatAnim  : TFloatAnimation;
      MyStyleLayoutText          : TText;
      MyStyleLayoutTextColorAnim   : TColorAnimation;
      MyStyleLayoutInvertColors    : TInvertEffect;
      MyNewStyleCreated          : boolean = false;
    
    function MyCreateMyNewStyle: boolean;
    const
      MyStyleLayoutSurfaceColor: TAlphaColor       = TAlphaColorRec.Blue;
      MyStyleLayoutSurfaceStrokeColor: TAlphaColor = TAlphaColorRec.Red;
      // MyStyleLayoutSurfaceColorAnim: TAlphaColor          = TAlphaColorRec.Yellow;
      MyStyleLayoutTextTextSettingsFontColor: TAlphaColor     = TAlphaColorRec.Yellow;
      MyStyleLayoutTextTextSettingsFontColorAnim: TAlphaColor = TAlphaColorRec.Blue;
    begin
      result := false;
      //
      // if MyStyleLayout=nil then create..., if MyStyleLayoutSurface=nil then create..., etc......
      //
      // I'm not taking care about exception ok!!! >:)))
      //
      MyStyleLayout          := TLayout.Create(ViewFormMain);
      MyStyleLayout.Name      := 'MyStyleLayout';
      MyStyleLayout.StyleName := 'mystylelayoutname';
      // MyStyleLayout.Parent    := ViewFormMain;
      //
      MyStyleLayoutSurface          := TRectangle.Create(ViewFormMain);
      MyStyleLayoutSurface.Name          := 'MyStyleLayoutSurface';
      MyStyleLayoutSurface.StyleName        := 'background'; // dont translate
      MyStyleLayoutSurface.Align          := TAlignLayout.Client;
      MyStyleLayoutSurface.CornerType       := TCornerType.InnerLine;
      MyStyleLayoutSurface.Fill.Color       := MyStyleLayoutSurfaceColor;
      MyStyleLayoutSurface.HitTest          := false;
      MyStyleLayoutSurface.Stroke.Color     := MyStyleLayoutSurfaceStrokeColor;
      MyStyleLayoutSurface.Stroke.Thickness := 5.0;
      MyStyleLayoutSurface.XRadius          := 50.0;
      MyStyleLayoutSurface.YRadius          := 50.0;
      MyStyleLayoutSurface.Parent          := MyStyleLayout;
      //
      MyStyleLayoutSurfaceAnim          := TRectAnimation.Create(ViewFormMain);
      MyStyleLayoutSurfaceAnim.Name          := 'MyStyleLayoutSurfaceAnim';
      MyStyleLayoutSurfaceAnim.Duration         := 0.2;
      MyStyleLayoutSurfaceAnim.PropertyName     := 'Margins';
      MyStyleLayoutSurfaceAnim.StopValue.Left   := 10.0;
      MyStyleLayoutSurfaceAnim.StopValue.Top    := 10.0;
      MyStyleLayoutSurfaceAnim.StopValue.Right  := 10.0;
      MyStyleLayoutSurfaceAnim.StopValue.Bottom := 10.0;
      MyStyleLayoutSurfaceAnim.Trigger          := 'IsMouseOver=true';
      MyStyleLayoutSurfaceAnim.TriggerInverse   := 'IsMouseOver=false';
      MyStyleLayoutSurfaceAnim.Parent          := MyStyleLayoutSurface;
      //
      MyStyleLayoutInvertColors         := TInvertEffect.Create(ViewFormMain);
      MyStyleLayoutInvertColors.Name    := 'MyStyleLayoutInvertColors';
      MyStyleLayoutInvertColors.Enabled := false;
      MyStyleLayoutInvertColors.Trigger := 'IsMouseOver=true';
      MyStyleLayoutInvertColors.Parent  := MyStyleLayoutSurface;
      //
      (* MyStyleLayoutSurfaceColorAnim          := TColorAnimation.Create(ViewFormMain);
        MyStyleLayoutSurfaceColorAnim.Name          := 'MyStyleLayoutSurfaceColorAnim';
        MyStyleLayoutSurfaceColorAnim.Duration       := 0.2;
        MyStyleLayoutSurfaceColorAnim.PropertyName   := 'Fill.Color';
        MyStyleLayoutSurfaceColorAnim.StartValue     := MyStyleLayoutSurfaceColor;
        MyStyleLayoutSurfaceColorAnim.StopValue      := MyStyleLayoutSurfaceColorAnim;
        MyStyleLayoutSurfaceColorAnim.Trigger        := 'IsMouseOver=true';
        MyStyleLayoutSurfaceColorAnim.TriggerInverse := 'IsMouseOver=false';
        MyStyleLayoutSurfaceColorAnim.Parent         := MyStyleLayoutSurface; *)
      //
      MyStyleLayoutText          := TText.Create(ViewFormMain);
      MyStyleLayoutText.Name          := 'MyStyleLayoutText';
      MyStyleLayoutText.StyleName          := 'text'; // dont translate
      MyStyleLayoutText.Align          := TAlignLayout.Center;
      MyStyleLayoutText.AutoSize          := true;
      MyStyleLayoutText.HitTest          := false;
      MyStyleLayoutText.Text          := 'Text';
      MyStyleLayoutText.TextSettings.FontColor := MyStyleLayoutTextTextSettingsFontColor;
      MyStyleLayoutText.Parent          := MyStyleLayoutSurface;
      //
      (* MyStyleLayoutTextColorAnim          := TColorAnimation.Create(ViewFormMain);
        MyStyleLayoutTextColorAnim.Name          := 'MyStyleLayoutTextColorAnim';
        MyStyleLayoutTextColorAnim.Duration       := 0.2;
        MyStyleLayoutTextColorAnim.PropertyName   := 'TextSettings.FontColor';
        MyStyleLayoutTextColorAnim.StartValue     := MyStyleLayoutTextTextSettingsFontColor;
        MyStyleLayoutTextColorAnim.StopValue      := MyStyleLayoutTextTextSettingsFontColorAnim;
        MyStyleLayoutTextColorAnim.Trigger        := 'IsMouseOver=true';
        MyStyleLayoutTextColorAnim.TriggerInverse := 'IsMouseOver=false';
        MyStyleLayoutTextColorAnim.Parent         := MyStyleLayoutText; *)
      //
      MyStyleLayoutGlyph          := TImage.Create(ViewFormMain);
      MyStyleLayoutGlyph.Name          := 'MyStyleLayoutGlyph';
      MyStyleLayoutGlyph.HitTest          := false;
      MyStyleLayoutGlyph.StyleName          := 'glyphstyle'; // dont translate
      MyStyleLayoutGlyph.MultiResBitmap.Height := 32;
      MyStyleLayoutGlyph.MultiResBitmap.Width  := 32;
      MyStyleLayoutGlyph.RotationAngle         := -45.0;
      MyStyleLayoutGlyph.MultiResBitmap.Add.Bitmap.LoadFromFile('D:\RADRIOTests\_Images_For_TImageList_and_Others\arrow_right-up.png');
      MyStyleLayoutGlyph.Parent := MyStyleLayout;
      //
      MyStyleLayoutGlyphFloatAnim          := TFloatAnimation.Create(ViewFormMain);
      MyStyleLayoutGlyphFloatAnim.Name          := 'MyStyleLayoutGlyphFloatAnim';
      MyStyleLayoutGlyphFloatAnim.Duration       := 0.2;
      MyStyleLayoutGlyphFloatAnim.PropertyName   := 'RotationAngle';
      MyStyleLayoutGlyphFloatAnim.StartValue     := -45.0;
      MyStyleLayoutGlyphFloatAnim.StopValue      := 45.0;
      MyStyleLayoutGlyphFloatAnim.Trigger        := 'IsMouseOver=true';
      MyStyleLayoutGlyphFloatAnim.TriggerInverse := 'IsMouseOver=false';
      MyStyleLayoutGlyphFloatAnim.Parent         := MyStyleLayoutGlyph;
      //
      result := true;
    end;
    
    procedure MyDestroyMyStyleToButtons;
    begin
      // FreeAndNil(MyStyleLayoutGlyphFloatAnim);
      // FreeAndNil(MyStyleLayoutText);
      // FreeAndNil(MyStyleLayoutGlyph);
      // FreeAndNil(MyStyleLayoutSurfaceAnim);
      // FreeAndNil(MyStyleLayoutSurface);
      //
      FreeAndNil(MyStyleLayout); // delete all "owned"...
    end;
    
    procedure TViewFormMain.Btn_Creating_My_Crazy_StyleClick(Sender: TObject);
    begin
      RadioButton3.Text := 'MyStyleLayout not created or destroyed...';
      //
      if (Self.FindComponent('MyStyleLayout') = nil) then
      begin
        MyNewStyleCreated := MyCreateMyNewStyle;
        //
        if MyNewStyleCreated then
        begin
          RadioButton3.Text := 'MyStyleLayout already created';
          //
          RadioButton1.OnClick(Self);
          RadioButton1.IsChecked := true;
        end
        else
          RadioButton3.Text := 'MyStyleLayout was not created';
      end else begin
        FreeAndNil(MyStyleLayout); // delete all "owned"...
        //
        RadioButton2.OnClick(Self);
        RadioButton2.IsChecked := true;
      end;
    end;
    
    procedure TViewFormMain.Button2Click(Sender: TObject);
    begin
      // if not(Self.FindStyleResource('styletomybuttons', false) = nil) then ... if "Parent = Self {form1}" but this way it will appears on form.
      //
      if MyNewStyleCreated { or not(Self.FindComponent('MyStyleLayout') = nil) } then
        ShowMessage('MyStyleLayout was created')
      else
        ShowMessage('MyStyleLayout was not created');
    end;
    
    procedure TViewFormMain.RadioButton1Click(Sender: TObject);
    begin
      if MyNewStyleCreated then
      begin
        Button2.StyleLookup      := 'mystylelayoutname';
        SpeedButton1.StyleLookup := 'mystylelayoutname';
        RadioButton1.StyleLookup := 'mystylelayoutname';
        Memo1.StyleLookup        := 'mystylelayoutname';
      end else begin
        Button2.StyleLookup      := '';
        SpeedButton1.StyleLookup := '';
        RadioButton1.StyleLookup := '';
        Memo1.StyleLookup        := '';
      end;
    end;
    
    procedure TViewFormMain.RadioButton2Click(Sender: TObject);
    begin
      Button2.StyleLookup      := '';
      SpeedButton1.StyleLookup := '';
      RadioButton1.StyleLookup := '';
      Memo1.StyleLookup        := '';
    end;
    
    initialization
    
    ReportMemoryLeaksOnShutdown := true;
    
    finalization
    
    end.

    代码执行的效果: 

    原文地址:http://bbs.2ccc.com/topic.asp?topicid=628182

    向Emailx45再一次感谢!感谢他无私的分享!

    后记,作者又给出了修正代码:

    FIXING MY CODE ABOVE
    
    MyStyleLayoutText          := TText.Create(nil);
      MyStyleLayoutText.Name          := 'MyStyleLayoutText';
      MyStyleLayoutText.StyleName          := 'text'; // dont translate
      MyStyleLayoutText.Align          := TAlignLayout.Center;
      MyStyleLayoutText.AutoSize          := true;
      MyStyleLayoutText.HitTest          := false;
      MyStyleLayoutText.Text          := 'Text';
      MyStyleLayoutText.TextSettings.FontColor := MyStyleLayoutTextTextSettingsFontColor;
     
     MyStyleLayoutText.Parent          := MyStyleLayout; // Layout-root
  • 相关阅读:
    4270. 【NOIP2015模拟10.27】魔道研究
    4269. 【NOIP2015模拟10.27】挑竹签
    NOIP2015模拟10.28B组
    JZOI5257. 小X的佛光
    4260. 最大子矩阵 (Standard IO)
    1010. 【CQOI2009】叶子的颜色
    【NOIP2015模拟10.22】最小代价
    JZOI 距离 (Standard IO) 题解
    统计和 luogu P2068 树状数组和线段树练手
    2020.7.15模拟赛
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/16151772.html
Copyright © 2020-2023  润新知