Reputation: 1405
Using Delphi XE2, you have the option to embed custom styles (skins) to a VCL project.
Everything works fine. Now I have some forms into a separated dll that I show dynamically.
Of course those are not skinned. How can I rectify that?
I guess I must do some call to TVisualStyle somehow, but no luck.
The host:
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;
The 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.
Pretty standard stuff. Now, what exactly must be done to make the dll form use the host's style theme?
Upvotes: 5
Views: 2967
Reputation: 441
I had a lot of trouble with this and it was because I was using themes
rather than VCL.THEMES
and VCL.STYLES
.
Delphi was throwing up a customeStyleException
saying "style not found" or EcustomStyleException
"Feature not supported by this style"
Upvotes: 0
Reputation: 613592
You have two distinct instances of the VCL. You have set the style in the StyleServices
instance owned by the executable, but your DLL has no knowledge of that. You could solve this by either:
StyleServices
instance.Upvotes: 14