スタイルを動的に(実行時に)ロード/変更する方法を確認できる優れたVCLスタイルチュートリアルはありますか?
XE2はVCLスタイルを備えた最初のバージョンであるため、これはDelphi XE2以降で機能します。
ローカル情報はリンクだけよりも好まれることが多いので、答えを追加します。
始める前に知っておくべき重要な事実は次のとおりです。
多くのVCLコントロールにはカラープロパティがありますが、スタイルがオンの場合、これらのプロパティは無視され、ボタンなどのデフォルトの「共通コントロール」は、XPまたはWindows 2000を使用する代わりにDelphi自体によって描画されます。 「窓に付いてくる」スタイル。
どういうわけか、アプリケーションの奥深くで、VCLスタイルは、コントロールの描画を引き継ぐフックを配置します。それが処理できるすべてのものは、通常のコントロールの上に「スキン」を使用して描画されます。多くの人がこれを「vclのスキニング」と呼んでいます。VCLスタイルの前に、サードパーティのスキンシステムを見つけたかもしれません。今ではそれが組み込まれています。
フックされていないものは、通常のスタイルのままです。そのため、ほとんどのサードパーティコントロール、およびVCLの一部のビットはテーマ化されません。完璧なインスタント結果を期待しないでください。また、スキニングの結果として、瞬間的なちらつきやグリッチが発生することがありますが、これは予想されることです。実行時にスタイルの読み込みを追加すると、結果の最終的な品質は誰にもわかりません。実行時に読み込まれるスタイルに、必要なすべてが含まれていることを保証することはできません。また、静的に含めるものをアプリに静的に含めることは保証できませんが、少なくとも静的に含めるものは、QAチーム(あなたかもしれません)によって検証できません。
そして、これが開始する最も簡単なステップです:本当にステップ#2から#4だけが必須です。
[ファイル]-> [新規]-> [VCLフォームプロジェクト]をクリックします。
プロジェクトマネージャペインでプロジェクトオプションを右クリックし、[プロパティ]をクリックします。アプリケーション->外観に移動します
カスタムスタイルをクリックしてオンにします。 (Amakritsは私のリストの最初なので、それをクリックします)。
[デフォルトスタイル]コンボボックスをクリックして、デフォルト以外の値に変更します。
空ではないようにフォームに何かを配置します。 (ボタン、リストボックスなど)。
アプリを実行します。
今、高度なもの:実行時にスタイルを変更:
私はこのボタンをクリックしてformcreateを使用してそれを行います:
fdefaultStyleName:String;
をフォームのプライベートセクションに追加します。
Vcl.Themes
がuses句に含まれていることを確認してください。
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;
VCLスタイルに関する多くのことについては、RRUZホームページを参照してください。
以下は、いくつかのスタイルを動的にロードできる主要なデモです。 exploring-delphi-xe2-vcl-styles-part-i
VCLスタイルに関する最良の情報源は Rodrigo Ruz's ブログです: http://theroadtodelphi.wordpress.com/category/vcl-styles/
例(パブリックプロシージャ)。 Vcl.Themesを使用することを忘れないでください。
procedure TData.AllowSKIN( bSKIN:boolean );
var
sSKIN:string;
begin
sSKIN := 'Aqua Light Slate';
if not bSKIN then sSKIN := 'Windows';
TStyleManager.TrySetStyle( sSKIN );
end;
ユーザーがスキンを設定できるようにするために、アプリケーションで呼び出す(テンプレート)フォームがあります。フォームを表示するには、単にShowSkinFormを使用します。また、アプリケーションの初期化中にLoadLastSkinを呼び出して、最後のスキンを自動的に適用することもできます。
UNIT FormSkinsDisk;
{-----------------
2017.02.23
Universal skin loader. Loads skins from disk (vsf file)
To use it:
Application.ShowMainForm:= FALSE;
MainForm.Visible:= FALSE; // Necessary so the form won't flicker during skin loading at startup
LoadLastSkin (during application initialization)
MainForm.Show;
Skins should be present in the 'System\skins' folder
Skins folder:
c:\Users\Public\Documents\Embarcadero\Studio\15.0\Styles\
KNOWN BUG:
TStyleManager.IsValidStyle always fails if Vcl.Styles is not in the USES list!! http://stackoverflow.com/questions/30328644/how-to-check-if-a-style-file-is-already-loaded
-------------------------------------------------------------------------------------------------------------}
INTERFACE {$WARN GARBAGE OFF} {Silence the: 'W1011 Text after final END' warning }
USES
System.SysUtils, Vcl.Controls, Vcl.Forms, Vcl.StdCtrls, System.Classes, System.Types;
TYPE
TfrmSkinsDisk = class(TForm)
lBox: TListBox;
procedure FormCreate (Sender: TObject);
procedure FormDestroy (Sender: TObject);
procedure lBoxClick (Sender: TObject);
procedure FormClose (Sender: TObject; var Action: TCloseAction);
procedure lblTopClick (Sender: TObject);
private
procedure FillLstBox;
public
end;
procedure LoadLastSkin(CONST DefaultSkin: string= ''); { On first run, set the DefaultSkin to an existing file (no path) like: 'Graphite Green.vsf'. Leave it empty if you want the default Windows theme to load }
procedure ShowSkinForm;
IMPLEMENTATION {$R *.dfm}
USES
IOUtils, Vcl.Styles, cIO, vcl.Themes, cINIFile, cINIFileEx, CubicTPU; {VCL.Styles is mandatory here}
VAR
SkinFile: string; { Disk short file name (not full path) for the current loaded skin }
CONST
DefWinTheme= 'Windows default theme';
{-----------------------------------------------------------------------------------------
UTILS
-----------------------------------------------------------------------------------------}
function GetSkinDir: string;
begin
Result:= GetAppSysDir+ 'skins\';
end;
function LoadSkinFromFile(CONST DiskShortName: string): Boolean;
VAR Style : TStyleInfo;
begin
Result:= FileExists(GetSkinDir+ DiskShortName);
if Result then
if TStyleManager.IsValidStyle(GetSkinDir+ DiskShortName, Style)
then
if NOT TStyleManager.TrySetStyle(Style.Name, FALSE)
then
begin
TStyleManager.LoadFromFile(GetSkinDir+ DiskShortName);
TStyleManager.SetStyle(Style.Name);
end
else Result:= FALSE
else
MesajError('Style is not valid: '+ GetSkinDir+ DiskShortName);
end;
procedure LoadLastSkin(CONST DefaultSkin: string= '');
begin
SkinFile:= cINIFile.ReadString('LastDiskSkin', DefaultSkin); { This is a relative path so the skin can still be loaded when the application is moved to a different folder }
if SkinFile = ''
then SkinFile:= DefaultSkin;
if (SkinFile > '')
AND (SkinFile <> DefWinTheme) { DefWinTheme represents the default Windows theme/skin. In other words don't load any skin file. Let Win skin the app }
then LoadSkinFromFile(SkinFile);
end;
procedure ShowSkinForm;
VAR
frmSkins: TfrmSkinsDisk;
begin
frmSkins:= TfrmSkinsDisk.Create(NIL);
frmSkins.ShowModal;
FreeAndNil(frmSkins);
end;
{----------------------------------------------------------------------------------------
CREATE
-----------------------------------------------------------------------------------------}
procedure TfrmSkinsDisk.FormCreate(Sender: TObject);
begin
LoadForm(Self);
FillLstBox; { Populate skins }
end;
procedure TfrmSkinsDisk.FormDestroy(Sender: TObject);
begin
SaveForm(Self);
cINIFile.WriteString ('LastDiskSkin', SkinFile);
end;
procedure TfrmSkinsDisk.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:= caFree;
end;
{-----------------------------------------------------------------------------------------------------------------------
Populate skins
-----------------------------------------------------------------------------------------------------------------------}
procedure TfrmSkinsDisk.lblTopClick(Sender: TObject);
begin
FillLstBox;
end;
procedure TfrmSkinsDisk.FillLstBox; { Populate skins }
VAR
s, FullFileName: string;
begin
lBox.Items.Clear;
lBox.Items.Add(DefWinTheme); { This corresponds to Windows' default theme }
lblTop.Hint:= GetSkinDir;
if NOT DirectoryExists(GetSkinDir) then
begin
lblTop.Caption:= 'The skin directory could not be located! '+ GetSkinDir+ CRLF+ 'Add skins then click here to refresh the list.';
lblTop.Color:= clRedBright;
lblTop.Transparent:= FALSE;
EXIT;
end;
{ Display all *.vsf files }
for FullFileName in TDirectory.GetFiles(GetSkinDir, '*.vsf') DO
begin
s:= ExtractFileName(FullFileName);
lBox.Items.Add(s);
end;
end;
procedure TfrmSkinsDisk.lBoxClick(Sender: TObject);
begin
if lBox.ItemIndex < 0 then EXIT;
SkinFile:= lBox.Items[lBox.ItemIndex];
if SkinFile= DefWinTheme then
begin
TStyleManager.SetStyle('Windows');
SkinFile:= DefWinTheme;
end
else
if LoadSkinFromFile(SkinFile) then
begin
{ Bug fix } { fix for this bug: http://stackoverflow.com/questions/30328924/form-losses-modal-attribute-after-changing-app-style }
Application.ProcessMessages;
BringToFront;
end;
end;
end.