Форум: "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.047 c