我正在使用以下方法从文件加载自定义样式:
TStyleManager.LoadFromFile(filename)
当文件被更改时,我希望能够重新加载它。但是,如果我尝试这样做,会出现“EDuplicateStyleException”异常,因为该样式已经被注册。
有没有一种方法可以卸载样式,以便我可以再次加载它?典型的情况是,您正在对自定义样式进行更改,并希望在不重新启动整个应用程序的情况下看到它的效果。
我正在使用以下方法从文件加载自定义样式:
TStyleManager.LoadFromFile(filename)
在扫描源代码后,我猜这不可能用一种直截了当的方式实现。你唯一的机会可能是实现一些肮脏的技巧。
无论你做什么,你都应该为此编写一个质量控制程序。Embarcadero可以实现重新加载文件,如果样式已经存在,而不是引发异常。对我来说,那看起来像是一种自然的行为。
请查看这个项目vcl styles utils
,其中一个提供的功能是卸载vcl风格。只需要在您的项目中包含Vcl.Styles.Ext单元,然后使用以下代码。
TStyleManager.RemoveStyle('Carbon');
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;
试试这个:
procedure TfrmMain.Button11Click(TObject *Sender);
var
MyStyle TCustomStyleServices;
const
usStylePath= 'c:\Users\Public\Documents\Embarcadero\Studio\19.0\Styles\vcl\MINE.vsf';
begin
if TStyleManager.IsValidStyle(usStylePath)
begin
// Get current style
MyStyle:= TStyleManager.Style["Emerald"]; // this will return a TCustomStyleServices obj
if (MyStyle <> NULL)
begin
// Set default Windows style (no style)
TStyleManager.SetStyle(TStyleManager.SystemStyle);
// Remove it
TStyleManager.UnRegisterStyle(MyStyle);
end;
// Load style from disk
TStyleManager.LoadFromFile(usStylePath);
TStyleManager.SetStyle(Emerald");
end;
end;
你可以在另一个文件中复制每个样式,并使用不同的名称。然后,你可以加载它的副本作为解决方法。如果你真的需要原始样式,那么你可以在加载副本之后再加载它。