我正在使用以下文件从文件加载自定义样式:
TStyleManager.LoadFromFile(filename)
当文件被更改时,我想再次加载它。但是如果我尝试我得到EDuplicateStyleException
,因为样式已经注册。
有没有办法卸载样式,以便我可以再次加载它?典型的情况是您正在更改自定义样式,并希望在不重新启动整个应用程序的情况下查看它。
答案 0 :(得分:7)
扫描完源后,我猜这是不可能的。你唯一的机会可能是实施一些肮脏的黑客攻击。
无论你做什么,你都应该为此写一个QC。如果样式已经存在而不是引发异常,Embarcadero可以实现重新加载文件。这对我来说似乎是一种自然行为。
答案 1 :(得分:4)
检查此项目vcl styles utils
,暴露的功能之一是卸载vcl样式的能力。只需在项目中包含 Vcl.Styles.Ext 单元,然后使用此代码。
TStyleManager.RemoveStyle('Carbon');
答案 2 :(得分:3)
另一个想法: 这可能会奏效。部分代码简化。在下面的代码中,您首先获得已注册Style的句柄。我想那时,您可以处理并重新分配指针与从文件中加载的指针。我相信例外只会在您尝试应用样式时显示,而不是在您加载样式时显示。如果我错了,请原谅我。
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;
答案 3 :(得分:1)
尝试一下:
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样式了解很多。
答案 4 :(得分:0)
您可以使用不同的样式名称在另一个文件中制作每个样式的副本。然后你可以加载它的副本作为一种解决方法。如果你真的需要原版,那么你可以在加载副本后加载它。