Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-1147342176
Sergo
2006-05-11 14:09
2006.07.09
Роли в InterBase


3-1147316092
Express
2006-05-11 06:54
2006.07.09
Ошибка при открытие TDataSet


11-1128946067
BMouradov
2005-10-10 16:07
2006.07.09
Ошибка PBitMap, начиная с 2.13


2-1151056340
parovoZZ
2006-06-23 13:52
2006.07.09
А как лучше загрузить из dll уже загруженную dll?


15-1149844136
homm
2006-06-09 13:08
2006.07.09
Отладка JavaScript





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский