关于VCL中通知事件 与 Windows 消息 的映射问题 ! 高手请进!

sealovesand 2003-03-21 03:23:23
问题 : 一个Delphi的工程中包含一个 TDataModule , 在 TDataModule的OnCreate事件中有代码
ShowMessage(Sender.ClassName) ;

请问 :Delphi 的编译器会不会把TDataModule的OnCreate事件映射成为操作系统的某种消息?
如果会 1.若 TDataModule 包含在客户端的工程中(生成EXE文件).
2.若 TDataModule 包含在服务器的工程中(生成DLL文件,封装了Com+组件).
以上两种情况,编译器会不会把OnCreate事件映射成为操作系统的同一种消息?
...全文
52 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
FrameSniper 2003-03-29
  • 打赏
  • 举报
回复
呵呵,讨论很精彩啊,继续,继续挖掘!!!!!!!!!!!!!
Lewolf 2003-03-25
  • 打赏
  • 举报
回复
确切的说是某种持续的状态改变的时候触发的事件,事件是一种非持续的状态。

比如汽车一直停在那里,这是一种持续的状态,当汽车开动起来就是另一种持续状态,这两个状态相互转换的那个非持续状态就是:

当汽车启动时
当汽车停止时

这两个事件。事件是和对象相关的,是对象的本质,消息是系统的,没有对象他也有消息。
sealovesand 2003-03-25
  • 打赏
  • 举报
回复
(续): 比如说

1 begin
2 Application.Initialize;
3 Application.CreateForm(TfrmMain, frmMain);
4 Application.CreateForm(TDM, DM); //这里面间接调用了TDM.Create
5 Application.Run;
6 end.

在上述代码从行3 到 行4 的过程中 , TDM 从无到有的被创建, 既程序的状态有了变化!这个创建的过程有没有Windows消息的产生呢?
sealovesand 2003-03-25
  • 打赏
  • 举报
回复
To halfdream(哈欠) :
你的这句话
"所谓事件,仅仅是一个函数指针,程序执行的时候,在某一种状态时候,
调用这个函数指针,从而调用这个指针指向的事件处理代码。 " 中,"在某一种状态时候"
是指什么状态呢?能不能具体一些?
这状态是否与消息有关呢?
sealovesand 2003-03-25
  • 打赏
  • 举报
回复
看了楼上的回复,好像有点明白那个意思了!
halfdream 2003-03-25
  • 打赏
  • 举报
回复

begin
Application.Initialize;
Application.CreateForm(TfrmMain, frmMain);
Application.CreateForm(TDM, DM); //这里面间接调用了TDM.Create
Application.Run;
end.
halfdream 2003-03-25
  • 打赏
  • 举报
回复
有好多种机制都可以实现同样效果的。
DataModdule.OnCreate 仅仅是事件,与消息无关。

所谓事件,仅仅是一个函数指针,程序执行的时候,在某一种状态时候,
调用这个函数指针,从而调用这个指针指向的事件处理代码。



procedure TDataModule.DoCreate;//DATAMODULE创建的时候。。
begin
if Assigned(FOnCreate) then //如果你写了事件处理函数。
try
FOnCreate(Self); //就执行它。。。
except
if not HandleCreateException then
raise;
end;
end;

你可以看出,这里面跟WINDOWS消息没有关系。
halfdream 2003-03-25
  • 打赏
  • 举报
回复
对于事件,李狼说得再清楚不过了。
楼主不要把事件和事件处理程序混在一起了。


对于数据模块的创建,它根本没有必要通过消息方式去告知事件,
只是在程序里面直接调用。

消息主要是给应用程序提供一种可以同操作系统或其它应用程序通讯的方式。消息用途很广,
但不是什么地方都要它。
//源程序很清楚看得出来的。
//-----------------------------------------------------------
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里面去触发事件。
sealovesand 2003-03-24
  • 打赏
  • 举报
回复
难道没人 :(
sealovesand 2003-03-24
  • 打赏
  • 举报
回复
Case 1 : 界面上有一个Button , 运行时 : 用户单击Button ,操作系统捕获这一操作并将其翻译成系统消息发送给进程,
进程再将此消息层层派发,到了Button获得了处理响应!此时的Button.OnClick(Sender:TObject)事件由用户的
操作引发,操作系统在中间做了转发工作:发送消息到进程.既形成了所谓的映射关系(消息与事件对应);
Case 2 : 当DataModule创建时,没有用户操作,但DataModdule.OnCreate 事件却触发了!它是由什么引起的呢?难道是编译
好的,且在线程初始化时执行的 静态的指令序列吗?

我的表达能力不强,如果引起误解,请高手们原谅!

疑问 : 1. 从Case 1 来看,事件的触发好像是被动的,但从Case 2 来看,事件的触发确是主动的,这其中有什么本质上的区别吗?

2. Windows进程是由事件驱动的,也就是说任何进程的指令序列的执行是由操作系统派发的消息所引发 !我所说得映射其实
是指:Delphi编译器将OnCreate事件编译成指令序列,这些指令序列的执行由某种 操作系统消息引发!我猜想可能与
某些操作系统内核对象的初始化事件有关(该初始化事件会被翻译成某些初始化消息) ;

欢迎讨论!
sealovesand 2003-03-24
  • 打赏
  • 举报
回复
对不起,可能是我没说清楚,下面继续!
hot3000 2003-03-22
  • 打赏
  • 举报
回复
oncreate 绝对不会映射成为windows消息的。
oncreate 是在这个模块创建时(可以手工创建,也可以自动创建).由创建程序自动
调用oncreate这个事件的,因此它与消息一点关系也没有。
Frend 2003-03-21
  • 打赏
  • 举报
回复
请楼主调试以下的代码,以下代码才算是一个windows消息
unit Unit1;

interface

uses
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.
Lewolf 2003-03-21
  • 打赏
  • 举报
回复
OnCreate比Windows的消息要高一个层次,Windows消息可以通过抽象而映射称为某个事件,但是事件则不能映射为某个消息,比如OnChanged和OnClick事件,都不是一个Windows消息触发的,在不同的控件中也不一样,有些时候甚至完全是有用户或者是程序本身引发的。
vmao 2003-03-21
  • 打赏
  • 举报
回复
和操作系统的消息没有关系的!不会映射!

我觉得“消息”的概念被滥用了!oncreate应该叫“事件”,但有些书又喜欢称什么“vcl消息”!

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧