Как я могу применить скины Delphi XE2 к формам в DLL? - PullRequest
5 голосов
/ 07 сентября 2011

Используя Delphi XE2, вы можете встраивать пользовательские стили (скины) в проект VCL.
Все работает отлично.Теперь у меня есть несколько форм в отдельном dll, которые я показываю динамически.
Конечно, это не скины.Как я могу исправить это?

Думаю, мне нужно как-то позвонить в TVisualStyle, но не повезло.

Хост:

procedure TForm1.Button1Click(Sender: TObject); 
var   
  l: THandle;   
  p: procedure (const h: THandle); stdcall; 
begin   
 l:= LoadLibrary('project1.dll');   
 if l > 0 then   
 begin
        @p:= GetProcAddress(l,'ShowIt');
        p(Application.Handle);
        FreeLibrary(l);   
  end; 
end;

Dll:

procedure ShowIt(const h: THandle);stdcall;
var
  form: TForm;
  b: TButton;
  han: THandle;
begin
  han:= Application.Handle;
  Application.Handle:= h;
  form :=Tform.Create(Application);
  b:= TButton.Create(form);
  b.Parent:= form;
  b.Caption:= 'ytes';
  b.Left:= 2;
  b.Top:= 2;
  form.ShowModal;
  form.Release;
  Application.Handle:= han;
end;

exports ShowIt ;
begin
end.

Довольно стандартные вещи.Теперь, что именно нужно сделать, чтобы форма dll использовала тему стиля хоста?

Ответы [ 2 ]

14 голосов
/ 07 сентября 2011

У вас есть два разных экземпляра VCL. Вы установили стиль в экземпляре StyleServices, принадлежащем исполняемому файлу, но ваша DLL не знает об этом. Вы можете решить это одним из следующих способов:

  1. Передача настроек стиля функции в вашей DLL, которая применяет эти настройки к другому экземпляру StyleServices.
  2. Используйте пакеты, чтобы у вас был только один экземпляр VCL.
0 голосов
/ 05 января 2012

У меня было много проблем с этим, и это было потому, что я использовал themes вместо VCL.THEMES и VCL.STYLES.

Дельфи подбрасывал customeStyleException, говоря «стиль не найден»"или EcustomStyleException" Функция, не поддерживаемая этим стилем "

...