Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "KOL";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Вниз

отобразить формы из 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 вся ветка

Форум: "KOL";
Текущий архив: 2006.10.15;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.044 c
15-1158757271
DelphiLexx
2006-09-20 17:01
2006.10.15
Структура будущей проги


3-1155066396
lexander
2006-08-08 23:46
2006.10.15
Почему не работает такой запрос?


2-1159543721
Dysan
2006-09-29 19:28
2006.10.15
Как сворачивать дополнительную форму?


3-1155991205
DancerMan
2006-08-19 16:40
2006.10.15
Ошибка при восстановлении базы данных


15-1158907204
Юрий
2006-09-22 10:40
2006.10.15
Потемнение на планете - сюжет НТВ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский