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

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

Вопрос сложный. Если кто разбирается, посмотрите. [D6, Win2k]


Aldor ©   (2002-09-22 19:09:00) 

Имеется проект (без формы) и одним DataModule"м. На нем компонент, не важно какой - сокет или Таймер, в общем, у которого есть события.
в проекте следующий код:

application.initializate;
application.CreateForm(TMyDataModule, MyDataModule);
CycleApplication;

Процедура CycleApplication предназначена для того, чтобы приложение не завершалось, а ждало событий.
Его код:

procedure Cycle_Application;
var
AppMessage: TMsg;
begin
while true do
begin
WaitMessage; //ждать сообщения
PeekMessage(AppMessage, Application.Handle, 0, 0, PM_REMOVE); {считывать его (и далее по идее смотреть мессаги и думеть что же с ними делать)}
end;
end;

Вот. Тем временем на событие компонента в ДатаМодуле описана своя процедура.
Так вот, проблема в том, что СОБЫТИЯ НЕ ПРОИСХОДЯТ!
Сообщения ловятся (DataModule, как я понимаю, я вляется application.FMainForm), а вот события непроисходят.
Как выйти из этого положения? (то есть так зациклить приложение, что бы оно обрабатывало event"ы).???!?!?!??!?!


Aldor   (2002-09-24 21:03:00) [1]

Спасибо ОГРОМНОЕ!! ВСЕМ!
И Polevi ©, и Suntechnic, и Юрию Зотову, вы все мне очень помогли. Спасибо!


Polevi   (2002-09-24 09:11:00) [2]

>... и тогда как этим окнам сообщение передиспатчить?
TMsg - HWND - оконная ф-ия
DispatchMessage именно этим и занимается


Polevi   (2002-09-24 09:06:00) [3]

не путай TWinControl и TComponent - Parent и Owner совершенно не одно и тоже
TDatamodule не наследует TWinControl, он не является окном Windows, соответственно не может получать сообщений


Aldor   (2002-09-23 20:38:00) [4]

2 2Aldor (23.09.02 04:29)
хм... а я всегда думал, что парентом у них является DataModule... и тогда как этим окнам сообщение передиспатчить?


Polevi   (2002-09-23 10:41:00) [5]

2Aldor (23.09.02 04:29)
TTimer и TClientSocket создают свои окна


Suntechnic   (2002-09-23 07:12:00) [6]

Кстати совсем необязательно использовать связку WaitMessage- PeakMessage. Обычно для этих целей используют просто GetMessage.


Suntechnic   (2002-09-23 07:05:00) [7]

Во-первых никто тебе не запрещает создать окно (необязательно его отображать) и ассоциировать цикл обработки сообщений с этим окном. Во-вторых можно и окно не создавать, а просто запустить цикл обработки сообщений, передав вторым параметром ф-ции GetMessage ноль. В таком случае завершить этот цикл можно путём вызова PostThreadMessage и сообщения WM_QUIT.


Aldor   (2002-09-23 04:29:00) [8]

Получается, если он не является FMainForm, диспатчить не кому! Диспатч ведь диспатчит сообщение в процедуру обработки сообщений окна, то есть явно не DataModule. Таким образом и Handlemessage не подойдет, там тоже транслит и диспатч.


Юрий Зотов   (2002-09-22 21:06:00) [9]

DataModule НЕ является Аpplication.FMainForm. Поскольку модуль данных вообще не является формой. Это только в design-time он показывается подобно форме - чтобы на него можно было чего-то набросать. А в run-time он ведет себя совсем иначе и никаких окон не создает.


Polevi   (2002-09-22 19:48:00) [10]

вот это место я имею в виду, если ты конечно смотрел код борланда

repeat
HandleMessage
until Terminated;


Polevi   (2002-09-22 19:38:00) [11]

и чем тебя Application.Run не устраивает ?


Polevi   (2002-09-22 19:25:00) [12]

PS
сообщение пришло в очередь потока, теперь нужно диспетчировать его нужному окну - таймера или клиентсокета


Polevi   (2002-09-22 19:22:00) [13]

ну а где DispatchMessage ?


Наверх

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