2011-09-07 43 views
5

使用Delphi XE2,您可以选择将自定义样式(皮肤)嵌入到VCL项目中。
一切工作正常。现在,我将一些表单转换为动态显示的分离的dll。
当然,这些都不是皮肤。我该如何纠正?如何将Delphi XE2皮肤应用于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窗体使用主机的风格主题,必须做些什么?

+0

你重新编译XE2的DLL“功能不受此样式支持”? –

+0

这是一个DLL而不是一个包? –

+0

是的。但它并没有选择原来的主题。 – Lobuno

回答

14

你有两个不同的VCL实例。您已经在可执行文件所拥有的实例中设置了样式,但您的DLL不知道这一点。您可以通过以下任一方式解决此问题:

  1. 将样式设置传递给DLL中的函数,将这些设置应用于其他StyleServices实例。
  2. 使用软件包以便您只有一个VCL实例。
+0

@Downvoter这个答案有什么问题? –

+5

+1,那些开车下山的人肯定会吸吮。 – Johan

+0

谢谢。然后我会将皮肤名称作为Pchar传递(并将视觉样式嵌入到dll中的资源中)。似乎正常工作。我对包装不太感兴趣。 – Lobuno

0

我有很多的麻烦,这一点,是因为我是用themes而不是VCL.THEMESVCL.STYLES

德尔福抛出了customeStyleException说“的风格未找到”或EcustomStyleException

相关问题