Jump to content
Columbo

Custom color not in color property list

Recommended Posts

I'm trying to find a way to change the color of the Titlebar and TLabel fonts and TEdit fonts to my own chosen colors.  The 'Color ' menu does not give you a lot of choices.  A lot of greys and whites but few colors and I don't see any way to add a color such as #562703 or RGB 86,39,11.  Is it possible to do this?

 

Thanks

 

Share this post


Link to post

For controls like TLabel and TEdit, you can use color constants defined in System.UITypes or specify your own as hex numbers; the TColor type is simply a UInt32 in the range -$7FFFFFFF-1..$7FFFFFFF.

 

For example, both of the following lines set a label's font color to navy:

  Label1.Font.Color := clNavy;
  Label1.Font.Color := TColor($800000);

The TitleBar is a special case and you have to enable custom properties for it; watch this tutorial video on Creating Custom Title Bars from DelphiCon 2021.

Share this post


Link to post

Thanks David,

Quote

The TitleBar is a special case and you have to enable custom properties for it; watch this tutorial video on Creating Custom Title Bars from DelphiCon 2021.

I did happen to come across that video and found out how to do it, although again in that video he uses colors from the 'Color' drop down menu.  I need to use my own custom color #502F0F.

 

Quote

Label1.Font.Color := clNavy;
  Label1.Font.Color := TColor($800000);

So, using your code example, can I just replace the 'TColor($800000); with 'TColor(#502F0F' ?

 

Thanks again.

 

 

Share this post


Link to post
2 minutes ago, Columbo said:

So, using your code example, can I just replace the 'TColor($800000); with 'TColor(#502F0F' ?

Not with "#" but with a "$".  Hex numbers in Delphi are prefixed with $.

Label1.Font.Color := TColor($502F0F);

 

Share this post


Link to post
12 hours ago, Columbo said:

The 'Color ' menu does not give you a lot of choices.  A lot of greys and whites but few colors and I don't see any way to add a color such as #562703 or RGB 86,39,11.  Is it possible to do this?

Assigning custom colors to properties via code at runtime is trivial, as shown earlier.  But if you want to choose custom colors at design-time, that is possible but not trivial, as you have to write your own custom property editor and register it for TColor, overriding the default property editor.

 

See webcolors and custom colors in Delphi's Object Inspector colorpicker at design-time

Custom colors in Delphi 7

Edited by Remy Lebeau

Share this post


Link to post

Here is a sample using a ColorDialog and ListBox.  Note In the IDE you can interact with the colordialog on the form to preload custom colors. The ColorDialog can be to show full with in object inspector.

procedure TForm1.Button1Click(Sender: TObject);
begin
 If ColorDialog1.Execute Then
 Listbox1.Items := ColorDialog1.CustomColors;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  if Sender is TListBox then
    begin
      var lb := TListBox(Sender);
      var I  := lb.ItemIndex;

      Color := StrtoInt('$'
                         + lb
                            .Items
                            .ValueFromIndex[I]
                       );
    end;
end;

 

Share this post


Link to post

Thanks guys,  I think I've got that now.  I guess  should do this in another post but my problem now is with a tabbed panel.  I created a panel with 2 tabs.  I want to load 2 images, one image into each tab.  I tried to put a TImage control in each tab but that does not work.  Once the TImage control is placed in Tab1, you can no longer switch tabs.  If you load and image into the TImage control the same image is displayed in both tabs.  I don't have room on my form to create 2 separate panels with separate TImage controls.  I have searched all over for a solution but can't find anything on this.  Suggestions?

 

Share this post


Link to post

I managed to accomplish what I was trying to do by using a TabSheet.  It seems to work where the TabPanel would not.  I placed a TImage control in each tab and loaded an image in each tab just to test it and it works as I wanted it to.  I removed the images since they were just for testing and now I will try to figure out how to load an image into each TabSheet programmatically

Share this post


Link to post

For each question (first one) I suggest you to indicate Delphi version.

 

 

5 hours ago, Columbo said:

I created a panel with 2 tabs. 

use a TPageControl linked to a TImageList. You can change for each tab the imageindex property  (-1 to "hide" image)

image.thumb.png.81e51668ce44c141d58a2e31b118cb9b.png

 

If Delphi 11,  for the Font Color problems, with new versions you have to take care of StyleElements property, if you have set some appearance (style) to the project and don't remove seFont from the array then color you set at runtime should not be taken into account.
Here, appearance is set to "Windows10 blue", button1.click  code 

Label1.font.Color:=clred;

is inefficient except if you set  Label1.StyleElements:=Label1.StyleElements-[seFont]

image.thumb.png.aee6485fff90be02e13241e5c3bb4ec0.png

 

Edited by Serge_G

Share this post


Link to post

Thanks Serge,  I am using Delphi 11 Community.  I didn't do anything with StyleElements because I was not aware of what that does.  What I used was lblName.Font.Color := TColor(#575).  When I run the program it works ok. 

 

As for the Tabs, I don't want to place an image in them permanently.  I have a database with 115 records and each record has 2 images associated with it.  When a record is selected I want it to display the associated images, one in each tab.  I need to know how to place these images into the tabs programmatically.  I have searched the internet and I see lots of discussion on placing images into tabs permanently using TImageList but nothing on how to do it at run time.

 

Share this post


Link to post
1 hour ago, Columbo said:

I need to know how to place these images into the tabs programmatically

Look at the help for TImageList.Add. There's a code sample that shows how to load a selected image file from disk. You can extend that to your database by either saving out the image to a temporary file or streaming it directly to a TImage.

Share this post


Link to post

@Columbo, I had a few minutes and explored this technique of loading a TImageList dynamically a little more for my own curiosity and wrote a test program. The attached project loads a memory table with some local bitmaps, then as you scroll through the table, it pulls the image out of the table and clears/refreshes the image list which is associated with the page control. It should get you close to what you want.

ImageListLoadTest.zip

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×