Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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 даст гарантию существования экз-ра мод.формы



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

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

Наверх









Память: 0.57 MB
Время: 0.016 c
14-2672
Сержик
2002-03-27 08:18
2002.05.02
Как обозвать компоненты по-русски?


6-2637
Андре
2002-01-31 14:26
2002.05.02
Vypress Chat


4-2710
skywalker
2002-02-27 11:50
2002.05.02
Окно в потоке


1-2507
ilia2000
2002-04-20 21:10
2002.05.02
Есть просьба.


4-2727
JAndrey
2002-02-28 07:11
2002.05.02
Как запустить и остановить Скрин Сервер?





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