![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закрытие модальной формы. [D4, Win95/98]
CTAPbIi © (2004-07-14 15:32:00)Из основной формы приложения я открываю модальную форму по методу
Form2.ShowModal. В событии OnActivate модальной формы я запускаю некий процесс (получение файлов по FTP), по окончании которого форма должна закрываться без вмешательства пользователя. Но использование Form2.Close не приводит к закрытию формы. Я вышел из положения, поставив на форму таймер, включив его по окончании моего процесса и в событии OnTimer закрываю форму. Однако, скорее всего есть более простое и нормальное решение вопроса. Подскажите, если есть. Спасибо
Piter (2004-07-21 01:04:00) [1]Ну так что? :)
Piter (2004-07-18 20:49:00) [2]CTAPbIi (15.07.04 14:44) [19]
На форме отображается статус пересылки файлов по FTP. Но поскольку команда на это выдается из основной формы, то соединение и передачу информации я поместил в Activate модальной формы. Сейчас все работает, все отображается и ничего не зависает
чего-то ты не то говоришь. Недоговариваешь. Если ты поместил передачу информации в OnActivate и выполнение кода не выходит за пределы данной процедуры - то значит сокеты блокирующие и никакого обновления статуса не будет.
В общем, приведи код, который у тебя в OnActivate - с этого вообще надо было начинать, а не страдать фигней с postmessage
CTAPbIi (2004-07-15 14:47:00) [3]То есть, действительно, визульно форма выполняет роль заставки (правда не статической, а динамической). Но между событием Activate и закрытием формы выполняются FTP операции.
CTAPbIi (2004-07-15 14:44:00) [4]Ничего не зависает. На форме отображается статус пересылки файлов по FTP. Но поскольку команда на это выдается из основной формы, то соединение и передачу информации я поместил в Activate модальной формы. Сейчас все работает, все отображается и ничего не зависает
Anatoly Podgoretsky (2004-07-15 14:24:00) [5]А что тут форма то делает?
Piter (2004-07-15 14:21:00) [6]KSergey © (15.07.04 9:50) [16]
ни фига. Пересылка то осуществляется в блокирующем режиме, значит, не будет времени даже обработать WM_PAINT, то есть форма просто зависнет. Ты не увидешь на ней ничего... так, может быть очертания формы максимум...
KSergey (2004-07-15 09:50:00) [7]> [15] Piter © (14.07.04 22:38)
Обычная заставка "Не мешайте... программа выполняет важную работу..."
Piter (2004-07-14 22:38:00) [8]Странно что никто не заметил...
Я вот че подумал... какого хрена автору топика нужна такая форма? Она не успевает появится на экран как тут же зависает (ясен пень, что прием у него реализован с помощью блокирующих сокетов), а как только отвиснет - тут же закрывается... и нафига такая красивая форма нужна? :)
KSergey (2004-07-14 18:12:00) [9]> [12] CTAPbIi (14.07.04 16:49)
> Кстати, а как объяснить, что Close не закрывает форму (немодальную
> закрывает),
Закрывает, отменно
Но не в FormCreate и не в FormActivate, и не в FormShow.
Короче только после прогона всех сообщений, характерных для создания виндовского окна.
KSergey (2004-07-14 18:10:00) [10]> [10] VMcL © (14.07.04 16:30)
> >>KSergey © (14.07.04 16:01) [7]
>
> Зачем WM_USER? Можно сразу PostMessage (Handle, WM_CLOSE,
> 0, 0), если не ошибаюсь.
В принципе оно конечно да. Вначале я так и зхотел написать.
Однако, а вдруг вызовем пресловутое ProcessMessages? Я, правда, не совсем уверен, закроет ли это форму или WM_CLOSE просто пропадет из очереди (а может и вообще все пройдет гладко, если в ProcessMessages WM_CLOSE не прокидывается), проверять надо.
Но мне мой вариант нравится больше, как-то однозначнее все... Однако аргументировать не смогу, если только с WM_CLOSE не возникет каких-либо проблем в случае применения ProcessMessages.
CTAPbIi (2004-07-14 16:49:00) [11]Кстати, а как объяснить, что Close не закрывает форму (немодальную закрывает), и надо действовать через PostMessage?
CTAPbIi (2004-07-14 16:46:00) [12]Да, можно и сразу. Спасибо
VMcL (2004-07-14 16:30:00) [13]>> KSergey © (14.07.04 16:01) [7]
Зачем WM_USER? Можно сразуPostMessage (Handle, WM_CLOSE, 0, 0), если не ошибаюсь.
CTAPbIi (2004-07-14 16:08:00) [14]> Reindeer Moss Eater © (14.07.04 16:02) [8]
Я и так закрывал форму после этого. И FTP тут не причем. Так как не срабатывает и без всякого FTP.
> KSergey © (14.07.04 16:01) [7]
Спасибо, все сработало. А то, что Form2 не надо писать, это я знаю. :-) (Но оно и не мешает)
Reindeer Moss Eater (2004-07-14 16:02:00) [15]А можно, пожалуйста, немного поконретнее, что не так и как нужно сделать
не нужно пытаться закрыть форму пока FTP синхронно качает файл.
нужно после того.
KSergey (2004-07-14 16:01:00) [16]А, ну это да
В FormActivate это дело не срабатывает
Советую сделать так (я так всегда делаю; в коде могут быть очепятки):
interface
TForm2 = class(TForm)
...
procedure WMUser (var Msg: TMessage); message WM_USER;
...
end;
implementation
procedure TForm2.WMUser (var Msg: TMessage);
begin
// собственно код, который выполняется после отображения формы
...
// ну и закрыть форму по окончании
Close; // никакое Form2 тут уже не надо!!)
end;
procedure TForm2.FormActivate (...);
begin
// покласть в конец очереди себе сообщение для старта собственного действия
PostMessage (Handle, WM_USER, 0, 0);
end;
CTAPbIi (2004-07-14 15:58:00) [17]
> Reindeer Moss Eater © (14.07.04 15:55) [5]
> Опять нагромождение взаимозависимых обработчиков событий
> и других подпорок там, где нужен линейный алгоритм безо
> всяких событий.
А можно, пожалуйста, немного поконретнее, что не так и как нужно сделать
Reindeer Moss Eater (2004-07-14 15:55:00) [18]Опять нагромождение взаимозависимых обработчиков событий и других подпорок там, где нужен линейный алгоритм безо всяких событий.
CTAPbIi (2004-07-14 15:53:00) [19]
procedure TForm2.FormActivate(Sender: TObject);
begin
.....
Form2.Close;
end;
CTAPbIi (2004-07-14 15:52:00) [20]Не помогает, писал я ModalResult := mrOk. Но ничего не происходит. Форма остается открытой