Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.035 c
14-1090067265
cyborg
2004-07-17 16:27
2004.08.01
Налёт марсиан :)


1-1090402235
ekap
2004-07-21 13:30
2004.08.01
Значение ячейки памяти


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


1-1090212946
Valeri
2004-07-19 08:55
2004.08.01
Image


11-1078207875
Solik
2004-03-02 09:11
2004.08.01
ListView





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