问题 : 一个Delphi的工程中包含一个 TDataModule , 在 TDataModule的OnCreate事件中有代码
ShowMessage(Sender.ClassName) ;请问 :Delphi 的编译器会不会把TDataModule的OnCreate事件映射成为操作系统的某种消息?
如果会 1.若 TDataModule 包含在客户端的工程中(生成EXE文件).
2.若 TDataModule 包含在服务器的工程中(生成DLL文件,封装了Com+组件).
以上两种情况,编译器会不会把OnCreate事件映射成为操作系统的同一种消息?
ShowMessage(Sender.ClassName) ;请问 :Delphi 的编译器会不会把TDataModule的OnCreate事件映射成为操作系统的某种消息?
如果会 1.若 TDataModule 包含在客户端的工程中(生成EXE文件).
2.若 TDataModule 包含在服务器的工程中(生成DLL文件,封装了Com+组件).
以上两种情况,编译器会不会把OnCreate事件映射成为操作系统的同一种消息?
解决方案 »
- 请问如何将提取出的像数点保存在TXT文件里面,现在是以窗口的形式显示的。请说清楚,我还是个新手。谢谢
- 有什么控件可以替代DBComboboxLookUp?
- 怎么检测打印机的状态
- 有没有ComBox模糊查询的代码
- DataSet中的当前记录发生改变之后,相应的DBGRID绘制有关问题
- DataSetProvider1.GetRecords(......)如何取后面的n个数据包?
- 海天子的撒分贴,庆祝元旦!都进来吧!
- 在线等!!用Delphi访问数据库,表的字段数极限是多少???
- 如何制作安装程序?或者如何在...
- 这个问题难道难住了高手吗?
- 程序出现异常是如何让成程序继续执行下一条语句?在线~~~~~~~
- CNN报道:微软总裁比尔·盖茨在洛杉矶被暗杀身亡
unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations } procedure WM_LBUTTONDOWN(var Message:TMessage);message WM_LBUTTONDOWN;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.WM_LBUTTONDOWN(var Message:TMessage);
begin
ShowMessage('你案下了鼠标左建!');
end;
end.
oncreate 是在这个模块创建时(可以手工创建,也可以自动创建).由创建程序自动
调用oncreate这个事件的,因此它与消息一点关系也没有。
进程再将此消息层层派发,到了Button获得了处理响应!此时的Button.OnClick(Sender:TObject)事件由用户的
操作引发,操作系统在中间做了转发工作:发送消息到进程.既形成了所谓的映射关系(消息与事件对应);
Case 2 : 当DataModule创建时,没有用户操作,但DataModdule.OnCreate 事件却触发了!它是由什么引起的呢?难道是编译
好的,且在线程初始化时执行的 静态的指令序列吗?我的表达能力不强,如果引起误解,请高手们原谅!疑问 : 1. 从Case 1 来看,事件的触发好像是被动的,但从Case 2 来看,事件的触发确是主动的,这其中有什么本质上的区别吗? 2. Windows进程是由事件驱动的,也就是说任何进程的指令序列的执行是由操作系统派发的消息所引发 !我所说得映射其实
是指:Delphi编译器将OnCreate事件编译成指令序列,这些指令序列的执行由某种 操作系统消息引发!我猜想可能与
某些操作系统内核对象的初始化事件有关(该初始化事件会被翻译成某些初始化消息) ; 欢迎讨论!
DataModdule.OnCreate 仅仅是事件,与消息无关。所谓事件,仅仅是一个函数指针,程序执行的时候,在某一种状态时候,
调用这个函数指针,从而调用这个指针指向的事件处理代码。procedure TDataModule.DoCreate;//DATAMODULE创建的时候。。
begin
if Assigned(FOnCreate) then //如果你写了事件处理函数。
try
FOnCreate(Self); //就执行它
except
if not HandleCreateException then
raise;
end;
end;你可以看出,这里面跟WINDOWS消息没有关系。
begin
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.CreateForm(TDM, DM); //这里面间接调用了TDM.Create
Application.Run;
end.
你的这句话
"所谓事件,仅仅是一个函数指针,程序执行的时候,在某一种状态时候,
调用这个函数指针,从而调用这个指针指向的事件处理代码。 " 中,"在某一种状态时候"
是指什么状态呢?能不能具体一些?
这状态是否与消息有关呢?
2 Application.Initialize;
3 Application.CreateForm(TfrmMain, frmMain);
4 Application.CreateForm(TDM, DM); //这里面间接调用了TDM.Create
5 Application.Run;
6 end.在上述代码从行3 到 行4 的过程中 , TDM 从无到有的被创建, 既程序的状态有了变化!这个创建的过程有没有Windows消息的产生呢?
楼主不要把事件和事件处理程序混在一起了。
对于数据模块的创建,它根本没有必要通过消息方式去告知事件,
只是在程序里面直接调用。消息主要是给应用程序提供一种可以同操作系统或其它应用程序通讯的方式。消息用途很广,
但不是什么地方都要它。
//源程序很清楚看得出来的。
//-----------------------------------------------------------
procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
var
Instance: TComponent;
begin
Instance := TComponent(InstanceClass.NewInstance);
TComponent(Reference) := Instance;
try
Instance.Create(Self); //这儿调用数据的CREATE。
except
TComponent(Reference) := nil;
raise;
end;
end;//--------------CREATE 调用了DOCREATE-----
constructor TDataModule.Create(AOwner: TComponent);
begin
if OldCreateOrder then DoCreate;
end;然后DoCreate里面去触发事件。