Search code examples
delphifiremonkey

Toggle Delphi Label color with Firemonkey


With VCL I can do this:

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;

As you can see, the color of the label background and the text toggles from blue to yellow and vice-versa.

I want to do the same with Firemonkey but, all the search I made only says that FMX labels has no background color (I don't understand why), and don't give me a effetive clue how to do the same thing as in VCL.

Can someone write here the equivalent FMX code snippet?

Thank you.


Solution

  • In Firemonkey many controls do not have a color. Instead you're supposed to layer controls out of different components.

    In this case if you want a background use a TRectangle.
    In the designer Delphi insists that you cannot have a label be parented by a rectangle, but this if of course not true, in FMX any control can parent any other.

    Just use the structure pane to drag the label on top of the rectangle and voila label and rectangle are joined together.

    enter image description here

    The equivalent code to the above would look something like this.

    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.
    

    Note that I've done the construction of the labels and rects in runtime, but you can do this in design time as well.

    The color constants in FMX have changed from the VCL, see: http://docwiki.embarcadero.com/RADStudio/Seattle/en/Colors_in_FireMonkey