Delphi XE2:从文件重新加载自定义VCL样式?

时间:2011-09-12 09:49:47

标签: delphi delphi-xe2 vcl-styles

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

TStyleManager.LoadFromFile(filename)

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

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

5 个答案:

答案 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)

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