2015-05-19 101 views
2

我有一個ListBox列出文件夾中的所有樣式文件(vsf)。 當用戶點擊一個文件,我加載風格:如何檢查樣式文件是否已經加載?

if TStyleManager.IsValidStyle(sSkinFile, StyleInfo) then 
    begin 
    TStyleManager.LoadFromFile(sSkinFile); 
    TStyleManager.SetStyle(StyleInfo.Name); 
    end 

然而,如果用戶點擊一個已經加載(以前點擊)風格,德爾福將上升,異常:「風格‘金石墨’已經註冊」。

注意:看起來系統在加載新樣式時不會釋放以前的樣式。我認爲如果用戶開始點擊所有列出的樣式,內存消耗會更高一些。

如何檢查樣式是否已加載?

回答

2

您可以使用TStyleManagerStyle屬性,此屬性將在未加載VCL樣式時返回nil。試試這個例子。

uses 
    Vcl.Styles, 
    Vcl.Themes; 

function VCLStyleLoaded(StyleName : string) : Boolean; 
begin 
Result := TStyleManager.Style[StyleName] <> nil; 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
StyleInfo: TStyleInfo; 
begin 
    if OpenDialog1.Execute then 
    begin   
    if TStyleManager.IsValidStyle(OpenDialog1.FileName, StyleInfo) and not VCLStyleLoaded(StyleInfo.Name) then 
    begin 
    TStyleManager.LoadFromFile(OpenDialog1.FileName); 
    TStyleManager.SetStyle(StyleInfo.Name); 
    end 
    end; 
end; 
+0

你的答案和Uwe的答案一樣好。非常感謝。 – Ampere

+0

@ rruz-我今天發現的奇怪事情:如果Vcl.Styles不在USES列表中,TStyleManager.IsValidStyle總是失敗!我的意思是,該程序編譯沒有警告;但功能失敗。 – Ampere

2

您可以調用TStyleManager.TrySetStyle並僅在失敗時才加載樣式。

+0

謝謝。公認。這種方法與直覺相反。我正在爲主題單元代碼挖掘更多類似delphi的內容,例如:如果不是StyleRegistered(x),則LoadFromFile(y):) – Ampere

+3

或['help yourself'](http://pastebin.com/6L5PEKp7).. 。 – TLama

+1

@ TLama - 它必須使用磁盤(vcf)文件。但我明白了。我現在可以做到。非常感謝。 +1 – Ampere

0

奇怪的東西我今天發現:如果Vcl.Styles不在用途清單TStyleManager.IsValidStyle總是失敗!


SOLUTION: 只需添加Vcl.Styles的用途清單。

相關問題