Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > PageControl и форма из DLL


Автор: LordMadman 19.2.2011, 18:21
Есть главная форма и dll. Форма из dll вставляется в PageControl.
Проблема - после вставки формы, она не отображается. Появляется только, после перехода на другой TabSheet и возврата на TabSheet-родитель

Главный модуль:
процедура показа формы из dll
Код

procedure TMainForm.Button4Click(Sender: TObject);
begin
  with Forma do
   begin
     Parent := TabSheet1;
     Top := 0;
     Left := 0;
     Width := Parent.ClientWidth;
     Height := Parent.ClientHeight;
     Visible := True;
     Repaint;
     Refresh;
     Update;
     Invalidate;
   end;
  with TabSheet1 do
   begin
     Repaint;
     Refresh;
     Update;
     Invalidate;
   end;
end;


Код

 Forma: TForm;
...
procedure TMainForm.Button1Click(Sender: TObject);
begin
   DllHandle := LoadLibrary('ProjectDll');
   ProcAddr := GetProcAddress(DllHandle, 'ProvaChild');
   if ProcAddr <> nil then
   begin
      ProvaChild := ProcAddr;
      Forma := ProvaChild(Application,Self);
   end;
end;

Код из dll
Код

function ProvaChild(ParentApplication: TApplication; ParentForm: TForm): TForm; export; stdcall;
var
  DllProc: Pointer;             { Called whenever DLL entry point is called }

begin
   Application:=ParentApplication;

   Form1:=TForm1.Create(ParentForm);
   Form1.MyParentForm:=ParentForm;
   Form1.MyParentApplication:=ParentApplication;
   Result := Form1;
end;


Автор: Gwire 20.2.2011, 14:59
Попробу вместо "Visible := True;" вписать "Show;"
Разница не большая, но все же может BringToFront сотворит чудо (я не проверял).
Не один раз создавал формы из библиотек - такой как у тебя проблемы не было.
Код

Top := 0;
Left := 0;
Width := Parent.ClientWidth;
Height := Parent.ClientHeight;
// Можно заменить на 
Align = alClient;




Автор: LordMadman 23.2.2011, 09:26
Не помогает

Автор: Gwire 23.2.2011, 15:51
Я когда-то создавал пост: 
http://forum.vingrad.ru/act-ST/f-85/t-295957/view-findpost/p-2126138.html
Там все заработало. Пробуй через Handle окна. 

Автор: gesper 15.9.2014, 20:49
Новую тему создавать не стану, задам вопрос тут:
Q:Делается проект в Lazarus, по этому спрашиваю. В Delphi если создать dll и загнать в нее форму, то при вызове из основного приложения команды создания формы и попытки засунуть ее в компоненты pageControl все проходит нормально, или есть какие то шаманства с присвоением владельцев, родителей и т.п. ?

 У меня при попытке вызова
Код

 MyFormInspector.ManualDock(PageControl1)
 
вылетает сообщение
Цитата

control of class TTabsheet can't have control of class TFInspector as child

Не пойму как лечить. Проблема исключительно при вызове из dll.

Автор: drkot 16.9.2014, 14:43
Цитата(gesper @  15.9.2014,  21:49 Найти цитируемый пост)
есть какие то шаманства

есть шаманства. форма из длл имеет свой TApplication. 

На мой взгляд это не самое правильное решение с концепций языка.
Либо использовать пакеты, либо просто показывать форму как отдельное окно.

Добавлено через 4 минуты и 27 секунд
Цитата(gesper @  15.9.2014,  21:49 Найти цитируемый пост)
can't have control of class TFInspector as child

для того чтобы ошибка не возникала, нужно зарегистрировать класс TFInspector

Автор: gesper 16.9.2014, 15:04
Не прокатывает, либо я как то не так регистрирую.
Есть разница как регистрировать? Может пример.
Пробовал вызывать функцию программы, которая делает регистрацию класса из библиотеки.

Автор: Alexeis 16.9.2014, 17:59
  Дело скорее всего даже не в TApplication, а в RTTI . Возможно оно заработает если и программа и длл будут использовать общий набор пакетов. Имея общие пакеты получается общая реализация классов и общий RTTI . Если делать без пакетов, то при наложения нужно работать через WinAPI. Т.е. приваивать ParentWindow и все взаимодйствия осуществлять через хэндл окна. Но и это не избавит от возможных глюков. VCL обертка вокруг окон работает не здорово в длл. Там бывают чудеса при зажатии кнопки ALT, и некорректная обработка WM_SHOWWINDOW.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)