2012年10月23日火曜日

Style を外部ファイルから読み込む


VCL / FireMonkey の Style は、非常に簡単に見目麗しいアプリケーションを制作できます。
その反面、Style を Exe ファイルに入れるとファイルサイズが大きくなってしまいます。
Style はアプリケーションの本質とは関係ないため、Style によってファイルサイズが大きくなるのは避けたい所です。

すぐに思いつく簡単な解決策は、Style ファイルを外部に持つ、ということです。
こうすれば、Exe ファイルに取り込まれないのでファイルサイズが大きくなるのを防ぐ事ができる上、新しいスタイルの配布も簡単です。

しかし、デフォルトの vsf ファイルを配布しても良いのか?という懸念があります。
そこで、dockwiki を見てみると下記のようにあり
また、これらのスタイル(VCL スタイルまたは FireMonkey スタイル)はどれも、作成したアプリケーションと一緒に再配布することができます。この再配布可能なスタイル ファイルは、作成した製品のインストール ディレクトリ内の次の場所に置きます。
\Redist\styles
デフォルトの vsf ファイルも再配布可能なようです。

では、実際に外部の Style ファイルを読むコードは、どうするかというと…次のようにします。

TStyleManager.LoadFromFile('VSFファイル');
TStyleManager.TrySetStyle('スタイルの名前');

非常に簡単です。
とはいえ、毎回このコードを書くのは面倒なので StyleProvider というクラスを作ってみました。

このクラスを使うと指定のディレクトリにあるファイルを全部読み取り、スタイルをリストとして持ちます。
後は、Apply / ApplyByName メソッドを呼ぶだけです。

下記は、簡単な使用例です。

procedure TForm1.FormCreate(Sender: TObject);
var
Name: String;
begin
// ディレクトリを指定して生成する
// ここでは Exe と同じディレクトリを指定しているので
// Debug / Release それぞれに style ファイルを置かねばならない
StyleProvider :=
TStyleProvider.Create(
ExtractFilePath(Application.ExeName) + '\Redist\styles');
// スタイルの名前を ListBox1 に追加
for Name in StyleProvider do
ListBox1.Items.Add(Name);
end;
procedure TForm1.ListBox1Click(Sender: TObject);
var
Index: Integer;
begin
Index := ListBox1.ItemIndex;
// ListBox1 がクリックされたとき、スタイルを変える
if (Index > -1) and (Index < ListBox1.Items.Count) then
StyleProvider.ApplyByName(ListBox1.Items[Index]);
end;

良かったら使ってみてください。

0 件のコメント:

コメントを投稿