Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.09.2010, 01:02   #1
godlsd
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 16
По умолчанию Закрытие основного процесса через dll

Есть основной модуль, перед отображением основной формы вызывается функция из dll, которая создаёт модальное(если не ошибаюсь - модальное, не закрыв которого, не получишь доступ к основному), это окошко представляет собой форму для подключения к серверу, меня волнует два вопроса связанных с закрытием программы. На форме подключения(которая создаётся dll-ой) есть кнопка закрытия программы (системные кнопочки убраны), если я добавляю PostQuitMessage или Application.Terminate, то закрывается форма подключения, а основная форма - нет. Но если я добавлю тоже самое в эвент OnCloseQuery, то главная форма закрывается.
Вопрос 1:
Как совершить полноценное закрітие программі через Button.
Вопрос 2:
Как избежать полу секундного отображения главной формы, перед полным закрытием программы? (это происходит при Application.Terminate на onCloseQuery.
godlsd вне форума Ответить с цитированием
Старый 02.09.2010, 02:03   #2
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Почему бы просто не вернуть управление из функции, указав, что пользователь указал закрытие приложения? А уж вызывающий сам разберётся, как ему лучше закрываться. Может я вашу DLL из консольной программы вызываю?

Насчёт задержки - я не вижу, откуда она у вас возникает. По-хорошему, её надо бы исправлять, если это возможно. На худой конец - скрыть форму (Hide) перед закрытием.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 02.09.2010, 12:34   #3
godlsd
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 16
По умолчанию

Есть проблема, как я поменяю свойство Hide основной формы, если я её не вижу из dll'ки, В C++, например, можно передать handle основного модуля и закрыть/скрыть его (модуль), а здесь как?
godlsd вне форума Ответить с цитированием
Старый 02.09.2010, 12:44   #4
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ну и здесь вы можете передать или саму форму (объект) или дескиптор окна. Но вопрос не в этом. Зачем вам вообще передавать форму и скрывать её? Что если я вызываю вашу DLL из консольной программы? У меня и окна-то никакого нет.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 02.09.2010, 12:51   #5
godlsd
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 16
По умолчанию

Ок, закрою я приложение, в зависимости от того что ткнет User, вопрос второй, как же всё таки правильно передать Handle формы, чтобы скрыть её? Было бы хорошо с примером кода... Буду очень признателен!
godlsd вне форума Ответить с цитированием
Старый 02.09.2010, 13:15   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
godlsd
В DLL процедурой вызывается модальное окно так? Оно вызывается методом ShowModal так? Сама ShowModal является функцией возвращающей модальный результат. Таким образом опиши функцию в ДЛЛ
Код:
function Okno:TModalResult;
begin
 ...
 Result:=Форма.ShowModal;
 ...
end;
Далее на этой модальной форме ты по кнопкам что-то выполняешь и закрываешь, так?
Тогда в кликах кнопок пиши
Код:
 ModalResult:=mrOk;// Это для кнопки Окей
 ...
 ModalResult:=mrCancel;// Это для кнопки отмены
эти строки закроют окно вернув указанные тобой результат модальности, который вернет функция okno твоей проге и:
Код:
 if okno=mrCancel then Application.Terminate
т.е. завершай прогу при возвращении Cancel результата из модального окна.
Ферштеен?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.09.2010, 17:55   #7
godlsd
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 16
По умолчанию

С закрытием всё понятно, а когда вы описали в коде, всё стало ещё проще... (спасибо за код огромное). Сейчас больше волнует как в функции "ShowModal" обеспечить скрытие главной формы, что бы после закрытия модального окна юзер не увидел его одинарное мерцание перед захлопыванием.
godlsd вне форума Ответить с цитированием
Старый 02.09.2010, 18:15   #8
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Опять вы за своё.

Ну не надо вам в ShowModal закрывать главную форму! Не надо. Вам уже три раза сказали (два - я, один - Stilet). Вы "да-да, понятно" - и заново: "а закрыть-то как"?

Вы лучше скажите, что непонятно-то?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 02.09.2010, 23:53   #9
godlsd
Пользователь
 
Регистрация: 05.03.2010
Сообщений: 16
По умолчанию

Наверное вы что-то не до поняли, что бы вернуть результат главной форме, надо схлопнуть модальное окно, иначе не произойдет возврат из функции. В итоге, как только схлопывается модальное окно, тут же отображается главное, и пока дойдёт до обработки результата модального окна, оно светится, вот так. Может конечно я чего-то не допераю...
Объясните пожалуйста!
godlsd вне форума Ответить с цитированием
Старый 03.09.2010, 00:53   #10
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

А, теперь понятно.

Правда, не понятно ( ) при этом, откуда у вас эта задержка? Модальное окно закрывается мгновенно. Функция возвращает результат тоже мгновенно. Соответственно, главное приложение (с главным окном) реагирует тоже мгновенно:

Код:
if okno = mrCancel then  // 1
begin
  Application.MainForm.Hide;      // 2
  Application.Terminate;
end;
Между пунктами 1 и 2 вроде как нет никаких препятствий. Откуда тогда у вас задержка?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
закрытие чужого процесса Dimon Win Api 7 12.05.2010 12:01
[DLL] Загрузка и выгрузка dll в/из чужого процесса Человек_Борща Win Api 4 28.02.2010 17:47
Сбой обновления основного вайла, патч отменен. Сбой CRC основного файла. Naruto63 Помощь студентам 2 21.10.2009 20:28
Закрытие ветви процесса SauronX Win Api 2 07.02.2009 16:18
Удаление/закрытие процесса Djaconda Win Api 2 13.06.2008 13:11