![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вот есть PostMessage и SendMessage
tippa © (2010-04-03 16:23:00)Вот есть PostMessage и SendMessage.
Правильно ли я мыслю?->
Первое ставит сообщение в очередь и код идет выполняться дальше, то есть
PostMessage(H,BM_CLICK,0,0);
//дальнейший код
Здесь "//дальнейший код" может быть выполнен до того, как нажмется кнопка. Если я хочу чтобы "//дальнейший код" выполнялся только после нажатия кнопки, я должен после PostMessage вставить Application.ProcessMesseges;
PostMessage(H,BM_CLICK,0,0);
Application.ProcessMesseges;
//дальнейший код
Функция SendMessage шлет сообщение сразу, то есть
SendMessage(H,BM_CLICK,0,0);
//дальнейший код
здесь "//дальнейший код" не начнет выполнятся пока не нажмется клаваша.
Получается что код
PostMessage(H,BM_CLICK,0,0);
Application.ProcessMesseges;
эквивалентен коду
SendMessage(H,BM_CLICK,0,0);
верно?
Leonid Troyanovsky (2010-04-06 13:56:00) [1]
> Игорь Шевченко © (06.04.10 12:07) [30]
> Логически очередь. Для сообщений от клавиатуры и мыши :)
Рихтер различает 4 очереди, хотя , возможно, что логически
она и одна, с различением приоритетов и флагов.
> Кстати, по поводу сообщений, ссылка на полезную статью
Полезно такое не забывать, спасибо.
--
Regards, LVT.
Игорь Шевченко (2010-04-06 12:07:00) [2]Anatoly Podgoretsky © (06.04.10 12:05) [29]
Логически очередь. Для сообщений от клавиатуры и мыши :)
Anatoly Podgoretsky (2010-04-06 12:05:00) [3]А логически?
Игорь Шевченко (2010-04-06 12:00:00) [4]Leonid Troyanovsky © (06.04.10 08:08) [27]
Очередь сообщений - это вовсе и не очередь, а куча разнообразных структур и флагов.
Кстати, по поводу сообщений, ссылка на полезную статью:
http://transl-gunsmoker.blogspot.com/2010/04/blog-post_05.html
Leonid Troyanovsky (2010-04-06 08:08:00) [5]
> Германн © (06.04.10 01:52) [25]
> Но даже и по небольшой могу поверить что очередь всё-таки
> есть. Перестраховка блин. :)
http://groups.google.com/group/fido7.su.win32.prog/browse_thread/thread/b71bc5c51698d898/03c765f2ac3694dd#03c765f2ac3694dd
--
Regards, LVT.
Германн (2010-04-06 01:54:00) [6]
> Суслик__ (05.04.10 21:08) [23]
>
> Я тоже регулярно PostMessage использую для посылки самому
> себе.
> Один из случаев описан выше Дмитрием.
>
Классический пример приводил ЮЗ. Ссылку не помню.
Германн (2010-04-06 01:52:00) [7]
> Anatoly Podgoretsky © (05.04.10 08:54) [22]
>
> > Германн (05.04.2010 02:03:21) [21]
>
> Откуда она вообще может взяться?
>
А х.з.
Но я точно знаю, что Леонид гораздо лучше знает матчасть чем я. Я сужу только по своей практике. Не очень большой увы.
Но даже и по небольшой могу поверить что очередь всё-таки есть. Перестраховка блин. :)
Anatoly Podgoretsky (2010-04-05 21:40:00) [8]> Суслик__ (05.04.2010 21:08:23) [23]
Из обработчиков OnCreate, OnActivate, OnShow нет другого метода
Суслик__ (2010-04-05 21:08:00) [9]Я тоже регулярно PostMessage использую для посылки самому себе.
Один из случаев описан выше Дмитрием.
Anatoly Podgoretsky (2010-04-05 08:54:00) [10]> Германн (05.04.2010 02:03:21) [21]
Откуда она вообще может взяться?
Германн (2010-04-05 02:03:00) [11]
> Leonid Troyanovsky © (04.04.10 07:23) [10]
>
>
> > Германн © (04.04.10 02:19) [9]
>
> > посланного через SendMessage будет выполнена сразу, даже
> > если в очереди сообщений сему окну на сей момент уже есть
> > другие сообщения.
>
> У синхронных сообщений своя очередь.
>
То же самое только в профиль. :)
Игорь Шевченко (2010-04-04 20:18:00) [12]Leonid Troyanovsky © (04.04.10 19:59) [19]
> И обновление списка не выполнится?
Выполнится, но форма будет показана после того, как. А пользователь жмет на кнопку и видит окно через какой-то интервал времени, у него возникает фрустрация.
> TForm.UpdateActions - там оно выполнится наверняка.
В этом случае фрустрация возникнет у программиста, читающего код :)
Leonid Troyanovsky (2010-04-04 19:59:00) [13]
> Дмитрий С © (04.04.10 17:03) [16]
> Я использую PostMessage(Handle, WM_USER+1, к примеру) собственной
> формы в обработчике OnShow. А в обработчике сообщения WM_USER+1
> выполняю код, который необходимо выполнить сразу после появления
> формы на экране, например, обновление списка.
> Игорь Шевченко © (04.04.10 19:12) [18]
> А в OnShow форма еще не видна.
И обновление списка не выполнится?
Ну, пусть так.
TForm.UpdateActions - там оно выполнится наверняка.
--
Regards, LVT.
Игорь Шевченко (2010-04-04 19:12:00) [14]Leonid Troyanovsky © (04.04.10 18:04) [17]
А в OnShow форма еще не видна.
Сравни поведение в двух случаях:
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
Sleep(3000);
end;
и
const
UM_SLEEP = WM_APP + 1;
type
TForm1 = class(TForm)
procedure FormShow(Sender: TObject);
private
procedure UmSleep (var Message: TMessage); message UM_SLEEP;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
PostMessage(Handle, UM_SLEEP, 0, 0);
end;
procedure TForm1.UmSleep(var Message: TMessage);
begin
Sleep(3000);
end;
Leonid Troyanovsky (2010-04-04 18:04:00) [15]
> Дмитрий С © (04.04.10 17:03) [16]
> Я использую PostMessage(Handle, WM_USER+1, к примеру) собственной
> формы в обработчике OnShow.
А чего б в OnShow коду не выполниться?
--
Regards, LVT.
Дмитрий С (2010-04-04 17:03:00) [16]
> Для однопоточного приложения нужда в посланиях собственным
> окнам весьма экзотична
Я использую PostMessage(Handle, WM_USER+1, к примеру) собственной формы в обработчике OnShow. А в обработчике сообщения WM_USER+1 выполняю код, который необходимо выполнить сразу после появления формы на экране, например, обновление списка.
Это как пример. Можно, конечно, первый OnIdle после OnShow обработать, но с сообщением, имхо проще и нагляднее.
Leonid Troyanovsky (2010-04-04 12:54:00) [17]
> Игорь Шевченко © (04.04.10 12:28) [14]
> Не понял. Обработка сообщений может касаться отдельных форм
> и какой смысл тащить весь этот огород в Application.OnIdle
Я про TApplicationEvents.
Все просто: кладешь на форму, и метод формы назначаешь.
Можно и в рантайм создать, обработчик - снова метод формы.
--
Regards, LVT.
Игорь Шевченко (2010-04-04 12:28:00) [18]Leonid Troyanovsky © (04.04.10 12:05) [13]
Не понял. Обработка сообщений может касаться отдельных форм и какой смысл тащить весь этот огород в Application.OnIdle ?
Leonid Troyanovsky (2010-04-04 12:05:00) [19]
> Игорь Шевченко © (04.04.10 11:42) [12]
> Ну почему же ? Для реализации паттерна "сделай что-то там,
> только потом, но не забудь".
Все уже сделано до нас: TApplicationEvents.OnIdle.
--
Regards, LVT.
Игорь Шевченко (2010-04-04 11:42:00) [20]Leonid Troyanovsky © (04.04.10 09:23) [11]
> Для однопоточного приложения нужда в посланиях собственным
> окнам весьма экзотична
Ну почему же ? Для реализации паттерна "сделай что-то там, только потом, но не забудь".