我正在使用以下文件从文件中加载自定义样式:
TStyleManager.LoadFromFile(filename)
当文件更改时,我想再次加载它。但是,如果我尝试得到一个EDuplicateStyleException
,因为样式已经注册。
有没有办法卸载样式以便我可以再次加载它?这种情况的典型情况是您正在对自定义样式进行更改,并希望在不重新启动整个应用程序的情况下看到它的实际效果。
我正在使用以下文件从文件中加载自定义样式:
TStyleManager.LoadFromFile(filename)
当文件更改时,我想再次加载它。但是,如果我尝试得到一个EDuplicateStyleException
,因为样式已经注册。
有没有办法卸载样式以便我可以再次加载它?这种情况的典型情况是您正在对自定义样式进行更改,并希望在不重新启动整个应用程序的情况下看到它的实际效果。
在扫描了来源之后,我想这是不可能的。您唯一的机会可能是实施一些肮脏的黑客行为。
无论你做什么,你都应该为此写一个 QC。如果样式已经存在,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;
注意:我从未编写过代码。但它应该工作。
无论如何,您应该使用 RRuz 的库。他对这些 VCL 风格非常了解。
您可以使用不同的样式名称在另一个文件中制作每个样式的副本。然后你可以加载它的副本作为一种解决方法。如果您确实需要原件,则可以在加载副本后加载它。