Delphi XE2: Перезагрузка пользовательского стиля VCL из файла? - PullRequest
8 голосов
/ 12 сентября 2011

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

TStyleManager.LoadFromFile(filename)

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

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

Ответы [ 5 ]

7 голосов
/ 12 сентября 2011

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

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

4 голосов
/ 18 января 2012

Проверьте этот проект vcl styles utils, одна из представленных функций - возможность выгрузки в стиле vcl. Просто включите модуль Vcl.Styles.Ext в свой проект, а затем используйте этот код.

 TStyleManager.RemoveStyle('Carbon');
3 голосов
/ 03 января 2015

Другая идея: это может сработать.Частичный код для простоты.В приведенном ниже коде вы сначала получите указатель на уже зарегистрированный стиль.Я думаю, тогда вы можете расположить и переназначить указатель на тот, который вы загрузили из файла.Я считаю, что исключение показывается только при попытке применить стиль, а не при его загрузке.Прости меня, если я ошибаюсь.

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;
1 голос
/ 24 октября 2018

Попробуйте это:

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.

0 голосов
/ 13 сентября 2011

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

...