Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];




Вниз

Поток -> DLL -> модальная форма. Как закрыть ее? 


Nicolas_   (2002-04-18 11:16) [0]

В главной программе при нажатии на кнопку SB1 создается поток, который грузит DLL. В ней вызывается функция
procedure PluginExecute(ah: LongWord; cp: TComPort);
begin
OldApp := Application.Handle;
Application.Handle := ah;
FormControl := TFormControl.Create(Application);
with FormControl do begin
ComPort1 := cp;
ShowModal;//главное модальное окно плагина
Free;
end;
Application.Handle := OldApp;
end;

которая показывает модальное окно.
Закрываю его так: жмем снова на SB1, вызывается функция из DLL

procedure PluginClose;
begin
PostMessage(FormControl.Handle, WM_CLOSE, 0, 0);//сообщение
//главному окну плагина
end;

соответсвенно модальное окно закрывается, поток выгружает DLL и завершается. При этом все хоккей.
_НО_ если мы из этого модального окна вызовем другое модальное (например для настройки опций), то при нажатии на кнопку SB1 для выгрузки ничего не происходит. Я понимаю, что сообщение шлется главному окну плагина, а торчит модальное окно опций и пока его не закроешь (окно опций) главное окно не получит сообщений. Посоветуйте пожалуйста, как в этом случае закрывать главное модальное окно плагина?



Digitman   (2002-04-18 11:33) [1]

Непонятно, на кой нужно такое "модальное" окно, которое можно преспокойно закрыть (по инициативе пользователя) из кода хост-процесса, не дождавшись корректного завершения модального диалога.

Но, уж если ты так решил, то просто посылай WM_CLOSE модальному окну настроек опций плагина перед тем как посылать WM_CLOSE главному окну плагина



Nicolas_   (2002-04-18 15:11) [2]

1. Все плагины могут работать одновременно. Для этого используются потоки. Поток заканчивает работу когда выполнит функцию Execute. Чтобы этого не произошло раньше времени, используется модальное окно. Можно конечно делать так:

procedure TPluginThread.Execute;
var PluginExecute: TPluginExecute;
begin
libHandle := LoadLibrary(PN);
try
if libHandle <> 0 then begin
@PluginExecute := GetProcAddress (libHandle, "PluginExecute");
if @PluginExecute <> nil then
PluginExecute(Application.Handle, ComPort1);//это и есть
//вызов окна Show (а не ShowModal)
//если окно не модальное, то сделаем цикл
repeat
//пустой цикл
until (not Terminated);
end;
finally
FreeLibrary(libHandle);
end;
end;

но не знаю, правильно ли это.

2. Если посылать WM_CLOSE модальному окну опций плагина, то надо быть уверенным, что оно существует. Но дело в том, что если окно не существует/не создавалось, то (FormOptions <> nil) = TRUE и даже Assigned(FormOptions) не показывает реальной ситуации. Как быть?



Nicolas_   (2002-04-18 15:13) [3]

1. Все плагины могут работать одновременно. Для этого используются потоки. Поток заканчивает работу когда выполнит функцию Execute. Чтобы этого не произошло раньше времени, используется модальное окно. Можно конечно делать так:

procedure TPluginThread.Execute;
var PluginExecute: TPluginExecute;
begin
libHandle := LoadLibrary(PN);
try
if libHandle <> 0 then begin
@PluginExecute := GetProcAddress (libHandle, "PluginExecute");
if @PluginExecute <> nil then
PluginExecute(Application.Handle, ComPort1);//это и есть
//вызов окна Show (а не ShowModal)
//если окно не модальное, то сделаем цикл
repeat
//пустой цикл
until (not Terminated);
end;
finally
FreeLibrary(libHandle);
end;
end;

но не знаю, правильно ли это.

2. Чтобы посылать WM_CLOSE модальному окну опций плагина, то надо быть уверенным, что оно существует. Но дело в том, что если окно не существует/не создавалось, то (FormOptions <> nil) = TRUE и даже Assigned(FormOptions) не показывает реальной ситуации. Как быть?



Digitman   (2002-04-18 15:33) [4]

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




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.05.02;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.031 c
3-2497            Sam                   2002-04-11 17:23  2002.05.02  
MySQL and Delphi6


3-2460            step                  2002-04-10 23:35  2002.05.02  
Мастера, ПОМОГИТЕ! Как скрыть Scrool в RxDBGrig ?


14-2673           SPeller               2002-03-27 11:07  2002.05.02  
Вопрос не о Дельфи


6-2628            knyaz17               2002-02-15 16:53  2002.05.02  
КАК Загрузить в WebBrowser из потока файл *.MHT???


1-2508            ATLANTIDO             2002-04-19 21:18  2002.05.02  
Эмуляция нажатия на клавишу