Delphi自带风格管理器TStyleManager

TStyleManagerDelphi主题

今天发现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的选项卡下面,把需要风格都给勾上

实际运行效果如下

12-23 11:03