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