![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Еще раз про немодальную форму из DLL
DmiSb © (2005-11-07 15:09:00)Уважаемые мастера !!! Понимаю, что уже было много раз, но так и не получается. Если пишу так :
//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-09 12:47:00) [1]>Интересный эффект получился с минимизацией в главную форму.
Да эффект интересный, но если последовательно минимизировать сначала форму основного приложения, а потом немодальную форму, при восстановлении основной формы, значка свернутой немодальной формы не будет. Тогда наверное проще запретить минимизацию формы основного приложения.
Vladimir Kladov (2005-11-09 12:21:00) [2]сюда http://bonanzas.rinet.ru/Demo2NonModalFormsDLL.zip
не так файл называется
Vladimir Kladov (2005-11-09 12:00:00) [3]добавил сюда http://bonanzas.rinet.ru/Demo2NonModalForms.zip39K - с изменениями. Интересный эффект получился с минимизацией в главную форму.
DmiSb (2005-11-09 09:16:00) [4]2 MTsv DN
Огромное спасибо за пример.
Честно говоря, даже и не подозревал, что через потоки проще.
Я пытался, как в VCL, из DLL посылать сообщения, обратно в приложение. Вроде сообщение обрабатывается, но опять же после FreeLibrary почему-то закрывалось все приложение.
2 Vladimir Kladov
Этот пример обязательно в Демы надо.
MTsv DN (2005-11-09 08:21:00) [5]Привет...
Все понял...
Скачай проект: http://www.uus4u.com/download/modules/KOLnMCK/plugins.rar
Я не утверждаю, что это единственно правильное (если вообще правильное решение)... Но это единственное, что пршло в голову "навскидку"...
С Уважением MTsv DN
DmiSb (2005-11-09 07:21:00) [6]2 MTsv DN
>пока форму из DLL не закроешь дальше не пойдешь
Форма немодальная - значит я могу создать форму из ДЛЛ и не закрывая её
перейти в основное приложение и запустить всю процедуру второй раз, либо этой же процедурой, изменив только название ДЛЛ, создать форму из другой ДЛЛ. До FreeLibrary(FHandle); я при этом не дохожу.
А вот теперь собственно вопрос, как корректно выгрузить ДЛЛ, если я не буду это делать в вышеописанной процедуре ?
MTsv DN (2005-11-08 14:54:00) [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-08 13:50:00) [8]Решил побеспокоить еще раз.
Если из приложения одной и той же процедурой, загружаются формы из разных ДЛЛ, типа
procedure TfrmMain.Button1Click(Sender: PObj);
var
RunForm : procedure (App: THandle);
FHandle: THandle;
begin
FHandle := LoadLibrary(PChar('run_')); //здесь меняем имя ДЛЛ
....
то, сразу делать
if FHandle <> 0 then
FreeLibrary(FHandle);
как-то не хорошо, так как FHandle может быть от другой ДЛЛ .
Как в этом случае передать в приложение, что я закрыл какую-либо форму в ДЛЛ, чтобы выгрузить именно эту ДЛЛ ?
То есть получается, как приложение с плагинами.
Заранее спасибо.
DmiSb (2005-11-08 11:00:00) [9]2 Vladimir Kladov
Да, демо посмотрел очень внимательно, но там пример для модальной формы, а мне нужна именно немодальная. Хорошо бы положить для начинающих и такой пример.
2 MTsv DN
Спасибо за помощь.
Действительно вся загвоздка оказалась, в неправильном показе формы , а именно вместо
MainF.Form.Show;
надо делать
Run(MainF.Form);
MTsv DN (2005-11-08 09:24:00) [10]P.S.
Опечатка:FHandle := LoadLibrary(PChar('run_'))-->FHandle := LoadLibrary(PChar(' Run_Form'))
С Уважением MTsv DN
MTsv DN (2005-11-08 09:22:00) [11]Привет...
Вот код 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
Vladimir Kladov (2005-11-08 09:21:00) [12]а демо смотрели?
DmiSb (2005-11-08 08:17:00) [13]И-та-а-а-к ?