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

Вниз

Вопрос сложный. Если кто разбирается, посмотрите.   Найти похожие ветки 

 
Aldor   (2002-09-22 19:09) [0]

Имеется проект (без формы) и одним 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"ы).???!?!?!??!?!


 
Polevi ©   (2002-09-22 19:22) [1]

ну а где DispatchMessage ?


 
Polevi ©   (2002-09-22 19:25) [2]

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


 
Polevi ©   (2002-09-22 19:38) [3]

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


 
Polevi ©   (2002-09-22 19:48) [4]

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

repeat
HandleMessage
until Terminated;


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

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


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

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


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

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


 
Suntechnic ©   (2002-09-23 07:12) [8]

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


 
Polevi ©   (2002-09-23 10:41) [9]

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


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

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


 
Polevi ©   (2002-09-24 09:06) [11]

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


 
Polevi ©   (2002-09-24 09:11) [12]

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2002.11.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
14-21784
PVOzerski
2002-10-19 03:08
2002.11.07
о мыши Genius


14-21789
lutikh
2002-10-18 21:18
2002.11.07
Database Desktop по-русски


3-21368
mafiya
2002-10-17 12:01
2002.11.07
treeview и БД


3-21406
BoxTer
2002-10-16 20:33
2002.11.07
Знатокам FastReport


3-21413
vitnt2000
2002-10-18 08:55
2002.11.07
Как добавить к таблице новое поле и не убить данные?