Форум: "Основная";
Текущий архив: 2006.07.09;
Скачать: [xml.tar.bz2];
ВнизЦикл обработки сообщений 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.01 c