Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.10.01;
Скачать: [xml.tar.bz2];

Вниз

Событие/сообщение в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.014 c
2-1158224284
Rolf
2006-09-14 12:58
2006.10.01
Список записей.


15-1157823580
Другой
2006-09-09 21:39
2006.10.01
Мечты сбываются?


15-1157952168
Ega23
2006-09-11 09:22
2006.10.01
С Днём рождения! 11 сентября


9-1136242899
aleccc
2006-01-03 02:01
2006.10.01
opengl


1-1155121635
Mishenka
2006-08-09 15:07
2006.10.01
TGifImage не хочет конвертировать файл...





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