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

Вниз

Цикл обработки сообщений Application   Найти похожие ветки 

 
parovoZZ ©   (2006-05-27 16:38) [0]

Здарова

Я посылаю сообщение
PostMessage (Handle, WM_MY, WM_OK, 0);

где Handle есть Application.Handle. Как теперь поймать Application-om эту мессагу? Форм нету, только DataModule.


 
begin...end ©   (2006-05-27 16:42) [1]

Application.OnMessage


 
parovoZZ ©   (2006-05-27 18:30) [2]

Надыбал такой примерчик

program Project1;

uses
 Forms,
 Unit1 in "UNIT1.PAS" { Form1 },
 Messages, WinTypes, WinProcs,

{$R *.RES}

var
 OldWndProc: TFarProc;

function NewWndProc(hWndAppl: HWnd; Msg, wParam: Word; lParam: Longint):
 Longint; export;
begin
 { default WndProc return value }
 Result := 0;
 { handle messages here; the message number is in Msg }
 Result := CallWindowProc(OldWndProc, hWndAppl, Msg, wParam, lParam);
end;

begin
 Application.CreateForm(TForm1, Form1);
 OldWndProc := TFarProc(GetWindowLong(Application.Handle, GWL_WNDPROC));
 SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(@NewWndProc));
 Application.Run;
end.



Не ловится. Только в моём случае всё происходит до создания главной формы.


 
parovoZZ ©   (2006-05-27 18:51) [3]


> begin...end ©   (27.05.06 16:42) [1]
> Application.OnMessage

пишу

begin
 Application.Initialize;
 Application.Title := "Operative Journal";
 Application.CreateForm (TDMd, DMd);
 Application.OnMessage := MyWndProc;  <-- ошибка incopatible types
 DataModule.DMd.Login (Application.Handle);
 Application.CreateForm (TMainForm, MainForm);
 Application.Run;
end.


 
begin...end ©   (2006-05-27 19:27) [4]

> parovoZZ ©   (27.05.06 18:30) [2]
> Надыбал такой примерчик...

Теперь надыбайте его обратно.

> parovoZZ ©   (27.05.06 18:51) [3]

Я должен догадаться, как объявлена MyWndProc?

procedure OnAppMessage(Self: TObject; var Msg: TMsg; var Handled: Boolean);
begin
 if Msg.message = WM_MY then
   ...
end;

var
 M: TMethod;

begin
 ...
 M.Data := Application;
 M.Code := @OnAppMessage;
 Application.OnMessage := TMessageEvent(M);
 ...
end


 
parovoZZ ©   (2006-05-27 20:11) [5]

Не ловиЦа.

Немного переделал

begin
 Application.Initialize;
 Application.Title := "Operative Journal";
 Application.CreateForm (TDMd, DMd);
 Method.Data := Application;
 Method.Code := @OnAppMessage;
 Application.OnMessage := TMessageEvent (Method);
 PostMessage (Application.Handle, WM_MY, WM_OK, 0); <-- отправляем, функция OnAppMessage молчит.
 //DataModule.DMd.Login (Application.Handle);
 Application.CreateForm (TMainForm, MainForm);
 Application.Run;
end.


 
begin...end ©   (2006-05-27 20:29) [6]

> parovoZZ ©   (27.05.06 20:11) [5]

> функция OnAppMessage молчит

Что и неудивительно. Потому что для того, чтобы передать сообщение в обработчик OnMessage, Application его сначала должно получить. А получить (извлечь из очереди сообщений) его оно сможет только после того, как заработает цикл выборки сообщений. Он запускается в методе Run, поэтому до тех пор, пока этот метод не начнёт исполняться, никакие сообщения в коде [5] обрабатываться не будут.


 
parovoZZ ©   (2006-05-27 20:36) [7]

Хорошо.

Делаем так

begin
 Application.Initialize;
 Application.Title := "Operative Journal";
 Application.CreateForm (TDMd, DMd);
 Application.Run;
 Method.Data := Application;
 Method.Code := @OnAppMessage;
 Application.OnMessage := TMessageEvent (Method);
 
 PostMessage (Application.Handle, WM_LOGIN, WM_OK, 0);
end.


Мимо всё пролетает, даже без оглядки на PostMessage.


 
begin...end ©   (2006-05-27 20:48) [8]

> parovoZZ ©   (27.05.06 20:36) [7]

> Хорошо.

Нехорошо. Метод Run работает практически всё время, пока работает приложение -- он возвратит управление, когда программа будет завершаться (и цикл обработки сообщений уже закончится). И сообщение, посланное в коде [7], опять не обработается. В [5] Вы отправляли его и ожидали обработки, когда цикл выборки сообщений ЕЩЁ не работал, а в [7] Вы ожидаете, что сообщение обработается, когда цикл УЖЕ не работает.


 
parovoZZ ©   (2006-05-27 21:22) [9]

А как быть? У datamodul -я нет хэндла, значит и сообщения отправлять некому.

Я хочу:

Запустить форму из dll, отловить из неё сообщение WM_MY с параметром wParam=WM_OK. Дальше подконнектиться к базе. Если СУБД пускает, значит начинаем грузить главную форму (а грузится она дооолго). Если нет - не грузим и ругаемся, а по желанию пользователя вообще завершаем работу. На апях всё просто, но форма в dll оказалась не подъёмной.


 
begin...end ©   (2006-05-27 21:35) [10]

> parovoZZ ©   (27.05.06 21:22) [9]

> Я хочу...

А все те посты, которые до этого -- это впустую потраченное время?

Будет нормальный конкретный вопрос -- будет и решение.


 
parovoZZ ©   (2006-05-27 21:42) [11]

А чем отличается отлов сообщений из dll и из своего exe?


 
parovoZZ ©   (2006-05-27 22:59) [12]

Ну хорошо. Всё-таки создал главну форму

procedure TMainForm.FormActivate(Sender: TObject);
begin
LoadSettings;
PostMessage (Application.Handle, WM_LOGIN, WM_OK, 0);
ExpandLevel (nil);
end;


Не ловится, хоть тресни.


 
Жуков Олег   (2006-05-28 00:38) [13]

В DLL свой объект Application и Handle у него другой


 
parovoZZ ©   (2006-05-28 00:48) [14]

В [12] надо было добавить ProcessMessages (фича VCL?) и всё заработало. Ну  а как быть только лишь с DataModule?


> Жуков Олег


Я понимаю. Поэтому при инициализации Dll я передаю Application.Handle для обратной связи. И кстати, dll на апях (ням ням, обожаю) - Application как таковой там отсутствует.



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

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

Наверх




Память: 0.5 MB
Время: 0.049 c
15-1150093514
alex-drob
2006-06-12 10:25
2006.07.09
SQL LEFT JOIN


2-1150808603
resuS
2006-06-20 17:03
2006.07.09
Альтернатива strtoint в Паскле?


15-1149942229
Victor_Mw
2006-06-10 16:23
2006.07.09
Время работы проги в Delphi - Console Application??


15-1149796046
Google_fanat
2006-06-08 23:47
2006.07.09
Паника, googlepages.com не работает.


15-1150106759
Tirael
2006-06-12 14:05
2006.07.09
калькулятор