问题 : 一个Delphi的工程中包含一个 TDataModule , 在 TDataModule的OnCreate事件中有代码
        ShowMessage(Sender.ClassName) ;请问 :Delphi 的编译器会不会把TDataModule的OnCreate事件映射成为操作系统的某种消息?
       如果会 1.若 TDataModule 包含在客户端的工程中(生成EXE文件).  
              2.若 TDataModule 包含在服务器的工程中(生成DLL文件,封装了Com+组件).
       以上两种情况,编译器会不会把OnCreate事件映射成为操作系统的同一种消息?

解决方案 »

  1.   

    和操作系统的消息没有关系的!不会映射!我觉得“消息”的概念被滥用了!oncreate应该叫“事件”,但有些书又喜欢称什么“vcl消息”!
      

  2.   

    OnCreate比Windows的消息要高一个层次,Windows消息可以通过抽象而映射称为某个事件,但是事件则不能映射为某个消息,比如OnChanged和OnClick事件,都不是一个Windows消息触发的,在不同的控件中也不一样,有些时候甚至完全是有用户或者是程序本身引发的。
      

  3.   

    请楼主调试以下的代码,以下代码才算是一个windows消息
    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.
      

  4.   

    oncreate 绝对不会映射成为windows消息的。
       oncreate 是在这个模块创建时(可以手工创建,也可以自动创建).由创建程序自动
       调用oncreate这个事件的,因此它与消息一点关系也没有。
      

  5.   

    Case 1 : 界面上有一个Button , 运行时 : 用户单击Button ,操作系统捕获这一操作并将其翻译成系统消息发送给进程,
             进程再将此消息层层派发,到了Button获得了处理响应!此时的Button.OnClick(Sender:TObject)事件由用户的
             操作引发,操作系统在中间做了转发工作:发送消息到进程.既形成了所谓的映射关系(消息与事件对应);
    Case 2 : 当DataModule创建时,没有用户操作,但DataModdule.OnCreate 事件却触发了!它是由什么引起的呢?难道是编译
             好的,且在线程初始化时执行的 静态的指令序列吗?我的表达能力不强,如果引起误解,请高手们原谅!疑问 : 1. 从Case 1 来看,事件的触发好像是被动的,但从Case 2 来看,事件的触发确是主动的,这其中有什么本质上的区别吗?       2. Windows进程是由事件驱动的,也就是说任何进程的指令序列的执行是由操作系统派发的消息所引发 !我所说得映射其实
              是指:Delphi编译器将OnCreate事件编译成指令序列,这些指令序列的执行由某种 操作系统消息引发!我猜想可能与
              某些操作系统内核对象的初始化事件有关(该初始化事件会被翻译成某些初始化消息) ;         欢迎讨论!
      

  6.   

    有好多种机制都可以实现同样效果的。
    DataModdule.OnCreate 仅仅是事件,与消息无关。所谓事件,仅仅是一个函数指针,程序执行的时候,在某一种状态时候,
    调用这个函数指针,从而调用这个指针指向的事件处理代码。procedure TDataModule.DoCreate;//DATAMODULE创建的时候。。
    begin
      if Assigned(FOnCreate) then //如果你写了事件处理函数。
      try
        FOnCreate(Self); //就执行它
      except
        if not HandleCreateException then
          raise;
      end;
    end;你可以看出,这里面跟WINDOWS消息没有关系。
      

  7.   


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

  8.   

    To halfdream(哈欠) :
      你的这句话
      "所谓事件,仅仅是一个函数指针,程序执行的时候,在某一种状态时候,
    调用这个函数指针,从而调用这个指针指向的事件处理代码。 " 中,"在某一种状态时候"
    是指什么状态呢?能不能具体一些?
      这状态是否与消息有关呢?
      

  9.   

    (续): 比如说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消息的产生呢?
      

  10.   

    对于事件,李狼说得再清楚不过了。
    楼主不要把事件和事件处理程序混在一起了。
    对于数据模块的创建,它根本没有必要通过消息方式去告知事件,
    只是在程序里面直接调用。消息主要是给应用程序提供一种可以同操作系统或其它应用程序通讯的方式。消息用途很广,
    但不是什么地方都要它。
    //源程序很清楚看得出来的。
    //-----------------------------------------------------------
    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里面去触发事件。