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

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

Как послать сообщение всем комп-ам программы [D5]


Alecs ©   (2003-01-20 12:43:00) 

Есть острая необходимость послать сообщение ВСЕМ компонентам программы, как это можно реализовать????????????????


han_malign   (2003-01-20 15:15:00) [1]

BroadcastSystemMessage - не работает под NT.
[ NowSupported on Windows NT]
- сам все время на этом покупаюсь :)))


han_malign   (2003-01-20 15:03:00) [2]

Calm © (20.01.03 14:37)
да, действительно, не обратил внимания
procedure TWinControl.Broadcast(var Message);
var
I: Integer;
begin
for I := 0 to ControlCount - 1 do
begin
Controls[I]. WindowProc(TMessage(Message));
if TMessage(Message).Result <> 0 then Exit;
end;
end;
:(((
тогда могу посоветовать только что-нибудь из этого:

procedure TWinControl.CMDialogKey(var Message: TCMDialogKey);
begin
Broadcast(Message);
end;

procedure TWinControl.CMDialogChar(var Message: TCMDialogChar);
begin
Broadcast(Message);
end;

procedure TWinControl.CMFocusChanged(var Message: TCMFocusChanged);
begin
Broadcast(Message);
end;

соответственно Screen.Forms[I].Perform(...) - с CM_DialogKey, CM_DialogChar, CM_FocusChanged, по всем WinControl-ам точно пройдет
- но это IMHO криво... - придется какую-нибудь хитрую комбинацию клавиш забивать(не используемую системой, TCMDialogKey=TCMDialogChar=TWMKey)


gsu   (2003-01-20 14:56:00) [3]

BroadcastSystemMessage
Requires Windows NT 4.0 or later; Requires Windows 95 or later


gsu   (2003-01-20 14:53:00) [4]

не путаешь, исходя из исходника Broadcast()


Calm   (2003-01-20 14:37:00) [5]


> Calm © (20.01.03 13:10)
> TForm.Broadcast() пошлет сообщения только тем компонентам,
> владельцем которых является форма.
> Если я в run-time создам Button1, владельцем которой будет
> Panel1, то Button1 не получит сообщения.
> Или я что-то путаю?

Так я путаю что-то или не путаю, и если путаю, то что?


Юрий Зотов   (2003-01-20 14:28:00) [6]

Нет, делаем вывод, что надо быть внимательнее:
han_malign © (20.01.03 13:40)
for I := 0 to Screen.FormCount - 1 do
Screen.Forms[I].Broadcast(...);



Calm   (2003-01-20 13:54:00) [7]

Итак, делаем вывод, что нельзя послать некое сообщение, сразу всем контролам приложения?


Digitman   (2003-01-20 13:43:00) [8]


> Calm


Согласен. Вопрос был прочитан мной невнимательно.


han_malign   (2003-01-20 13:40:00) [9]

Приватный метод TApplication:
procedure TApplication.NotifyForms(Msg: Word);
var
I: Integer;
begin
for I := 0 to Screen.FormCount - 1 do Screen.Forms[I].Perform(Msg, 0, 0);
end;

так что по аналогии:
for I := 0 to Screen.FormCount - 1 do Screen.Forms[I].Broadcast(...);

З.Ы. А для WinAPI, к сожалению, для всех функций: HWND_BROADCAST - The message is posted to all top-level windows in the system, including disabled or invisible unowned windows, overlapped windows, and pop-up windows. The message is not posted to child windows.


Calm   (2003-01-20 13:36:00) [10]

2 Digitman © (20.01.03 13:29)

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

Во-вторых, по делу.
Спрашивали как " послать сообщение ВСЕМ компонентампрограммы"
Исхожу из того, что под компонентами подразумевались потомки TComponent, точнее, TWinControl.
Так вот, SendMessage(HWND_BROADCAST, ...) зашлет сообщения толькоглавным окнам приложения, т.е. все контролы форм останутся без внимания.


Digitman   (2003-01-20 13:29:00) [11]


> Calm



> Явно не то, о чем спрашивал автор вопроса.


И в чем твои принципиальные возражения ?


Calm   (2003-01-20 13:26:00) [12]


> например, SendMessage(HWND_BROADCAST, ...)

Явно не то, о чем спрашивал автор вопроса.


> EnumWindows(), SendMessage() в callback-процедуре

Простите за безграмотность, но что-такое callback-процедура?


Digitman   (2003-01-20 13:22:00) [13]

например, SendMessage(HWND_BROADCAST, ...)
единственное, что может осложнить сабж - подобный вызов реализует рассылку сообщения всем верхнеуровневым окнам в системе в целом, а не только в тек.процессе


Слесарь Матерящийся   (2003-01-20 13:18:00) [14]

EnumWindows(), SendMessage() в callback-процедуре


Calm   (2003-01-20 13:10:00) [15]

TForm.Broadcast() пошлет сообщения только тем компонентам, владельцем которых является форма.
Если я в run-time создам Button1, владельцем которой будет Panel1, то Button1 не получит сообщения.
Или я что-то путаю?


Alecs   (2003-01-20 12:58:00) [16]

"ВСЕМ компонентам" - это значит всем компонентам (контролам) на всех формах программы, Edits,Buttons и т.д.

BroadcastSystemMessage - не работает под NT.
TForm.Broadcast, а что более реального ничего нет?


gsu   (2003-01-20 12:52:00) [17]

BroadcastSystemMessage()
или
по всем формам: TForm.Broadcast();


Digitman   (2003-01-20 12:50:00) [18]


> компонентам программы


Что подразумевается под "компонентами программы" ?


Наверх

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