Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.15;
Скачать: CL | DM;

Вниз

отобразить формы из dll   Найти похожие ветки 

 
Bezols   (2005-12-20 15:24) [0]

Добрый день!
Никак не могу отобразить форму из dll на панели в приложении

для VCL у меня есть пример, там все работает.
В KOL не получается...
просто форма из dll выскакивает, но не на панели в приложении


 
BaryVetaL ©   (2005-12-20 15:47) [1]

Смотри примеры на сайте bonanzas.rinet.ru


 
Bezols   (2005-12-20 16:08) [2]

смотрел примеры, нет там такого, есть только отображение формы из dll

при загрузке формы из dll получаю хендл этой формы
потом делаю SetParent(полученный хендл формы, Panel1.Handle);

ничего не выходит, форма отображается отдельно

может что ниправильно делаю?


 
ECM ©   (2005-12-20 16:36) [3]


> может что ниправильно делаю?

... ага, даже с пишете с ашипками :))

Я делал иначе  - при (или перед) вызове формы из Dll передавал ей хендл
панели (HostWND => Panel1.Handle) и вызвал SetParent до запуска цикла обработки сообщений в форме Dll:

{MyDllForm.pas}
...
   if HostWND = 0 then NewDllForm( DllForm, Applet);
   else begin
     NewDllForm(DllForm,Applet);
     SetParent(DllForm.Form.Handle,HostWND);
     DllForm.Form.ClsStyle := DllForm.Form.ClsStyle or CS_PARENTDC;
   end;
   Run(Applet);


 
Bezols   (2005-12-20 17:43) [4]

вот делал так..

{uMain.pas}
...
interface
...
function RunForm( SenderHandle: THandle ): Integer;
...

implementation
....

function RunForm(SenderHandle: THandle): Integer;
var
InitForm : procedure (AHandle: THandle);
FHandle: THandle;
begin
FHandle := LoadLibrary(PChar("library.dll"));
if FHandle <> 0 then
 begin
  InitForm := GetProcAddress(FHandle, "InitForm");
  if @InitForm <> nil then
   InitForm(Form1.Panel1.Handle);
  FreeLibrary(FHandle);
 end;
end;

...
procedure TForm1.Button1Click(Sender: PObj);
var
 xHandle: THandle;
begin
 xHandle:= RunForm(Panel1.Handle);
end;

далее
{library.dll}
...
function initPlugin(App: THandle): Thandle;   stdcall;
....

function initPlugin(App: THandle): Thandle;   stdcall;
begin
Applet := NewApplet("Dll applet");
SetParent(Form1.Form.Handle, App);
Form1.Form.ClsStyle := Form1.Form.ClsStyle or CS_PARENTDC;
NewForm1(Form1, Applet);
Run(Applet);
end;

вообщем форма при вызове из приложения появляется, но просто как форма...
а не на панели :(
а при закрытии программы вываливается пара ошибок... и приложение закрывается


 
ECM ©   (2005-12-20 18:28) [5]

Хех... а что же Вы хотели? Как написали так и работает. У Вас SetParent работает по невыделенной памяти (как только не падает всё сразу?) - т.е. вхолостую.
Вы невнимательно читали [3]

function initPlugin(App: THandle): Thandle;   stdcall;
begin
 Applet := NewApplet("Dll applet");
 NewForm1(Form1, Applet);
 SetParent(Form1.Form.Handle, App);
 Form1.Form.ClsStyle := Form1.Form.ClsStyle or CS_PARENTDC;  
 //NewForm1(Form1, Applet);
 Run(Applet);
end;


 
Bezols   (2005-12-21 00:49) [6]

сделал так

{модуль программы}

procedure TForm1.Button1Click(Sender: PObj);
var
 RunForm : function (AHandle: THandle): THandle; stdcall;
 FHandle, xHWND: THandle;
begin
FHandle := LoadLibrary(PChar("dll\dll.dll"));
if FHandle <> 0 then
 begin
  RunForm := GetProcAddress(FHandle, "RunForm");
  if @RunForm <> nil
    then  begin
            xHWND:= RunForm(Panel1.Handle);
          end
  else FreeLibrary(FHandle);
 end;
end;


{модуль библиотеки}

function RunForm(App: THandle): THandle; stdcall;
...
implementation
...
function RunForm(App: THandle): THandle; stdcall;
begin
Applet := NewApplet("");
NewForm1(Form1, Applet);
SetParent(Form1.Form.Handle, App);
Form1.Form.ClsStyle := Form1.Form.ClsStyle or CS_PARENTDC;
result:= Form1.Panel1.Handle;
Form1.Form.Show;
end;

форма из dll отображается на панели главной приложения, которое загружает dll. Чтобы не было заголовка у формы из dll, я отключил системное меню и рамку окна. Теперь форма из dll нормально отображается на панели, но... если нажать мышкой на элементы формы из dll, то главная форма теряет фокус, если нажать мышкой на элементы главной формы, то форма получает фокус. Вообщем то жить можно, но не приятно, когда форма мигает заголовком.

И если я закрываю приложение, то вываливаются две ошибки AV...
Ну ошибки вываливаются потому что, в конце функции RunForm из dll я не сделал Run(Applet), а сделал  Form1.Form.Show, для того чтобы продолжала работать основная программа, а если написать Run(Applet), то основная программа перестает работать пока открыта фома из dll

Как сделать так, чтобы на панели главной формы отображалось содержимое формы из dll и не было миганий заголовка главного окна, программа корректно закрывалась

вот как сделано на VCL http://p2ktools.nm.ru/PluginExmp.rar
а вот как я пытался сделать http://p2ktools.nm.ru/app.rar



Страницы: 1 вся ветка

Текущий архив: 2006.10.15;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.038 c
2-1159191901
svt
2006-09-25 17:45
2006.10.15
Мастера, подскажите как сделать так, чтобы с DBGrid работал


2-1159451950
шаааа
2006-09-28 17:59
2006.10.15
TObject(Sender) / Sender


10-1124468571
APXi
2005-08-19 20:22
2006.10.15
Способ вставки в Excel


15-1159206509
KingLion
2006-09-25 21:48
2006.10.15
MS FrameWork 1.1 SDK


1-1157332401
Viacheslav
2006-09-04 05:13
2006.10.15
Чтобы сообщения клавы получала только форма?