Delphi VCL styles tutorial - how to change the style at runtime

philnext picture philnext · Mar 28, 2012 · Viewed 45.3k times · Source

Is there a good VCL Styles tutorial where we see how to dynamically (in run time) load/change the style ?

This should work with Delphi XE2 and up, since XE2 is the first version with VCL Styles.

Answer

Warren  P picture Warren P · Mar 28, 2012

I'm adding an answer because local information is often preferred to just links.

Here's the key facts you need to know before you start:

  1. Many VCL controls have color properties, but those properties are going to get ignored when styles are on, and the default "common controls" like Button are going to get drawn by Delphi itself, instead of using the XP or Windows 2000 style that "comes with windows".

  2. Somehow, deep within your application, VCL styles puts hooks in that take over painting your controls. Everything that it can handle, will be drawn using a "skin" on top of the regular controls. Many people call this "skinning the vcl", and prior to VCL styles, you might have found a third party skin system. Now it's built in.

  3. Anything that is not hooked, will still get the regular style. So most third party controls, and some bits of the VCL will not be themed. Don't expect perfect instant results. Also, you might sometimes see some momentary flicker or glitches as a result of skinning, that's to be expected. Add loading of styles at runtime, and the end-quality of your result is anybody's guess. You can't necessarily guarantee that the style which is loaded at runtime, will contain everything you might want it to contain. Nor can you guarantee that with one you statically include in your app, but at least the ones you statically include could be verified by your QA team (which might be you).

And here's the simplest steps to get started: Really only step #2 through #4 are essential.

  1. Click File -> New -> VCL Forms project.

  2. Right click on the project options in the Project manager pane, and click properties. Navigate to Application -> Appearance

  3. Click on a custom style to turn it on. (Amakrits is the first in my list, so I'll click that).

  4. Click on the Default Style combobox and change it to something other than default.

  5. Put something on your form so it's not empty. (A button, a listbox, etc).

  6. Run your app.

enter image description here

Now, advanced stuff: Change your style at runtime:

I use this button click and formcreate to do that:

Add fdefaultStyleName:String; to private section of your form.

Make sure Vcl.Themes is in your uses clause.

procedure TForm1.Button1Click(Sender: TObject);
begin
 if Assigned(TStyleManager.ActiveStyle) and (TStyleManager.ActiveStyle.Name<>'Windows') then begin
   TStyleManager.TrySetStyle('Windows');
 end else begin
   TStyleManager.TrySetStyle(fdefaultStyleName); // whatever was in the project settings.
 end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
if Assigned(TStyleManager.ActiveStyle) then
  fdefaultStyleName := TStyleManager.ActiveStyle.Name;

end;