其他分享
首页 > 其他分享> > How to works the "Styles" and how create it in coding on FMX projects? by Emailx45

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再一次感谢!感谢他无私的分享!

 

标签:Styles,MyStyleLayoutSurface,FMX,MyStyleLayoutText,how,MyStyleLayoutSurfaceAnim,M
来源: https://www.cnblogs.com/kinglandsoft/p/16151772.html