Firemonkey TListBox changing background color at runtime

248 Views Asked by At

I there a way, at runtime, other than using styles, to change the background color of a TListBox? Can I use the OnPaint event?

1

There are 1 best solutions below

1
On

Because the TListbox doesn't have a property to change the background color, I can only think of the following, which is based on combining two components, of which one (the TListBox) uses a built-in style. Note however, that this is not depending on TStyleBook nor any of the style files supplied with Delphi Firemonkey.

Place a TRectangle as a background for the TListBox. Set its Fill - Color property to a color you like. (I used "Cornsilk" in the example).

Place the TListBox on the rectangle as a child of the rectangle. In the "Object Inspector" locate the StyleLookup property and change its value to transparentlistboxstyle. This makes the listbox transparent and the rectangle and its fill color to shine through.

If you make the TListBox one pixel smaller than the rectangle on each side, you can use the Sides property to provide a thin frame around the listbox. Or you can choose to make them equally sized and not show any frame.

My test result looks like this:

enter image description here

The TRectangle and the TListbox properties from the .fmx file:

  object Rectangle1: TRectangle
    Anchors = [akLeft, akTop, akBottom]
    Fill.Color = claCornsilk
    Position.X = 7.000000000000000000
    Position.Y = 40.000000000000000000
    Size.Width = 361.000000000000000000
    Size.Height = 219.000000000000000000
    Size.PlatformDefault = False
    object ListBox1: TListBox
      Anchors = [akLeft, akTop, akRight, akBottom]
      Position.X = 1.000000000000000000
      Position.Y = 1.000000000000000000
      Size.Width = 359.000000000000000000
      Size.Height = 217.000000000000000000
      Size.PlatformDefault = False
      StyleLookup = 'transparentlistboxstyle'
      TabOrder = 0
      ParentShowHint = False
      ShowHint = False
      DisableFocusEffect = True
      ItemHeight = 48.000000000000000000
      DefaultItemStyles.ItemStyle = 'listboxitemrightdetail'
      DefaultItemStyles.GroupHeaderStyle = ''
      DefaultItemStyles.GroupFooterStyle = ''
      Viewport.Width = 359.000000000000000000
      Viewport.Height = 217.000000000000000000
    end
  end

To change the color of ListBox1, you actually change the color of the TRectangle:

procedure TForm5.ColorListBox1ItemClick(const Sender: TCustomListBox;
  const Item: TListBoxItem);
begin
  Rectangle1.Fill.Color := TColorListBox(Sender).Color;
end;