Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.01;
Скачать: CL | DM;

Вниз

Закрытие модальной формы.   Найти похожие ветки 

 
CTAPbIi   (2004-07-14 15:32) [0]

Из основной формы приложения я открываю модальную форму по методу
Form2.ShowModal. В событии OnActivate модальной формы я запускаю некий процесс (получение файлов по FTP), по окончании которого форма должна закрываться без вмешательства пользователя. Но использование Form2.Close не приводит к закрытию формы. Я вышел из положения, поставив на форму таймер, включив его по окончании моего процесса и в событии OnTimer закрываю форму. Однако, скорее всего есть более простое и нормальное решение вопроса. Подскажите, если есть. Спасибо


 
Reindeer Moss Eater ©   (2004-07-14 15:33) [1]

ModalResult := mr....;


 
KSergey ©   (2004-07-14 15:49) [2]

> CTAPbIi   (14.07.04 15:32)
> Но использование Form2.Close не приводит к закрытию формы.

Чета обман какой-то.. код, плиз


 
CTAPbIi   (2004-07-14 15:52) [3]

Не помогает, писал я ModalResult := mrOk. Но ничего не происходит. Форма остается открытой


 
CTAPbIi   (2004-07-14 15:53) [4]


procedure TForm2.FormActivate(Sender: TObject);
begin
 .....
 Form2.Close;
end;


 
Reindeer Moss Eater ©   (2004-07-14 15:55) [5]

Опять нагромождение взаимозависимых обработчиков событий и других подпорок там, где нужен линейный алгоритм безо всяких событий.


 
CTAPbIi   (2004-07-14 15:58) [6]


> Reindeer Moss Eater ©   (14.07.04 15:55) [5]
> Опять нагромождение взаимозависимых обработчиков событий
> и других подпорок там, где нужен линейный алгоритм безо
> всяких событий.

А можно, пожалуйста, немного поконретнее, что не так и как нужно сделать


 
KSergey ©   (2004-07-14 16:01) [7]

А, ну это да
В 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;


 
Reindeer Moss Eater ©   (2004-07-14 16:02) [8]

А можно, пожалуйста, немного поконретнее, что не так и как нужно сделать

не нужно пытаться закрыть форму пока FTP синхронно качает файл.
нужно после того.


 
CTAPbIi   (2004-07-14 16:08) [9]

> Reindeer Moss Eater ©   (14.07.04 16:02) [8]

Я и так закрывал форму после этого. И FTP тут не причем. Так как не срабатывает и без всякого FTP.

> KSergey ©   (14.07.04 16:01) [7]

Спасибо, все сработало. А то, что Form2 не надо писать, это я знаю. :-) (Но оно и не мешает)


 
VMcL ©   (2004-07-14 16:30) [10]

>>KSergey ©   (14.07.04 16:01) [7]

Зачем WM_USER? Можно сразу PostMessage (Handle, WM_CLOSE, 0, 0), если не ошибаюсь.


 
CTAPbIi   (2004-07-14 16:46) [11]

Да, можно и сразу. Спасибо


 
CTAPbIi   (2004-07-14 16:49) [12]

Кстати, а как объяснить, что Close  не закрывает форму (немодальную закрывает), и надо действовать через PostMessage?


 
KSergey ©   (2004-07-14 18:10) [13]

> [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.


 
KSergey ©   (2004-07-14 18:12) [14]

> [12] CTAPbIi   (14.07.04 16:49)
> Кстати, а как объяснить, что Close  не закрывает форму (немодальную
> закрывает),

Закрывает, отменно
Но не в FormCreate и не в FormActivate, и не в FormShow.
Короче только после прогона всех сообщений, характерных для создания виндовского окна.


 
Piter ©   (2004-07-14 22:38) [15]

Странно что никто не заметил...

Я вот че подумал... какого хрена автору топика нужна такая форма? Она не успевает появится на экран как тут же зависает (ясен пень, что прием у него реализован с помощью блокирующих сокетов), а как только отвиснет - тут же закрывается... и нафига такая красивая форма нужна? :)


 
KSergey ©   (2004-07-15 09:50) [16]

> [15] Piter ©   (14.07.04 22:38)

Обычная заставка "Не мешайте... программа выполняет важную работу..."


 
Piter ©   (2004-07-15 14:21) [17]

KSergey ©   (15.07.04 9:50) [16]

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


 
Anatoly Podgoretsky ©   (2004-07-15 14:24) [18]

А что тут форма то делает?


 
CTAPbIi   (2004-07-15 14:44) [19]

Ничего не зависает. На форме отображается статус пересылки файлов по FTP. Но поскольку команда на это выдается из основной формы, то соединение и передачу информации я поместил в Activate модальной формы. Сейчас все работает, все отображается и ничего не зависает


 
CTAPbIi   (2004-07-15 14:47) [20]

То есть, действительно, визульно форма выполняет роль заставки (правда не статической, а динамической). Но между событием Activate и закрытием формы выполняются FTP операции.


 
Piter ©   (2004-07-18 20:49) [21]

CTAPbIi   (15.07.04 14:44) [19]
На форме отображается статус пересылки файлов по FTP. Но поскольку команда на это выдается из основной формы, то соединение и передачу информации я поместил в Activate модальной формы. Сейчас все работает, все отображается и ничего не зависает


чего-то ты не то говоришь. Недоговариваешь. Если ты поместил передачу информации в OnActivate и выполнение кода не выходит за пределы данной процедуры - то значит сокеты блокирующие и никакого обновления статуса не будет.

В общем, приведи код, который у тебя в OnActivate - с этого вообще надо было начинать, а не страдать фигней с postmessage


 
Piter ©   (2004-07-21 01:04) [22]

Ну так что? :)



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

Текущий архив: 2004.08.01;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.047 c
4-1087740038
Kluyg
2004-06-20 18:00
2004.08.01
Путь к папке Temp.


1-1089962162
BillyJeans
2004-07-16 11:16
2004.08.01
Ширина шрифта в точках...


3-1089279204
Sir John
2004-07-08 13:33
2004.08.01
конфигурация ODBC


14-1089300168
Рома_ДЖ
2004-07-08 19:22
2004.08.01
Подскажите как можно защитить прогу. от размножения


1-1090223846
DDDeN
2004-07-19 11:57
2004.08.01
Сложение даты/времени