Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.008 c
3-96565
Леша
2003-01-10 14:45
2003.01.30
Помогите с поиском в базе данных


8-96881
Perez
2002-10-13 11:18
2003.01.30
Как сделать анимацию из спрайта


1-96842
hogo
2003-01-20 14:55
2003.01.30
TService


1-96802
REA
2003-01-17 16:08
2003.01.30
Печать картинки


1-96765
tulen
2003-01-22 17:31
2003.01.30
Отключение кнопки Delete





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский