8

我正在使用以下文件从文件中加载自定义样式:

TStyleManager.LoadFromFile(filename)

当文件更改时,我想再次加载它。但是,如果我尝试得到一个EDuplicateStyleException,因为样式已经注册。

有没有办法卸载样式以便我可以再次加载它?这种情况的典型情况是您正在对自定义样式进行更改,并希望在不重新启动整个应用程序的情况下看到它的实际效果。

4

5 回答 5

7

在扫描了来源之后,我想这是不可能的。您唯一的机会可能是实施一些肮脏的黑客行为。

无论你做什么,你都应该为此写一个 QC。如果样式已经存在,Embarcadero 可以实现重新加载文件,而不是引发异常。对我来说,这看起来像是一种自然的行为。

于 2011-09-12T11:53:41.217 回答
4

检查这个项目vcl styles utils,暴露的功能之一是卸载 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 回答
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 风格非常了解。

于 2018-10-24T07:46:48.730 回答
0

您可以使用不同的样式名称在另一个文件中制作每个样式的副本。然后你可以加载它的副本作为一种解决方法。如果您确实需要原件,则可以在加载副本后加载它。

于 2011-09-13T09:58:41.920 回答