Главная страница
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.059 c
14-1089455445
guest_Dmitry
2004-07-10 14:30
2004.08.01
Подскажите, как избавиться


14-1089511255
Думкин
2004-07-11 06:00
2004.08.01
С днем рождения! 11июля


1-1090416561
Dima_Delphi
2004-07-21 17:29
2004.08.01
Как ресайзить картинку в имейдже??


1-1089447086
PenguinX
2004-07-10 12:11
2004.08.01
Выравнивание текста в StringGrid.


1-1089870421
Pavelkq
2004-07-15 09:47
2004.08.01
Страшные тормоза при работе программы.