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;
вы можете сделать копию каждого стиля в другом файле с другим именем стиля. Затем вы можете загрузить его копию в качестве обходного пути. Если вам действительно нужен оригинал, вы можете загрузить его после загрузки копии.