![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Цикл обработки сообщений Application [D7, WinXP]
parovoZZ © (2006-05-27 16:38:00)Здарова
Я посылаю сообщение
PostMessage (Handle, WM_MY, WM_OK, 0);
где Handle есть Application.Handle. Как теперь поймать Application-om эту мессагу? Форм нету, только DataModule.
parovoZZ (2006-05-28 00:48:00) [1]В [12] надо было добавить ProcessMessages (фича VCL?) и всё заработало. Ну а как быть только лишь с DataModule?
> Жуков Олег
Я понимаю. Поэтому при инициализации Dll я передаю Application.Handle для обратной связи. И кстати, dll на апях (ням ням, обожаю) - Application как таковой там отсутствует.
Жуков Олег (2006-05-28 00:38:00) [2]В DLL свой объект Application и Handle у него другой
parovoZZ (2006-05-27 22:59:00) [3]Ну хорошо. Всё-таки создал главну форму
procedure TMainForm.FormActivate(Sender: TObject);
begin
LoadSettings;
PostMessage (Application.Handle, WM_LOGIN, WM_OK, 0);
ExpandLevel (nil);
end;
Не ловится, хоть тресни.
parovoZZ (2006-05-27 21:42:00) [4]А чем отличается отлов сообщений из dll и из своего exe?
begin...end (2006-05-27 21:35:00) [5]> parovoZZ © (27.05.06 21:22) [9]
> Я хочу...
А все те посты, которые до этого -- это впустую потраченное время?
Будет нормальный конкретный вопрос -- будет и решение.
parovoZZ (2006-05-27 21:22:00) [6]А как быть? У datamodul -я нет хэндла, значит и сообщения отправлять некому.
Я хочу:
Запустить форму из dll, отловить из неё сообщение WM_MY с параметром wParam=WM_OK. Дальше подконнектиться к базе. Если СУБД пускает, значит начинаем грузить главную форму (а грузится она дооолго). Если нет - не грузим и ругаемся, а по желанию пользователя вообще завершаем работу. На апях всё просто, но форма в dll оказалась не подъёмной.
begin...end (2006-05-27 20:48:00) [7]> parovoZZ © (27.05.06 20:36) [7]
> Хорошо.
Нехорошо. Метод Run работает практически всё время, пока работает приложение -- он возвратит управление, когда программа будет завершаться (и цикл обработки сообщений уже закончится). И сообщение, посланное в коде [7], опять не обработается. В [5] Вы отправляли его и ожидали обработки, когда цикл выборки сообщений ЕЩЁ не работал, а в [7] Вы ожидаете, что сообщение обработается, когда цикл УЖЕ не работает.
parovoZZ (2006-05-27 20:36:00) [8]Хорошо.
Делаем так
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:29:00) [9]> parovoZZ © (27.05.06 20:11) [5]
> функция OnAppMessage молчит
Что и неудивительно. Потому что для того, чтобы передать сообщение в обработчик OnMessage, Application его сначала должно получить. А получить (извлечь из очереди сообщений) его оно сможет только после того, как заработает цикл выборки сообщений. Он запускается в методе Run, поэтому до тех пор, пока этот метод не начнёт исполняться, никакие сообщения в коде [5] обрабатываться не будут.
parovoZZ (2006-05-27 20:11:00) [10]Не ловиЦа.
Немного переделал
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 19:27:00) [11]> 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 18:51:00) [12]
> 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.
parovoZZ (2006-05-27 18:30:00) [13]Надыбал такой примерчик
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.
Не ловится. Только в моём случае всё происходит до создания главной формы.
begin...end (2006-05-27 16:42:00) [14]Application.OnMessage