Главная страница
    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.011 c
1-1148908777
AFfonya
2006-05-29 17:19
2006.07.09
CMD.EXE выполение произвольной команды


9-1124984956
Dgt
2005-08-25 19:49
2006.07.09
Формулы Opengl


2-1151081404
Зм1й
2006-06-23 20:50
2006.07.09
Вопросы по регистрации расширения


2-1150978238
Delphi basic
2006-06-22 16:10
2006.07.09
Имя компьютера


2-1151031762
nickhilo
2006-06-23 07:02
2006.07.09
Компонент RichEdit с полноценной поддержкой формата RTF.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский