Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 2640|回复: 1

Lazarus 下让非可视化组件(类)截获事件的方法(转)

[复制链接]

该用户从未签到

发表于 2013-1-24 20:00:09 | 显示全部楼层 |阅读模式
  • unit uMessageTest;  
  •   
  • {$mode objfpc}{$H+}  
  •   
  • interface  
  •   
  • uses  
  •   Windows, LMessages, Classes, SysUtils, FileUtil, Forms, Controls, Graphics,  
  •   Dialogs, StdCtrls, ExtCtrls, InterfaceBase;  
  •   
  • const  
  •   WM_MYMESSAGE = WM_USER + 1;  
  •   
  • type  
  •   
  •   { TFrmMessageTest }  
  •   
  •   TFrmMessageTest = class(TForm)  
  •     Button1: TButton;  
  •     Button2: TButton;  
  •     Timer1: TTimer;  
  •     procedure Button1Click(Sender: TObject);  
  •     procedure Button2Click(Sender: TObject);  
  •   private  
  •     { private declarations }  
  •   public  
  •     { public declarations }  
  •   end;  
  •   
  •   { TMyControls }  
  •   
  •   TMyControls = class(TWinControl)  
  •   protected  
  •     procedure WndProc(var Message: TLMessage); override;  
  •   public  
  •     procedure SendMsg;  
  •   end;  
  •   
  •   { TNon_Controls }  
  •   
  •   TNon_Controls = class(TObject)  
  •   private  
  •     procedure WndProc(var Message: TLMessage);  
  •   public  
  •     Hwd: HWND;  
  •     procedure SendMsg;  
  •     constructor Create;  
  •     destructor Destroy; override;  
  •   end;  
  •   
  • var  
  •   FrmMessageTest: TFrmMessageTest;  
  •   
  • implementation  
  •   
  • { TNon_Controls }  
  •   
  • procedure TNon_Controls.WndProc(var Message: TLMessage);  
  • begin  
  •   if Message.msg = WM_MYMESSAGE then  
  •      ShowMessage('截获非可视自定义事件!')   ;  
  •   Message.msg := 0;  
  • end;  
  •   
  • procedure TNon_Controls.SendMsg;  
  • begin  
  •   PostMessage(Hwd, WM_MYMESSAGE, 0, 0);  
  • end;  
  •   
  • constructor TNon_Controls.Create;  
  • begin  
  •   if Hwd = 0 then  //WidgetSet需引用InterfaceBase  
  •      Hwd := WidgetSet.AllocateHWnd(@WndProc);  
  • end;  
  •   
  • destructor TNon_Controls.Destroy;  
  • begin  
  •   if Hwd <> 0 then begin  
  •      WidgetSet.DeallocateHWnd(Hwd);  
  •      Hwd := 0;  
  •   end;  
  •   inherited Destroy;  
  • end;  
  •   
  • { TFrmMessageTest }  
  •   
  • procedure TFrmMessageTest.Button1Click(Sender: TObject);  
  • var  
  •   mycon: TMyControls;  
  • begin  
  •   mycon := TMyControls.Create(Self);  
  •   mycon.Parent := Self;  
  •   mycon.Visible := False;  
  •   mycon.SendMsg;  
  • end;  
  •   
  • procedure TFrmMessageTest.Button2Click(Sender: TObject);  
  • var  
  •   mycon: TNon_Controls;  
  • begin  
  •   mycon := TNon_Controls.Create;  
  •   mycon.SendMsg;  
  • end;  
  •   
  • {$R *.lfm}  
  •   
  • { TMyControls }  
  •   
  • procedure TMyControls.WndProc(var Message: TLMessage);  
  • begin  
  •   if Message.msg = WM_MYMESSAGE then  
  •      ShowMessage('截获自定义事件!')  
  •   else  
  •      inherited WndProc(Message);  
  • end;  
  •   
  • procedure TMyControls.SendMsg;  
  • begin  
  •   PostMessage(Self.Handle, WM_MYMESSAGE, 0, 0);  
  • end;  
  •   
  • end.  

回复

使用道具 举报

该用户从未签到

 楼主| 发表于 2013-1-24 20:00:21 | 显示全部楼层
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 21:45 , Processed in 0.032600 second(s), 13 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表