8

次を使用して、ファイルからカスタム スタイルを読み込んでいます。

TStyleManager.LoadFromFile(filename)

ファイルが変更されたら、もう一度ロードしたい。しかしEDuplicateStyleException、スタイルが既に登録されているため、それを試してみると が得られます。

スタイルをアンロードして再度ロードできるようにする方法はありますか? この典型的なケースは、カスタム スタイルに変更を加えており、アプリケーション全体を再起動せずに動作を確認したい場合です。

4

5 に答える 5

7

ソースをスキャンした後、それは単純な方法では不可能だと思います。唯一のチャンスは、汚いハックを実装することかもしれません。

何をするにしても、このために QC を作成する必要があります。Embarcadero は、例外を発生させる代わりに、スタイルが既に存在する場合にファイルをリロードするように実装できます。それは私には自然な行動のように見えます。

于 2011-09-12T11:53:41.217 に答える
4

このプロジェクトvcl styles utilsを確認してください。公開されている機能の 1 つは、vcl スタイルをアンロードする機能です。プロジェクトにVcl.Styles.Extユニットを含めて、このコードを使用するだけです。

 TStyleManager.RemoveStyle('Carbon');
于 2012-01-18T16:19:21.447 に答える
3

別のアイデア: これはうまくいくかもしれません。簡単にするための部分的なコード。以下のコードでは、まず登録済みのスタイルへのハンドルを取得します。その後、ファイルからロードしたポインターを破棄して再割り当てできると思います。スタイルをロードしたときではなく、スタイルを適用しようとしたときにのみ例外が表示されると思います。私が間違っていたら許してください。

var
  StyleName: String;
  Style    : TStyleManager.TStyleServicesHandle;
  FileName : String;

begin

  StyleName := 'Obsidian';       // or another style name
  FileName  := 'obsidian.vsf';   // or any other valid style file name

  Style     := TStyleManager.Style[ StyleName];

  if Assigned( Style) then   // style already registered
  begin
    TStyleManager.TrySetStyle( StyleName);
    // insert other processing here

  end
  else // style not registered
  begin 
    if TStyleManager.IsValidStyle( FileName) then
    begin
      Style := TStyleManager.LoadFromFile( FileName);
      if Assigned( Style) then
      begin   
        // insert other processing here, such as
        // TStyleManager.SetStyle( Style);

      end;
    end;
  end;

end;
于 2015-01-02T22:10:49.667 に答える
0

スタイルの別の名前を持つ別のファイルに各スタイルのコピーを作成できます。次に、回避策としてそのコピーをロードできます。本当にオリジナルが必要な場合は、コピーを読み込んだ後に読み込むことができます。

于 2011-09-13T09:58:41.920 に答える