俺正在做1个可以对菜单设置权限值的控件,需要检测窗体上是否添加了菜单,或是删除了当前菜单,这应该是消息处理这一块的.

解决方案 »

  1.   

    http://218.56.11.178:8020/web/index.aspx->  下载基地 ->例程-基础应用->删除panel中的所有标签
      

  2.   

    to: jpyc(九品御厨-为delphi学ASP.NE) 
    不好意思,你的这个东东不是俺想要的!
    我做的菜单权限控件有个MainMenu属性,用于记录当前窗体的主菜单,可是当删除窗体上的主菜单时,该属性由于目标指针已丢弃就会报错.类似于TMainMenu的Images属性,当窗体上相关的IMagesList控件被删除时,该属性值会跟着赋值为空。设计期就可以是这样的。但是TImagesList控件有TChangeList来记录与其关联的控件之属性指针,所以其析构时可以很好的控制与其关联的东东,而TMenu是没有这方面的特性的,所以我想应该是加个钩子来检测相应的消息,再做相应的判断和操作。但是我不知道该检测什么消息,希望能给兄弟些提示和建议。诚谢各位了!
      

  3.   

    看如下的例子:type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        FileStrs: TStrings;
      protected
        procedure Notification(AComponent: TComponent; Operation: TOperation); override;
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.Button1Click(Sender: TObject);
    begin
       Button1.Free;
    end;procedure TForm1.Notification(AComponent: TComponent;
      Operation: TOperation);
    var
      AName: String;
    begin
      AName := AComponent.ClassName;
      inherited Notification(AComponent, Operation);
      if FileStrs = nil then  FileStrs := TStringList.Create;
      if Operation = opRemove then
        FileStrs.Add(AName + '已经被删除')
      else
        FileStrs.Add(AName + '已经被加入');
    end;procedure TForm1.FormDestroy(Sender: TObject);
    begin
      FileStrs.SaveToFile('g:\aa.txt');
      FileStrs.Free;
    end;我想,你应该知道可以在Notification中截获这些消息了。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  4.   

    只有继承TFORM类才能达到效果吗? 那俺可就惨了!
      

  5.   

    看来我可能并没有将我的问题描述清楚!我不想修改DELPHI的标准部件,而是自己做了一个TMenuRight类,它有个MENU属性,当其值被设定时,会自动读取相联的MAINMENU的各菜单项,这样开发人员就可以对每个菜单项添加相应的权限值了。你后程序在启动时,该部件可以用于控制其相联菜单的各菜单项的VISIBLE属性以实现对操作员的操作控制。我做的过程中发现个问题是,设置完MENU的值后,若窗体上与其相联的MAINMENU被删除,则系统就会立即报错(原因想必大家都清楚了)。再者,当菜单项的CAPTION和NAME被修改时,TMENURIGHT相对应的权限列表也要跟着变化(图方便,我想不管什么情况都重构)。lxpbuaa(桂枝香在故国晚秋) ,Notification消息是否可以从windows中用钩子载获到呢?
    若能有这方面的消息,我就可以用钩子来做这些事了。希望能继续给些帮助。
      

  6.   

    lxpbuaa(桂枝香在故国晚秋) 说的没问题,TComponent类中有Notification(AComponent: TComponent; Operation: TOperation); ,你自己override一下就ok了。
      

  7.   

    在IDesignerNotify接口里有一个方法Notification可以相应Form上元件的变化。
      

  8.   

    vcl中有个TcoustomModule类,它有个vaildatecomponent方法,你只要
    覆盖它就行了,具体怎么用,你可以看quickreport的源码