Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как закрыть форму из ее же метода ?


Juice ©   (2005-11-22 10:04:00) 

Как это правильно сделать, и возможно ли правильно это сделать ?  При вызове Self.Close вызывается PostMessage(Handle, CM_RELEASE, 0, 0), и получается, что если до выхода из метода где был вызван Close поток отвечающий за очередь сообщений прочитает эту очередь то произойдет сбой. Как выйти из этой ситуации ? Есть у меня на уме варианты через "Ж", типа таймер положить на другую форму и тому подобное. Может что-то подскажите ?


Digitman   (2005-11-22 12:03:00) [1]


> чтобы юзер увидел не два зависших окна а бегущий прогрессбар
> мне нужно обрабатывать очередь сообщений. Это аргумент ?
>


нет, не аргумент.

для обновления прогресс-бара достаточно вызвать его метод Update


Juice   (2005-11-22 11:47:00) [2]


> Я не знаю как в твоей версии хелпа, а в моей написано, что
> будут выполнены все сообщения, находящиеся в очереди сообщений
> до вызова release. А как этот текст в твоём хелпе выглядит
> мне глубоко фиолетово.

Ну и правильно что фиолетово, не хватало чтобы ты еще моим хэлпом грузился :) Самое главное что мне тоже фиолетово, причем фиолетово не как у тебя написано а как у меня, ибо к теме вопроса это совершенно не имеет никакого отношения.

> Представляешь, тебе отрезали язык, а потом заставили петь.

Представь, тебе отрезали кое-что другое, а потом заставили ...


Плохиш   (2005-11-22 11:40:00) [3]


> Juice ©   (22.11.05 11:35) [8]
> Больше слова before не встречал.

Я не знаю как в твоей версии хелпа, а в моей написано, что будут выполнены все сообщения, находящиеся в очереди сообщений довызова release. А как этот текст в твоём хелпе выглядит мне глубоко фиолетово.

> было бы удобнее сделать сам вызов до этого

Представляешь, тебе отрезали язык, а потом заставили петь.


Juice   (2005-11-22 11:36:00) [4]


> Anatoly Podgoretsky ©   (22.11.05 11:07) [7]
> Метод Release не является заменителем метода Close

Самое точное высказывание, давайте на нем остановимся.


Juice   (2005-11-22 11:35:00) [5]


> ну на кой ляд ProcessMessages-то вызывать в данном контексте
> ? поясни свою глубокую мысль ..

Мысль глубокая, согласен :) В метода формы1 я создаю форму2 (вдвоем они образуют диалог - т.е. сначала одна видна, потом вторая), создав ее выполняю длительные манипулции с интерфейсом - порядка двух секунд. В это время отображается прогрессбар. Вот в этом эпизоде чтобы юзер увидел не два зависших окна а бегущий прогрессбар мне нужно обрабатывать очередь сообщений. Это аргумент ? Да, конечно ведь никто не мешает сделать вызов Self.Close после инициации второй формы, что я и сделал, но в конертной ситуации (ест еще несколько моментов) было бы удобнее сделать сам вызов до этого.

> Плохиш ©   (22.11.05 11:03) [6]

Release returns immediately to the caller. It does not wait for the form to be freed before returning.

Больше слова before не встречал. Какое это отношение к теме имеет ? В хэлпе по сабжу толком нефига не сказано.


Anatoly Podgoretsky   (2005-11-22 11:07:00) [6]

Метод Release не является заменителем метода Close


Плохиш   (2005-11-22 11:03:00) [7]


> Juice ©   (22.11.05 10:28) [3]
>
> > см. TCustomForm.Release
>
> Сказки они там в хэлпе пишут.

Всё там правильно пишут, просто некоторые читать не умеют.

> Вот такой код приводит к Access violation после ProcessMessages

И этот случай описан. Слово " before" перевести?


Digitman   (2005-11-22 10:39:00) [8]


> Вот такой код приводит к Access violation после ProcessMessages


ну на кой ляд ProcessMessages-то вызывать в данном контексте ? поясни свою глубокую мысль ..


Juice   (2005-11-22 10:31:00) [9]


> > что если до выхода из метода где был вызван Close поток
>
> > отвечающий за очередь сообщений прочитает эту очередь
>
>
> А ты еще и в другом потоке Close вызываешь? Так, прекращай
> работу в этом постороннем потоке.

Поток один, точне их много но в этой кухне учавствует только главный.


Juice   (2005-11-22 10:28:00) [10]


> см. TCustomForm.Release

Сказки они там в хэлпе пишут. Во-первых метод Close как раз и вызывает внутри себя Release, а тот в свою очередь постит сообщение CM_RELEASE.

Вот такой код приводит к Access violation после ProcessMessages:

begin
...
Self.Release;
Application.ProcessMessages;
end;

Вот такой код работает нормально:

begin
...
Self.Release;
...До конца метода ProcessMessages не вызывается...
end;

Наверное этого не избежать. Спасибо за ответ.


evvcom   (2005-11-22 10:21:00) [11]


> что если до выхода из метода где был вызван Close поток
> отвечающий за очередь сообщений прочитает эту очередь

А ты еще и в другом потоке Close вызываешь? Так, прекращай работу в этом постороннем потоке.


Digitman   (2005-11-22 10:14:00) [12]

см. TCustomForm.Release


Наверх

Титульная страница Поиск, карта сайта Написать письмо