Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.01.30;
Скачать: CL | DM;

Вниз

Как послать сообщение всем комп-ам программы   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.017 c
14-97031
khov
2003-01-13 19:17
2003.01.30
Компонент для работы с DBF


1-96817
Alexsys
2003-01-20 18:52
2003.01.30
Тащим файл на иконку - итог - приложение с открытым файлом?


4-97082
asdqwer
2002-12-15 08:49
2003.01.30
Как в WinRAR


14-97009
Дмитрий К.К.
2003-01-13 06:54
2003.01.30
Именинники 13 января


1-96714
SaperXL
2003-01-22 10:01
2003.01.30
TStringGrid - как отображать строки по центру ячейки