你可以在CSDN上下载一个程序"狼行成双"侃侃(我做的),还有问题的话给我写信[email protected],大家一起探讨!

解决方案 »

  1.   

    摘下来的一段话.    在M D I应用程序中使用菜单不比在其他类型的应用程序中使用菜单更困难,但稍有不同。下面将
    介绍如何通过菜单合并技术使子窗体能够共享主窗体的菜单栏。同样,你也可以从中学习如何使非
    M D I应用程序也能共享菜单栏。
    16.2.1 用MDI程序合并菜单
    请注意一下T M d i E d i t F o r m的主菜单。双击窗体上的T M a i n M e n u组件,将打开菜单编辑器。
    T M d i E d i t F o r m的主菜单有三个菜单项,分别是F i l e、E d i t和C h a r a c t e r。这些菜单项都有一个
    G r o u p I n d e x属性,从Object Inspector中可以看出它的值。注意,F i l e菜单项的G r o u p I n d e x属性为0,E d i t
    和C h a r a c t e r的G r o u p I n d e x属性都为1。
    而主窗体的主菜单有两个菜单项,分别是F i l e和Wi n d o w。与T M d i E d i t F o r m一样,T M a i n F o r m的
    F i l e菜单的G r o u p I n d e x属性也为0,而Wi n d o w菜单项的G r o u p I n d e x属性为9。
    还要注意, T M a i n F o r m的F i l e菜单和T M d i E d i t F o r m的F i l e菜单有不同的子菜单, T M a i n E d i t F o r m的
    F i l e菜单比T M a i n F o r m的F i l e菜单含有更多的子菜单项。
    G r o u p I n d e x属性的作用主要体现在菜单合并。这意味着,当主窗体打开一个子窗体时,子窗体的
    菜单就合并到主窗体的菜单中。G r o u p I n d e x属性决定了菜单项的替换顺序。注意,菜单合并只适用于
    菜单栏上的菜单,而不适用于子菜单。
    如果子窗体的某个菜单项的G r o u p I n d e x属性与主窗体的某个菜单项的G r o u p I n d e x属性值相同,则
    子窗体的菜单项将替代主窗体的菜单项。其他菜单项将按照它们的G r o u p I n d e x属性值的顺序排列。如
    果M d i E d i t F o r m是当前活动的窗口,则主窗体上的菜单栏依次显示F i l e、E d i t、C h a r a c t e r和Wi n d o w。注
    意,这里的F i l e菜单是T M d i E d i t F o r m的F i l e菜单,因为两个F i l e菜单的G r o p u I n d e x特性值相同,都为0。
    因此,T M d i C h i l d F o r m文件菜单替换了T M a i n F o r m文件菜单。这些菜单沿着菜单条的次序( 0、1、1、9 )
    直接反映了每个菜单项的G r o u p I n d e x属性的次序。
    注意尽管在这里我们不使用它们,但它是你要遵循的导线,这样你的程序可以更好地集成
    OLE合并菜单。这些导线在“Borland Delphi Library Reference Guide”中加以介绍。
    M D I应用程序中的其他窗体也是一样的。当一个窗体激活时,主窗体上的菜单栏会相应地发生变
    化。当运行程序时,菜单栏如何变化取决于哪一个子窗体被激活。
    对于M D I应用程序来说,菜单合并是自动的,只要正确设置了菜单项的G r o u p I n d e x属性即可。当
    一个子窗体激活时,菜单就能正确地合并。
    对于非M D I应用程序来说,菜单合并也不复杂,但需要额外的步骤。第4章“应用程序框架和设
    计”中曾经提到一个T N a v S t a t F o r m类。不过,在非M D I应用程序中,需要显式地调用M e rg e ( )和
    U n m e rg e ( )。一般来说,非M D I应用程序中合并菜单不是自动的。你必须把T M a i n M e n u的A u t o M e rg e属
    性设为Tr u e。