![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как послать сообщение всем комп-ам программы [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]
> компонентам программы
Что подразумевается под "компонентами программы" ?