Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
ВнизКак послать сообщение всем комп-ам программы Найти похожие ветки
← →
Alecs (2003-01-20 12:43) [0]Есть острая необходимость послать сообщение ВСЕМ компонентам программы, как это можно реализовать????????????????
← →
Digitman (2003-01-20 12:50) [1]
> компонентам программы
Что подразумевается под "компонентами программы" ?
← →
gsu (2003-01-20 12:52) [2]BroadcastSystemMessage()
или
по всем формам: TForm.Broadcast();
← →
Alecs (2003-01-20 12:58) [3]"ВСЕМ компонентам" - это значит всем компонентам (контролам) на всех формах программы, Edits,Buttons и т.д.
BroadcastSystemMessage - не работает под NT.
TForm.Broadcast, а что более реального ничего нет?
← →
Calm (2003-01-20 13:10) [4]TForm.Broadcast() пошлет сообщения только тем компонентам, владельцем которых является форма.
Если я в run-time создам Button1, владельцем которой будет Panel1, то Button1 не получит сообщения.
Или я что-то путаю?
← →
Слесарь Матерящийся (2003-01-20 13:18) [5]EnumWindows(), SendMessage() в callback-процедуре
← →
Digitman (2003-01-20 13:22) [6]например, SendMessage(HWND_BROADCAST, ...)
единственное, что может осложнить сабж - подобный вызов реализует рассылку сообщения всем верхнеуровневым окнам в системе в целом, а не только в тек.процессе
← →
Calm (2003-01-20 13:26) [7]
> например, SendMessage(HWND_BROADCAST, ...)
Явно не то, о чем спрашивал автор вопроса.
> EnumWindows(), SendMessage() в callback-процедуре
Простите за безграмотность, но что-такое callback-процедура?
← →
Digitman (2003-01-20 13:29) [8]
> Calm
> Явно не то, о чем спрашивал автор вопроса.
И в чем твои принципиальные возражения ?
← →
Calm (2003-01-20 13:36) [9]2 Digitman © (20.01.03 13:29)
Во-первых, на всякий случай сразу скажу, что не хотел ни на кого наехать.
Во-вторых, по делу.
Спрашивали как " послать сообщение ВСЕМ компонентам программы"
Исхожу из того, что под компонентами подразумевались потомки TComponent, точнее, TWinControl.
Так вот, SendMessage(HWND_BROADCAST, ...) зашлет сообщения только главным окнам приложения, т.е. все контролы форм останутся без внимания.
← →
han_malign (2003-01-20 13:40) [10]Приватный метод 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.
← →
Digitman (2003-01-20 13:43) [11]
> Calm
Согласен. Вопрос был прочитан мной невнимательно.
← →
Calm (2003-01-20 13:54) [12]Итак, делаем вывод, что нельзя послать некое сообщение, сразу всем контролам приложения?
← →
Юрий Зотов (2003-01-20 14:28) [13]Нет, делаем вывод, что надо быть внимательнее:
han_malign © (20.01.03 13:40)
for I := 0 to Screen.FormCount - 1 do
Screen.Forms[I].Broadcast(...);
← →
Calm (2003-01-20 14:37) [14]
> Calm © (20.01.03 13:10)
> TForm.Broadcast() пошлет сообщения только тем компонентам,
> владельцем которых является форма.
> Если я в run-time создам Button1, владельцем которой будет
> Panel1, то Button1 не получит сообщения.
> Или я что-то путаю?
Так я путаю что-то или не путаю, и если путаю, то что?
← →
gsu (2003-01-20 14:53) [15]не путаешь, исходя из исходника Broadcast()
← →
gsu (2003-01-20 14:56) [16]BroadcastSystemMessage
Requires Windows NT 4.0 or later; Requires Windows 95 or later
← →
han_malign (2003-01-20 15:03) [17]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)
← →
han_malign (2003-01-20 15:15) [18]BroadcastSystemMessage - не работает под NT.
[ Now Supported on Windows NT]
- сам все время на этом покупаюсь :)))
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.01.30;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c