Delphi XE2: перезагрузка пользовательского стиля VCL из файла?

я загружаю пользовательский стиль из файла, используя:

TStyleManager.LoadFromFile(filename)

когда файл будет изменен, я хочу загрузить его снова. Но если я попробую, я получу EDuplicateStyleException потому что стиль уже зарегистрированы.

есть ли способ выгрузить стиль, чтобы я мог загрузить его снова? Типичным примером этого является то, что вы вносите изменения в свой стиль и хотят видеть его в действии без перезапуска всего приложения.

4 ответов


после сканирования источников я думаю, что это невозможно прямо вперед. Ваш единственный шанс может быть реализовать какой-то грязный хак.

Что бы вы ни делали, вы должны написать QC для этого. Embarcadero может реализовать перезагрузку файла, если стиль уже существует, а не вызывает исключение. По-моему, это вполне естественное поведение.


проверяем этот проект vcl styles utils, одна из особенностей подвергается является емкость выгрузки стиля vcl. Просто включите в VCL.Стили.Доб unit в вашем проекте, а затем используйте этот код.

 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;

вы можете сделать копию каждого стиля в другом файле с другим именем стиля. Затем вы можете загрузить его копию в качестве обходного пути. Если вам действительно нужен оригинал, вы можете загрузить его после загрузки копии.