15

スタイルを動的に(実行時に)ロード/変更する方法を確認できる優れたVCLスタイルのチュートリアルはありますか?

XE2はVCLスタイルを備えた最初のバージョンであるため、これはDelphiXE2以降で機能するはずです。

4

3 に答える 3

36

リンクだけでなくローカル情報が好まれることが多いので、答えを追加します。

始める前に知っておく必要のある重要な事実は次のとおりです。

  1. 多くのVCLコントロールにはカラープロパティがありますが、スタイルがオンの場合、これらのプロパティは無視され、ボタンなどのデフォルトの「共通コントロール」は、「来る」XPまたはWindows 2000スタイルを使用する代わりに、Delphi自体によって描画されます。窓付き」。

  2. どういうわけか、アプリケーションの奥深くで、VCLスタイルはコントロールのペイントを引き継ぐフックを配置します。処理できるものはすべて、通常のコントロールの上に「スキン」を使用して描画されます。多くの人がこれを「vclのスキニング」と呼んでいます。VCLスタイルの前に、サードパーティのスキンシステムを見つけたかもしれません。今では組み込まれています。

  3. フックされていないものはすべて、通常のスタイルを取得します。したがって、ほとんどのサードパーティが制御し、VCLの一部はテーマ化されません。完璧なインスタント結果を期待しないでください。また、スキニングの結果として瞬間的なちらつきやグリッチが発生する場合がありますが、これは予想されることです。実行時にスタイルのロードを追加すると、結果の最終的な品質は誰もが推測できます。実行時にロードされるスタイルに、必要なすべてのものが含まれることを必ずしも保証することはできません。また、静的にアプリに含めるものを保証することもできませんが、少なくとも静的に含めるものは、QAチーム(あなたの場合もあります)によって検証される可能性があります。

そして、これが始めるための最も簡単なステップです:本当にステップ#2から#4だけが不可欠です。

  1. 「ファイル」->「新規」->「VCLフォームプロジェクト」をクリックします。

  2. プロジェクトマネージャペインでプロジェクトオプションを右クリックし、プロパティをクリックします。[アプリケーション]->[外観]に移動します

  3. カスタムスタイルをクリックしてオンにします。(Amakritsは私のリストの最初なので、それをクリックします)。

  4. [デフォルトスタイル]コンボボックスをクリックして、デフォルト以外のものに変更します。

  5. 空にならないようにフォームに何かを置きます。(ボタン、リストボックスなど)。

  6. アプリを実行します。

ここに画像の説明を入力してください

さて、高度なもの:実行時にスタイルを変更します:

このボタンをクリックしてformcreateを使用して、次のことを行います。

fdefaultStyleName:String;フォームのプライベートセクションに追加します。

Vcl.Themes使用句にあることを確認してください。

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;
于 2012-03-28T19:18:15.127 に答える
3

一例(公的手続き)。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;
于 2016-08-08T07:02:08.013 に答える