使用Firemonkey

时间:2016-04-26 15:51:32

标签: delphi firemonkey

使用VCL,我可以这样做:

procedure TForm1.FormCreate(Sender: TObject);
begin
  Label1.Color := clBlue;
  Label1.Font.Color := clYellow;
  label1.Caption := ' My Label '
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if Label1.Color = clBlue then
    begin
      Label1.Color := clYellow;
      Label1.Font.Color := clBlue
    end
  else
    begin
      Label1.Color := clBlue;
      Label1.Font.Color := clYellow
    end
end;

如您所见,标签背景和文本的颜色从蓝色切换为黄色,反之亦然。

我想对Firemonkey做同样的事情但是,我所做的所有搜索都只说FMX标签没有背景颜色(我不明白为什么), 并没有给我一个有效的线索,告诉我如何做与VCL相同的事情。

有人可以在这里写下等效的FMX代码片段吗?

谢谢。

3 个答案:

答案 0 :(得分:2)

作为替代方案,您可以为TLabel组件创建自定义样式:

  • 右键单击标签(" LabelXX")并选择"编辑自定义样式...";
  • 添加" TRectangle"来自"工具调色板的组件"创建新样式(" LabelXXStyle1");
  • 选择新的" Rectangle1Style"对象并将其发送回(编辑 - >"发送到后面");

设置" Rectangle1Style"属性:

  • "对齐" :"客户";
  • "填充/位图/颜色" :任何背景颜色;
  • 应用更改(关闭"样式设计师")。

设置" StyleLookup"您需要的其他TLabel的属性" LabelXXStyle1"。

答案 1 :(得分:1)

在Firemonkey中,许多控件没有颜色。相反,你应该从不同的组件中分层控制。

在这种情况下,如果您想要背景,请使用TRectangle 在设计师德尔福坚持认为你不能让一个标签成为一个矩形的父级,但这当然不是真的,在FMX中任何控件都可以为其他任何控制。

只需使用结构窗格拖动矩形顶部的标签,将voila标签和矩形连接在一起。

enter image description here

上面的等效代码看起来像这样。

unit Unit45;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.Objects;

type
  TForm45 = class(TForm)
    Rectangle1: TRectangle;
    Label1: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    Rects: array of TRectangle;
    Labels: array of TLabel;
  public
    { Public declarations }
  end;

var
  Form45: TForm45;

implementation

{$R *.fmx}

uses
  System.UIConsts;

procedure TForm45.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i:= Low(Rects) to High(Rects) do begin
    if Rects[i].Fill.Color <> claBlue then
      Rects[i].Fill.Color:= claBlue
    else Rects[i].Fill.Color:= claYellow;
  end;
end;

procedure TForm45.FormCreate(Sender: TObject);
var
  i: integer;
begin
  SetLength(Rects,2);
  SetLength(Labels,2);
  for i:= 0 to 1 do begin
    Rects[i]:= TRectangle.Create(self);
    Rects[i].Parent:= self;
    Labels[i]:= TLabel.Create(self);
    Labels[i].Parent:= Rects[i];
    Rects[i].Width:= Rectangle1.Width;
    Rects[i].Height:= Rectangle1.Height;
    Rects[i].Position.y:= 0 + i * Rects[i].Height;
    Rects[i].Position.x:= 0 + i * Rects[i].Width;
    Rects[i].Stroke.Kind:= TBrushKind.None;
    Labels[i].AutoSize:= true;
    Labels[i].Text:= 'Test'+IntToStr(i+1);
    Labels[i].Position:= Label1.Position;
  end;
end;

end.

请注意,我已经在运行时完成了标签和rects的构造,但您也可以在设计时完成此操作。

FMX中的颜色常数已从VCL更改,请参阅:http://docwiki.embarcadero.com/RADStudio/Seattle/en/Colors_in_FireMonkey

答案 2 :(得分:1)

如果您有兴趣,这是我的一个样本:

function CreateLabel(
  AOwner: TFmxObject; ARangeWidth, ARangeHeight, ASizeMin, ASizeMax: Integer;
  AText: String; AColor: TAlphaColor): TLabel;
var
  LFMXObj: TFMXObject;
  LFontSize: Integer;
begin
  Result := TLabel.Create(AOwner);
  with Result do
  begin
    Parent := AOwner;
    Text := AText;

    ApplyStyleLookup;
    LFMXObj := FindStyleResource('text');
    if Assigned(LFMXObj) then
    begin
      LFontSize := ASizeMin + Random(ASizeMax - ASizeMin);
      //TText(LFMXObj).Fill.Color := AColor;   // XE2
      TText(LFMXObj).Color := AColor;
      TText(LFMXObj).Font.Size := LFontSize;
      TText(LFMXObj).Font.Style := TText(LFMXObj).Font.Style + [TFontStyle.fsBold];
      TText(LFMXObj).WordWrap := False;
      TText(LFMXObj).AutoSize := True;

      Canvas.Font.Assign(TText(LFMXObj).Font);
      Position.X := Random(ARangeWidth - Round(Canvas.TextWidth(Text)));
      Position.Y := Random(ARangeHeight - Round(Canvas.TextHeight(Text)));
    end;
    {
    // test background label painting
    with TRectangle.Create(Result) do
    begin
      Parent := AOwner;
      Fill.Color := TAlphaColors.Lightgrey;
      Fill.Kind := TBrushKind.bkSolid;
      Width := Result.Canvas.TextWidth(Result.Text);
      Height := Result.Canvas.TextHeight(Result.Text);
      Position.X := Result.Position.X;
      Position.Y := Result.Position.Y;
      Result.BringToFront;
    end;
    }
    AutoSize := True;
    Visible := True;
  end;
end;