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

Вниз

Еще раз про немодальную форму из DLL   Найти похожие ветки 

 
DmiSb   (2005-11-07 15:09) [0]

Уважаемые мастера !!! Понимаю, что уже было много раз, но так и не получается. Если пишу так :

//DLL

procedure Run(App: THandle); export;

...

procedure Run(App: THandle);
begin
 Applet:=NewApplet("");
 Applet.Hide;
 SetParent(Applet.GetWindowHandle, App);
 NewMainF(MainF, Applet);
 MainF.Form.Show;
end;

При закрытии формы, закрывается все приложение
Переделал

 ...
 Applet:=nil;
 MainF.Form.Show;
end;

Теперь при закрытии вываливается ошибка

Из приложения вызываю форму так

TRun=procedure(App: THandle);stdcall;

var FHandle: THandle;
 FRun: TRun;
begin
 FHandle:=0;
 FHandle:=LoadLibrary(PChar(FFileName));
 if FHandle>0 then begin
   FRun:=GetProcAddress(FHandle, "Run");
   if @FRun<>nil then
     FRun(Applet.Handle);
 end;
end;

И еще никак не соображу куда теперь прилепить FreeLibrary ?

Заранее спасибо


 
DmiSb   (2005-11-08 08:17) [1]

И-та-а-а-к ?


 
Vladimir Kladov   (2005-11-08 09:21) [2]

а демо смотрели?


 
MTsv DN   (2005-11-08 09:22) [3]

Привет...

Вот код DLL:
library Run_Form;
uses Kol, Windows, Messages;

procedure RunForm(App: THandle);
var
MainF : PControl;
begin
Applet:=NewApplet("");
SetParent(Applet.GetWindowHandle, App);
MainF := NewForm(Applet, "Run_");
Run(MainF);
end;

exports
 RunForm name "RunForm";

begin
end.


А вот код вызова формы:
procedure TfrmMain.Button1Click(Sender: PObj);
var
RunForm : procedure (App: THandle);
FHandle: THandle;
begin
FHandle := LoadLibrary(PChar("run_"));
if FHandle>0 then begin
  RunForm := GetProcAddress(FHandle, "RunForm");
  if @RunForm <> nil then
    RunForm(Applet.Handle);
end;
if FHandle <> 0 then
 FreeLibrary(FHandle);
end;


Думаю проблем быть не должно... Использую: KOLnMCK 2.21 + Delphi 7 + Windows XP SP2...

С Уважением MTsv DN


 
MTsv DN   (2005-11-08 09:24) [4]

P.S.
Опечатка:  FHandle := LoadLibrary(PChar("run_")) --> FHandle := LoadLibrary(PChar("Run_Form"))

С Уважением MTsv DN


 
DmiSb   (2005-11-08 11:00) [5]

2 Vladimir Kladov
 
Да, демо посмотрел очень внимательно, но там пример для модальной формы, а мне нужна именно немодальная. Хорошо бы положить для начинающих и такой пример.

2 MTsv DN

Спасибо за помощь.
Действительно вся загвоздка оказалась, в неправильном показе формы , а именно вместо  
 MainF.Form.Show;
надо делать
 Run(MainF.Form);


 
DmiSb   (2005-11-08 13:50) [6]

Решил побеспокоить еще раз.
Если из приложения одной и той же процедурой, загружаются формы из разных ДЛЛ, типа

procedure TfrmMain.Button1Click(Sender: PObj);
var
RunForm : procedure (App: THandle);
FHandle: THandle;
begin
FHandle := LoadLibrary(PChar("run_")); //здесь меняем имя ДЛЛ
....

то, сразу делать

 if FHandle <> 0 then
   FreeLibrary(FHandle);

как-то не хорошо, так как FHandle может быть от другой ДЛЛ .

Как в этом случае передать в приложение, что я закрыл какую-либо форму в ДЛЛ, чтобы выгрузить именно эту ДЛЛ ?
То есть получается, как приложение с плагинами.

Заранее спасибо.


 
MTsv DN   (2005-11-08 14:54) [7]

Если честно, вопроса не понял... :(
Поэтому повторюсь...
procedure TfrmMain.Button1Click(Sender: PObj);
var
RunForm : procedure (App: THandle);
FHandle: THandle;
begin
FHandle := LoadLibrary(PChar(FULL_DLL_PATH)); // Здесь загружается твоя DLL
if FHandle <> 0 then                                      // Проверка успешного открытия
 begin
  RunForm := GetProcAddress(FHandle, "RunForm"); // Получаешь адрес процедуры
  if @RunForm <> nil then                                  // Проверка
   RunForm(Applet.Handle);                                // Запуск процедуры создания формы, пока форму из DLL не закроешь дальше не пойдешь
  FreeLibrary(FHandle);                                     // закрытие библиотеки
 end;
end;

В чем вопрос-то?..

С Уважением MTsv DN


 
DmiSb   (2005-11-09 07:21) [8]

2 MTsv DN

>пока форму из DLL не закроешь дальше не пойдешь

Форма немодальная - значит я могу создать форму из ДЛЛ и не закрывая её
перейти в основное приложение и запустить всю процедуру второй раз, либо этой же процедурой, изменив только название ДЛЛ, создать форму из другой ДЛЛ. До FreeLibrary(FHandle); я при этом не дохожу.
А вот теперь собственно вопрос, как корректно выгрузить ДЛЛ, если я не буду это делать в вышеописанной процедуре ?


 
MTsv DN   (2005-11-09 08:21) [9]

Привет...

Все понял...
Скачай проект: http://www.uus4u.com/download/modules/KOLnMCK/plugins.rar
Я не утверждаю, что это единственно правильное (если вообще правильное решение)... Но это единственное, что пршло в голову "навскидку"...

С Уважением MTsv DN


 
DmiSb   (2005-11-09 09:16) [10]

2 MTsv DN

Огромное спасибо за пример.
Честно говоря, даже и не подозревал, что через потоки проще.
Я пытался, как в VCL, из DLL посылать сообщения, обратно в приложение. Вроде сообщение обрабатывается, но опять же после FreeLibrary почему-то закрывалось все приложение.

2 Vladimir Kladov
Этот пример обязательно в Демы надо.


 
Vladimir Kladov   (2005-11-09 12:00) [11]

добавил сюда http://bonanzas.rinet.ru/Demo2NonModalForms.zip 39K - с изменениями. Интересный эффект получился с минимизацией в главную форму.


 
Vladimir Kladov   (2005-11-09 12:21) [12]

сюда http://bonanzas.rinet.ru/Demo2NonModalFormsDLL.zip
не так файл называется


 
DmiSb   (2005-11-09 12:47) [13]

>Интересный эффект получился с минимизацией в главную форму.

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



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

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

Наверх





Память: 0.48 MB
Время: 0.052 c
6-1144164046
WebSqlNeederr
2006-04-04 19:20
2006.08.20
Как отловить, что часть документа загружена?


2-1154009086
Ega23
2006-07-27 18:04
2006.08.20
Визуализация длительной загрузки


15-1153604106
Германн
2006-07-23 01:35
2006.08.20
Скушно!


4-1145909672
Volf_555
2006-04-25 00:14
2006.08.20
Как отправить программе комбинацию клавиш?!


2-1154497995
ExCode
2006-08-02 09:53
2006.08.20
форматирование кода delphi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский