我设置好MDI窗体。子窗体也建立好了。为何运行MDI窗体,子窗体自动弹出?我是希望在点击菜单后子窗体才弹出,请问我哪里设置错了

解决方案 »

  1.   

    Project->Options->Forms->Auto Create forms 删除不需要自动创建的窗体
      

  2.   

    4.4 Delphi 5项目的框架类
    大多数Delphi 5 应用程序至少有一个T F o r m的实例。Delphi 5 VCL 应用程序也只能有一个
    TA p p l i c a t i o n的实例和一个T S c r e e n的实例。这三个类在Delphi 5中扮演着重要的角色。下面几节就介绍
    这几个类,掌握了这些知识后就可以根据需要修改它们的缺省功能。
    4.4.1 TForm 类
    T F o r m类是Delphi 5应用程序的焦点。大多数情况下,整个应用程序都是围绕着主窗体转的。从主
    窗体,可以打开其他窗体,通常要通过菜单命令或按钮。也可以让Delphi 5自动创建窗体,这样就不
    用操心什么时候创建、什么时候删除窗体。也可以选择在运行期间动态创建窗体。
    注意Delphi可以创建不使用窗体的程序(例如控制台程序、服务和COM服务器)。这种情况下,
    TForm就不再是应用程序的焦点。
    显示给用户的窗体有两种:有模式的和无模式的。具体使用哪一种窗体,取决于是否希望用户能
    够同时与这个窗体和其他窗体交互。
    1. 显示一个模式窗体
    当打开一个模式窗体后,用户无法与应用程序的其他部分交互,直到用户关闭了这个窗体。模式
    窗体通常是对话框,就好像Delphi 5本身的对话框一样。事实上,大多数情况下应当使用模式窗体。
    要显示一个模式窗体,只要调用S h o w M o d a l ( )就可以了。下面的代码演示了怎样创建T m o d a l F o r m的实例,并把它作为模式窗体打开:
    B e g i n
    / /创建T M o d a l F o r m的实例
    ModalForm := TModalForm.Create(Application);
    t r y
    if ModalForm.ShowModal = mrOk then / /显示这个窗体
    {do something}; / /执行一些代码
    f i n a l l y
    M o d a l F o r m . F r e e ; / /释放窗体的实例
    ModalForm := nil; / /把窗体变量设为n i l
    e n d ;
    e n d ;
    上面的代码演示了怎样动态创建T M o d a l F o r m的实例以及把实例赋值给M o d a l F o r m变量。注意:如
    果需要动态创建一个窗体的实例,就要把这个窗体从Project Options对话框的A u t o - C r e a t e框中去掉。如
    果窗体的实例已经存在,可以调用S h o w M o d a l ( )函数打开它,其他代码可以删掉,变成下面这样:
    ...
    if ModalForm.ShowModal = mrOk then
      {}
    ...MDI窗体同理创建 S h o w M o d a l - 〉S h o w《Delphi5开发人员指南》第4章
      

  3.   

    2. 打开无模式窗体
    要打开一个无模式窗体,可以调用S h o w ( )。无模式窗体与有模式窗体的区别是,用户可以在无模式窗体和其他窗体之间切换。这样,用户就可以同时工作于一个应用程序的几个部分。下面的代码演示了怎样动态创建一个无模式的窗体:
    ...
    begin
    // 如果M o d a l F o r m已经存在
    If not Assigned(Modeless) then 
      Modeless := TModeless.Create(Application);// 创建窗体
      MOdeless.Show;                            // 显示窗体
    end;
    上述代码同时演示了怎样防止一个窗体的多个实例存在。记住,无模式的窗体允许用户与应用程
    序的其他部分交互。这样,用户可以照常使用菜单命令,或者创建T M o d e l e s s的另一个实例。因此,需要考虑这些实例的创建和删除问题。
    要特别注意窗体的实例:当通过窗体的系统菜单或者窗体上的C l o s e按钮关闭这个窗体时,窗体并没有真正从内存中释放。它仍然还在内存中,除非关闭了主窗体(即应用程序)。在上面这个程序示例中,t h e n后面的语句只会执行一次,前提是这个窗体不是自动创建的。如果希望用户关闭了窗体就在内存中释放它,必须处理它的O n C l o s e事件,并且把A c t i o n参数设为c a F r e e,这样,V C L就会在这个窗体关闭时释放它。
      

  4.   

    子窗体必须动态创建,否则就会自动弹出。与之相对应的,子窗体关闭时也必须释放,form1.release;