Delphi自带风格管理器TStyleManager

今天发现Delphi自带的VCL历程中有风格管理器。研究了下代码,惊喜发现几行代码就可以实现这个功能。记录一下。

第一步、代码如下:

unit StyleManager;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.Buttons,
Vcl.ButtonGroup, Vcl.CheckLst;

type
TForm5 = class(TForm)
cbxVclStyles: TComboBox;
PreviousStyle: TButton;
NextStyle: TButton;
Panel1: TPanel;
GroupBox1: TGroupBox;
Edit1: TEdit;
Button3: TButton;
CheckBox1: TCheckBox;
RadioButton1: TRadioButton;
ComboBox1: TComboBox;
ScrollBar1: TScrollBar;
ScrollBar2: TScrollBar;
ListBox1: TListBox;
Shape1: TShape;
StaticText1: TStaticText;
CheckListBox1: TCheckListBox;
ButtonGroup1: TButtonGroup;
ColorBox1: TColorBox;
SpeedButton1: TSpeedButton;
Button1: TButton;
Button2: TButton;
Button4: TButton;
Button5: TButton;
RadioButton2: TRadioButton;
procedure FormCreate(Sender: TObject);
procedure cbxVclStylesChange(Sender: TObject);
procedure PreviousStyleClick(Sender: TObject);
procedure NextStyleClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form5: TForm5;
myList:TStringList ;
number:integer;

implementation
{$R *.dfm}
uses
Vcl.Themes;

procedure TForm5.cbxVclStylesChange(Sender: TObject);
begin
TStyleManager.SetStyle(cbxVclStyles.Text);
//以下方法可以用 如下代码替换。
// number := myList.IndexOf(cbxVclStyles.Text)

for number := 0 to myList.Count do
begin
if myList[number]=cbxVclStyles.Text then
break;
end;

end;

procedure TForm5.FormCreate(Sender: TObject);
var
StyleName: string;
begin
myList:=TStringList.Create;
for StyleName in TStyleManager.StyleNames do
begin
cbxVclStyles.Items.Add(StyleName);
myList.Add(StyleName);
end;
cbxVclStyles.ItemIndex := cbxVclStyles.Items.IndexOf(TStyleManager.ActiveStyle.Name);
end;

//下一个主题
procedure TForm5.NextStyleClick(Sender: TObject);
begin
number:=number+1;
if number<0 then begin number:=myList.Count-1; end; TStyleManager.SetStyle(myList[number]); cbxVclStyles.ItemIndex := cbxVclStyles.Items.IndexOf(TStyleManager.ActiveStyle.Name); end; //上一个主题 procedure TForm5.PreviousStyleClick(Sender: TObject); begin number:=number-1; if number>=myList.Count then
begin
number:=0;
end;

TStyleManager.SetStyle(myList[number]);
cbxVclStyles.ItemIndex := cbxVclStyles.Items.IndexOf(TStyleManager.ActiveStyle.Name);
end;

end.

第二步、更改工程设置。

在工程Options的选项卡下面,把需要风格都给勾上

实际运行效果如下

 

代码实现单风格方法:

引入

Vcl.Themes,
Vcl.Styles,

设置主题类型

TStyleManager.TrySetStyle('Turquoise Gray');

 

或则在窗体代码中实现

unit Unit14;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Themes,
Vcl.Styles;

type
TForm14 = class(TForm)
btn1: TButton;
btn2: TButton;
lst1: TListBox;
OpenDialog1: TOpenDialog;
procedure FormCreate(Sender: TObject);
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
procedure StylesListRefresh();
public
{ Public declarations }
end;

var
Form14: TForm14;

implementation

{$R *.dfm}

{ TForm14 }

procedure TForm14.btn1Click(Sender: TObject);
begin
TStyleManager.SetStyle(lst1.Items[lst1.ItemIndex]);
end;

procedure TForm14.FormCreate(Sender: TObject);
begin
Self.StylesListRefresh;
end;

procedure TForm14.StylesListRefresh;
var
stylename: string;
begin
Self.lst1.Clear;
// retrieve all the styles linked in the executable
for stylename in TStyleManager.StyleNames do
begin
lst1.Items.Add(stylename);
end;
end;

end.

THE END