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

Вниз

Событие/сообщение в DLL, автоматически обрабатываемое в main   Найти похожие ветки 

 
bvn123   (2006-08-16 17:47) [0]

Здравствуйте.
Хочу в DLL организовать событие ev=TEvent по окончании приема данных, в основную программу передавать, например, ev.handle. Как организовать в осн.программе обработчик события, имея handle, без явного написания цикла не знаю.

Получается, что такая организация не будет отличаться от следующей: установки флага в DLL, после считывания в цикле установленного флага его сброс (такой вариант сделан).

Пробую передавать и принимать Windows Message в простой программе
сообщение Wm_Form обрабатывается (обработчик объявлен в TForm1=class(TForm)), сообщение Wm_Ev нет (обработчик объявлен в TMyEv=class(TObject)).
Подскажите, пожалуйста, в чем ошибка? Спасибо.


unit UEvent;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, Spin;

const   WM_Form = WM_USER + 300;
       WM_ev   = WM_USER + 301;
type
 TMyEv = class(TObject)
 public
    procedure WmEv(var Msg: TMessage); message WM_ev;
 end;

 TForm1 = class(TForm)
   memo: TMemo;
   se: TSpinEdit;
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
    procedure WmReady(var Msg: TMessage); message WM_Form;
 public
   ev:TMyEv;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Timer1Timer(Sender: TObject);
begin
se.Value:=se.Value+1;
if se.Value mod 10=0 then PostMessage(Handle, WM_Form, 0, 0);
if se.Value mod 23=0 then PostMessage(Handle, WM_ev, 0, 0);
end;

procedure TForm1.WmReady(var Msg: TMessage);
begin
Form1.memo.Lines.Strings[0]:=Form1.memo.Lines.Strings[0]+"f";
end;

procedure TMyEv.WmEv(var Msg: TMessage);
begin
Form1.memo.Lines.Strings[0]:=Form1.memo.Lines.Strings[0]+"e";
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Application.ProcessMessages;
ev:=TMyEv.Create;
end;

end.


 
clickmaker ©   (2006-08-16 18:06) [1]

у TObject нет цикла обработки сообщений


 
bvn123   (2006-08-16 18:17) [2]

цитата:
clickmaker ©   (16.08.06 18:06) [1]
у TObject нет цикла обработки сообщений

Посоветуйте, как изменить листинг?
вместо TObject пробовал TComponent и TControl - результат тот же


 
clickmaker ©   (2006-08-16 18:24) [3]

а зачем тебе отдельный объект, если ты в нем все равно обращаешься к Form1.memo.Lines?


 
Сергей М. ©   (2006-08-17 08:22) [4]


> bvn123   (16.08.06 18:17) [2]


> PostMessage(Handle, WM_ev, 0, 0);


Сообщение ты посылаешь окну формы, а принимать и обрабатывать его почему-то должен совсем другой объект, к тому же вообще не создающий окна.
И как понимать это ?


 
Наиль ©   (2006-08-17 13:54) [5]

Как вариант.
К примеру, функция Run должна активировать передачу данных и сообщить о завершении, тогда лучше её оформить так:
procedure Run(EventProc:TEventProc);
здесь
TEventProc=procedure(Handle:THandle);
Работа будет выглядеть так:
procedure Event(Handle:THandle);
begin
что-нибудь
end;

begin
...
Run(Event)
...
end;


соответственно, cам Run будет выглядеть так:
procedure Run(EventProc:TEventProc);
begin
Передача данных
EventProc(1);
end;


В качестве второго способа, могу предложить обратить внимание на
Application.HookMainWindow в сочетании с Application.Handle


 
bvn123   (2006-08-18 12:26) [6]

Спасибо за ответы.
Попробую разобраться с предложением Наиля.

Clickmaster: "а зачем тебе отдельный объект, если ты в нем все равно обращаешься к Form1.memo.Lines?"
Пытаюсь организовать сообщение или событие для объекта без визуального отображения (без окна), обращаюсь к Form1.memo лишь для индикации того, что обработка сообщения произошла.

Сергей М:"Сообщение ты посылаешь окну формы, а принимать и обрабатывать его почему-то должен совсем другой объект, к тому же вообще не создающий окна."
Попробую использовать визуальный компонент, например, TPanel со свойством visible:=false, с передачей сообщения ему, если не выйдет - новую форму, также с visible:=false

Спасибо.


 
clickmaker ©   (2006-08-18 12:29) [7]


> Пытаюсь организовать сообщение или событие для объекта без
> визуального отображения

тогда в корне не верно использовать PostMessage, поскольку она работает только для окон.
Если у тебя есть невизуальный объект, то либо напрямую к нему обращайся либо организуй поток с циклом выборки сообщений PeekMessage или GetMessage. А отправить сообщение потоку можно через PostThreadMessage


 
bvn123   (2006-08-18 12:57) [8]

Еще раз спасибо за подсказку,
создал вторую форму с visible:=false, передавая сообщение ей:
PostMessage(Form2.handle, WM_ev, 0, 0);
Обработчик сообщения функционирует.


 
Сергей М. ©   (2006-08-18 13:01) [9]

А callback чем не устраивает ?


 
Наиль ©   (2006-08-18 13:03) [10]

Если написать так:
PostMessage(Application.handle, WM_ev, 0, 0);
а приём организовать через Application.HookMainWindow, то вторая форма не понадобится.
Application.HookMainWindow - регистрирует твою процедуру, которая должна обрабатывать сообщения приходящие приложению (Application)


 
Ketmar ©   (2006-08-18 13:04) [11]

> [8] bvn123   (18.08.06 12:57)
памяти не жалко? и ресурсов?


 
Наиль ©   (2006-08-18 13:06) [12]


> А callback чем не устраивает ?

Я подозреваю, что в dll организован поток, иначе достаточно было бы дождаться завершения процедуры из dll (в моём примере Run). В таком случае PostMessage выгоднее.


 
Сергей М. ©   (2006-08-21 09:13) [13]


> подозреваю, что в dll организован поток


Ну и что ?
Чем плох колбэк в доп.потоке ?



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

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

Наверх




Память: 0.5 MB
Время: 0.047 c
15-1157720133
Dbn
2006-09-08 16:55
2006.10.01
Куда идет человечество?


10-1122298074
Oleg_
2005-07-25 17:27
2006.10.01
com без регистрации в реестре


2-1158224284
Rolf
2006-09-14 12:58
2006.10.01
Список записей.


15-1157708241
SerJaNT
2006-09-08 13:37
2006.10.01
Звуки


8-1141976188
Unitay
2006-03-10 10:36
2006.10.01
Как узнать время bitrate...