一般将代码放在Form的OnCreate事件中:
procedure TfrmMain.FormCreate(Sender: TObject);
var
  mnuSys: HMENU;
begin
  mnuSys := GetSystemMenu(Handle, False); //获得系统菜单
  DeleteMenu(mnuSys, SC_SIZE, MF_BYCOMMAND); //删除'大小'菜单
  DeleteMenu(mnuSys, SC_MAXIMIZE, MF_BYCOMMAND);//删除'最大化'菜单
  InsertMenu(mnuSys, $FFFFFFFF, MF_SEPARATOR, $FFFFFFFF, '');//插入分隔线
  //插入'About'菜单
  InsertMenu(mnuSys, $FFFFFFFF, MF_BYCOMMAND, IDM_ABOUT, '关于(&A)…');
  //修改菜单文本
  ModifyMenu(mnuSys, SC_MINIMIZE, MF_STRING, SC_MINIMIZE, 'Minimize');
...
end;

解决方案 »

  1.   

    lin
     你的做法我用过,可不知这样将自己的代码和新增的菜单关联起来,是否要用到WM_SYSTEMCOMMAND、WM_COMMAND消息
      

  2.   

    gypb:是的,必须过滤WM_SYSCOMMAND消息,因为你修改的是系统菜单么。最好重载WndProc过程:
    ...
    protected
        procedure WndProc(var Message: TMessage); override;
    ...
    procedure TfrmPlay.WndProc(var Message: TMessage);
    begin
      case Message.Msg of
        WM_SYSCOMMAND:
          case Message.WParam of
            SC_MINIMIZE://Do you want to do
            SC_CLOSE://Do you want to do
            SC_MAXIMIZE://Do you want to do
            IDM_ABOUT:
              ShowAbout......
            else inherited;
          end;
        else inherited;
      end;
    end
      

  3.   

    To gypb:
    Help me! Please!!! 
    见我的问题‘捆绑OLE对象到数据库’,能否将你的控件E给我?
      

  4.   

    lin
     你的方法中使用重载WNDPROC的方法,我在编译运行时出现了WIN32错误,我将他该成了
    protected 
      procedure NProc(var message:TWMSysCommand);Message WM_SysCommand;
    一切OK。
    你的方法应该也是可行的,我正在寻找原因,我的系统是NT WS4.0
      

  5.   

    实在对不起,你的要求我无法满足,不过DBOLEEDIT的原理很简单,只要加入TDATALINK
    与数据库关联起来就行了。
      

  6.   

    gypb:
    我用的也是NT WS4.0 + SP6 + 戴妃5,但工作一切正常,是不是你的系统有点问题?