2011-09-07 81 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