Используя 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 использовала тему стиля хоста?
Form.Release
. Это отправляет сообщение в очередь сообщений приложения, и это сообщение не будет обработано до тех пор, пока поток не обработает сообщения, что произойдет только после того, как после функция DLL вернется к вызывающей стороне. Вызывающий выгружает DLL, так что теперь вы застряли в очереди с сообщением, адресованным окну, которое все еще существует, но код которого уже выгружен из памяти. Вместо этого позвонитеFree
.Release
используется, когда объект хочет освободиться из одного из своих собственных обработчиков сообщений. - person Rob Kennedy   schedule 07.09.2011