//在自定义消息中使用关键字inherited;procedure TfrmMain.SXMyMessage(var Msg:TMessage);
begin
    inherited;
end;//inherited起到什么作用,他继承了什么?继承了那个函数?

解决方案 »

  1.   

    inherited;代表父类中的SXMyMessage事件处理函数中的代码。
      

  2.   

    因为TForm不能直接响应消息,所以只能继承XMyMessage事件处理函数
      

  3.   

    在消息处理过程中可以调用inherited来把消息传递给祖先类的消息处理过程.
       因为VCL的消息处理机制,消息到达处理该消息的过程后,经过处理过程的处理和inherited句,消息来到对象的Defaulthandler().这个方法对消息进行最后的处理.
      如果不用inherited就不能进行常规的消息处理.DDG5里的消息处理机制里说得应该还算清楚,去看看吧!
      

  4.   

    是不是Delphi developer's guide?谢谢了。
      

  5.   

    以上话是对reallike(此人已删除) 讲的, 请参考
    When inherited has no identifier after it, it refers to the inherited method with the same name as the enclosing method. In this case, inherited can appear with or without parameters; if no parameters are specified, it passes to the inherited method the same parameters with which the enclosing method was called. For example,inherited;occurs frequently in the implementation of constructors. It calls the inherited constructor with the same parameters that were passed to the descendant.
      

  6.   

    你听pressman(还穿三角裤)家伙放屁,不要以为从书上抄点东西下来就能唬人, 对这个情况根本不适用
     以上话是对reallike(此人已删除) 讲的, 请参考
    When inherited has no identifier after it, it refers to the inherited method with the same name as the enclosing method. In this case, inherited can appear with or without parameters; if no parameters are specified, it passes to the inherited method the same parameters with which the enclosing method was called. For example,inherited;occurs frequently in the implementation of constructors. It calls the inherited constructor with the same parameters that were passed to the descendant.
      

  7.   

    说说自己的观点:
    在delphi的消息处理中,inherited并不是必须要有的。在wndpro中,我们可以得到所有的消息,以为我们只关心其中的几个消息,所以,对于其他的消息处理我们都交给父类完成。以保证程序的正确运行。但是在某写时候,需要彻底的屏蔽掉一个消息,也就是岁、所谓的消息陷阱。这个时候,我们根本不需要什么inherited。还有就是要考察父类提供的消息处理方式是否对我们有用,如果有用,可以使用inherited来减少代码。例如tcustomedit中按下vk_left光标向左移动。如果想向右移动,那么如何inherited呢?最后就是自定义的消息的响应,父类中根本没有响应的处理函数,又如何inherited呢?
      

  8.   

    1、inherited;并不是完整的写法,完整的是在其后加上方法调用。例如:
    procedure TfrmMain.SXMyMessage(var Msg:TMessage);
    begin
        inherited SXMyMessage(Msg);
      //或者inherited 父类提供的任何可见的方法(需要的参数);
    end;
    直接写inherited;表示调用父类中相同名字的方法。如果它是重载的则必须写完整,否则编译器不知道调用哪一个重载的方法。
    2、inherited并不局限于消息处理中使用,实际上在任何地方都可以使用它。意思就是调用父类的某个方法。例如:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      inherited Close;
    end;
    3、因为inherited只是调用父类的某个方法,因此如果不需要使用这个调用时,那么就没有必要使用inherited。不过 fengjn(小枫) 的说法是不准确的。在大多数时候即使父类没有处理这类消息,也往往应该加上inherited语句,因为父类的处理在将来完全是可能要修改的。————————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    ————————————————————————————————————
      

  9.   

    lxpbuaa(桂枝香在故国晚秋) 批评的对。我都是从wwinctrl什么的往下继承控件。所以也不会去扩充父类。以后再写代码的时候一定尽量改正。
      

  10.   

    DWGZ() 你这个家伙!我给你说,你才是放屁,请你尊重别人,帮助我早就看了,但是帮助说得太笼统。我太失望了,唉。太失望了。对大家的水平简直太失望了!难道Csdn的星星们就是如此水平……
      

  11.   

    to: reallike(此人已删除) 
    你失望什么,是你自己理解不够深刻吧,  我讲得不对吗,  请指正。你把能在他的父类中找到:procedure SXMyMessage(var Msg:TMessage);吗?
    你把 inheried 注掉试试是不是一样to: pressman(还穿三角裤) 
    骂人是我不对, 没办法火气太大了,真的快爆了
      

  12.   

    我不注释掉,我要的就是这个inherited到底干什么。我要是注释掉,我在这里瞎胡闹?无缘无故叫549给我发个帖子问?我还给你说,就这位pressman(还穿三角裤)说的在理,是正解!其他人说的统统不符合我的问题题意!
      

  13.   

    如果父类中无此方法将什么也不不做,如果有那么使用,你的这个方法同名且有相同的参数表的那个,如果不存在相同的参数表并且存在重名那么将出错.
    ==================================================================================
    http://expert.csdn.net/Expert/topic/2123/2123513.xml?temp=.3029749
    帮忙UP两把
      

  14.   

    to:: reallike(此人已删除) 
    pressman(还穿三角裤) 是你什么人????我觉得fengjn(小枫) 说的在理, pressman(还穿三角裤) 有一部分在理
      

  15.   

    唉呀, Anders 来救救我吧这家伙要跟我打架
      

  16.   

    study 吵架是不文明的
    共同进步才是目的。
      

  17.   

    procedure TfrmMain.SXMyMessage(var Msg:TMessage);
    begin
        inherited;  //在这里设置一个断点
    end;project->options->compiler->debugging  选择Use Debug DCUs
    然后F7单步调试,你自己应该可以看到答案了
      

  18.   

    procedure TfrmMain.SXMyMessage(var Msg:TMessage);
    begin
        inherited;  //在这里设置一个断点
    end;project->options->compiler->debugging  选择Use Debug DCUs
    然后F7单步调试,你自己应该可以看到答案了
      

  19.   

    对了,正确地讲题目应该是inherited在自定义消息中的作用!
      

  20.   

    事实说明一切
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;
    const
      UM_Test = WM_USER + 100;
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        procedure MyMessage(var Msg: TMessage); message UM_Test;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}{ TForm1 }procedure TForm1.MyMessage(var Msg: TMessage);
    begin
      //inherited;
      ShowMessage('Hello');
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      Perform(UM_Test, 0, 0);
    end;end.
      

  21.   

    跟lxpbuaa(桂枝香在故国晚秋)的观点一样
      

  22.   

    对了,正确地讲题目应该是inherited在自定义消息中的作用!
      

  23.   

    to naughtyboy(重归起跑线) 谢谢,我就是这么做的。但是我不明白完全的答案,我在等待解释。to  DWGZ() 你少在这里瞎吵吵,我不想注释掉inherited,不想删除。我要的就是存在这个!我要的就是这个东西他有什么用。你这算什么事实?我告诉你,有和没有是两个样子。你去掉一点用都没有!
      

  24.   

    procedure TForm1.MyMessage(var Msg: TMessage);
    begin
      inherited;
      ShowMessage('Hello');
    end;我要的就是把这两个‘/’给我删除,这个inherited到底在干什么。你答非所问!唉……
      

  25.   

    晕~ reallike 居然今天也要骂别人不尊重他?? 爱翔同志还记得俺吗? 嘿嘿,有趣有趣
      

  26.   

    procedure TForm1.MyMessage(var Msg: TMessage);
    begin
      inherited;
      ShowMessage('Hello');
    end;
    ,这里应该是调用TFORM1的祖先tcustomform的消息处理,由于tcustomform没有这个实现,所以直接调用的是tcustomform的defaulthandle.
      

  27.   

    to wlhtake(正在调试)谢谢你还记得我。看看下面的话。你说人家着他惹他了?回答我的问题还说这个?>>>>>>你听pressman(还穿三角裤)家伙放屁,不要以为从书上抄点东西下来就能唬人, 对这个情况根本不适用
    好好,说人家放屁,倒是弄出点证据说人家到底放了哪门子屁?自己倒是弄出个正确的解释给我听听?这算什么人?唉,不求甚解我昨天晚上和549弄了好长时间,我们都知道inherited的基本意思。但是在自定义消息过程里面就不一样了!所以找个合理的解释!
      

  28.   

    procedure TForm1.MyMessage(var Msg: TMessage);
    begin
      inherited;
      ShowMessage('Hello');
    end;
    在message处理中和其他不一样的是inherited不会因为没有在祖先中找到一样的函数或者方法而将inherited失效,他会传入缺省的消息处理.
    这里调用TFORM1的祖先的消息处理,由于tform和tcustomform没有这个实现,所以直接调用的是tcustomform的defaulthandle.(注意这个方法是对twincontrol的override)
      

  29.   

    嗬嗬,果然风炎老大就是厉害。我就相信能够解决。一说override,我明白了,怪不得入栈入了三个!http://www.reallysoft.com.cn/callstack.jpg这个是我大哥地抓图!很好地揭示了inherited的的道理。我本来还不明白为什么弄三个defaulthandle()现在明白了。
    另外,风炎老大,我再问一下,消息在dispatch激活,到底在哪里结束呢?
      

  30.   

    唉,这里也就风炎老大回答的够我需要的了。看看楼上的人们!我请你们反省一下自己吧。知识掌握得这么肤浅,浮躁!我就是因为认识到自己的肤浅,我才闭关修炼的。delphi哪有这么简单?唉……………………549,你也应该看懂了吧,你也发个话,老是我在这里说。
      

  31.   

    调试到现在发现,在消息的处理中,inherited的作用是是否(以及何时)将消息交给缺省的消息处理来处理。可以通过
    procedure TForm1.MyMessage(var Msg: TMessage);
    begin
      inherited;
      ShowMessage('Hello');
    end;
    procedure TForm1.MyMessage(var Msg: TMessage);
    begin
      ShowMessage('Hello');
    end;
    procedure TForm1.MyMessage(var Msg: TMessage);
    begin
      ShowMessage('Hello');
      inherited;
    end;
    看出来。在我的使用来讲,我可能会在defaulthandle中集中的处理消息产生的垃圾。
      

  32.   

    废话,不处理你能接收消息吗,  跟你这inherited一点关系都没有
      

  33.   

    不太明白你说的结束是什么意思
    system单元里TObject.Dispatch的asm代码,你应该看起来没有问题啊
    GetDynaMethod或者defaulthandle的调用
    Microsoft OLE DB Provider for SQL Server 错误 '80040e31' 超时已过期 /Expert/reply.asp,行105
      

  34.   

    事件怎么也得有始有终啊。消息激活使用的是TObject.Dispatch,但是销毁是在哪里?也是Dispatch?
      

  35.   

    procedure TObject.DefaultHandler(var Message);
    begin
    end;:(空的!空的!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      

  36.   

    刚才的“楼上”是对DWGZ() 说的,不好意思哦
      

  37.   

    1 你说消息激活销毁?不太明白你的意思,Dispatch只是根据消息调用事件过程,而消息队列的维护,是windows完成的
    2 DefaultHandler是虚函数阿,在虚表中vmtDefaultHandler,他调用的具体的TForm1类虚表中的DefaultHandler
      

  38.   

    明白了!大哥,好的。可以结束这个问题了。几乎全部都明白了。原来销毁是windows来操作的。多谢多谢。共勉,学习。多谢!
      

  39.   

    我们发送消息的时候可能会建立一个结构,然后通过消息将指针传过去。例如CM_HINTSHOW但是由谁来负责回收这块内存呢?
      

  40.   

    风炎老大,上次的那个帖子。http://expert.csdn.net/Expert/topic/2099/2099843.xml?temp=.311352谢谢你的建议,不过你没有再看看有点可惜。
      

  41.   

    to: fengjn(小枫) 
    我针对你干嘛,  我针对那个老冤家
      

  42.   

    DWGZ() 我懒得理你,不可理喻的人。还是风炎老大给我解释得好。问题解决了,549回来可以结贴了!我继续看书
      

  43.   

    to: fengjn(小枫)
    最终都是windows回收,关键是你应该在什么时候释放结构的资源,只有自己决定
    to: reallike(此人已删除) 
    不好意思,csdn太火爆,帖子一下就沉了,什么时候能拜读一下第二版?:)
    to: DWGZ() 
    csdn上没有冤家,更没有老冤家了,每个人都有自己的理解,兄台不必介意,看外面还有那么多朋友在叫help,不要在这里斗嘴了:)
      

  44.   

    firetoucher(风焱)还是老地址,再下载一下就是第二版了。做了一些修改,建议很有帮助。
      

  45.   

    to DWGZ() 你少在这里有一搭每一句!就你上面的话:废话,不处理你能接收消息吗,  跟你这inherited一点关系都没有小枫早就有证据了。并且把图给我了。我真的懒得理你。爱怎么着怎么着!你精力这么旺盛!有力气骂人,有力气和我吵嘴。外面很多人在等着你呢。快去吧。快去。
      

  46.   

    老子今天就是咽不下这口气, 
    这种情况属于自定义消息,父类中根本找不到,你这里加不加inherited都是一样,没加VCL自己会处理,  你们看到的情况也就是VCL自己内部处理的情况。 当它向父类中向后查找到这个消息句柄,  你这个inherited 才起作用,  所以你这里加不加inherited 都一样, 
    你换个你父类中可以找到的消息试试,  白痴
      

  47.   

    看看Delphi Help中message KeyWord的Help!!!DWGZ() --->我猜你是C++看多了,但Delphi TMD是個狗批OO,許多動西都TMD不符合OO原則.inherited在Method與Window Message中基本含意相同,但在Message中卻TMD又說沒有找到
    Base Class的相對的Message Handle,就去Call DefaultHandle,TMD,狗輩OO.
      

  48.   

    不知道大家都對C++了解多少,看看
    http://expert.csdn.net/Expert/topic/2123/2123757.xml?temp=.3006861
    看誰能有一個好的解決方法,這在C++中是最基本的東西,在OP(不如叫GP->狗屁)卻
    好辦,我無意說Delphi與C++誰好誰弱,我在學Delphi了
      

  49.   

    to DWGZ()!哈哈,别咽下这口气,咽下就死了。随便你怎么说,你没有证据随便你说什么都是瞎说。要不是小枫叫我来,我就不来了,早知道是要咽气了。我就不来了。
      

  50.   

    另外,我这个帖子的主题不是:在消息机制里面加不加inherited是否一样。请你看清楚!!!!!!!!!!!!!!!!!!!!!!!我要的就是加了inherited他的作用是什么。到底起了什么作用。上面549写的都是我在QQ上写给他的。你答非所问,还咽气,在这里出洋相都不脸红
      

  51.   

    电子工业出版社不久会出版我的一本叫做《Delphi精要》的书(李维先生系列图书之一),里面有专门部分详细解析VCL的消息机制,大家可以看看。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  52.   

    这个其实并不困难,主要是一个态度问题。如果在win32SDK开发的高手面前,这个是最基本的。