Как применить скины Delphi XE2 к формам в DLL?

Используя 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 использовала тему стиля хоста?


person Lobuno    schedule 07.09.2011    source источник
comment
Вы перекомпилировали DLL с XE2?   -  person Jerry Gagnon    schedule 07.09.2011
comment
Это DLL, а не пакет?   -  person David Heffernan    schedule 07.09.2011
comment
да. Но он не поднимает исходную тему.   -  person Lobuno    schedule 07.09.2011
comment
Вы не предоставили никаких подробностей о том, как VCL используется совместно (если вообще) и как разделяются exe и DLL - что и куда.   -  person David Heffernan    schedule 07.09.2011
comment
Не звоните туда Form.Release. Это отправляет сообщение в очередь сообщений приложения, и это сообщение не будет обработано до тех пор, пока поток не обработает сообщения, что произойдет только после того, как после функция DLL вернется к вызывающей стороне. Вызывающий выгружает DLL, так что теперь вы застряли в очереди с сообщением, адресованным окну, которое все еще существует, но код которого уже выгружен из памяти. Вместо этого позвоните Free. Release используется, когда объект хочет освободиться из одного из своих собственных обработчиков сообщений.   -  person Rob Kennedy    schedule 07.09.2011


Ответы (2)


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

  1. Передача настроек стиля функции в вашей DLL, которая применяет эти настройки к другому экземпляру StyleServices.
  2. Используйте пакеты, чтобы у вас был только один экземпляр VCL.
person David Heffernan    schedule 07.09.2011
comment
Спасибо. Затем я передам имя скина как Pchar (и встрою визуальные стили в ресурсы в dll). Кажется, так работает нормально. Я не слишком любезен с пакетами. - person Lobuno; 08.09.2011

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

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

person Richard Turner    schedule 05.01.2012