Child := TMDIChild.Create(Application);
里就调用 procedure TMDIChild.Loaded;
你的 filepath还设赋值

解决方案 »

  1.   

    Loaded方法是从文件装载内容的方法,你的FilePath还没有设置呢!
    我觉得设置DBGird的数据库连接应该放在OnCreate事件里面比较好!
      

  2.   

    你可以重载Create
    不知对不对,我没用过MDI
    不的别的FORM 我是这样做的
      

  3.   

    没用在OnCreate里也不出来
    难道没人知道了吗?
      

  4.   

    原因正如楼上几位高手所料你可以把设置 DBGird 的数据库连接代码放在子窗口的 OnShow 事件里来解决问题。
      

  5.   

    我试过了在OnShow里showmessage(filepath)出来也是空的
      

  6.   

    噢,子窗口是很奇怪,她的 OnShow 事件好象是在 TMDIChild.Create(Application); 中触发的,我看这样解决:在子窗口中定义 LinkGridToDB 的方法,把设置 DBGird 的数据库连接代码放其中,然后,
      Child := TMDIChild.Create(Application);
      Child.Caption := Name;
      Child.filepath:=Name;
      Child.LinkGridToDB;good luck!
      

  7.   

    你在form 的show事件加上试试
      

  8.   

    qkl(康)  你的方法我早就想到了,而且已经在用了,
    只是那样用总觉得别扭,,
    Delphi的MDI被我的感觉它的Child象是死的一样,
      

  9.   

    const 
      WM_AFTERCREATE=WM_USER+1;
    ......
    protected
      procedure WMAfterCreate(var Msg:TMessage);message WM_AFTERCREATE;
    //实现了这个方法后在子窗体的OnCreate中
      PostMessage(Handle,WM_AFTERCREATE,0,0);
    //因为在OnCreate中操作控件很危险,经常会出现异常(因为控件之间的联系比较复杂,有可能你连接了数据库后,DataSet又去刷新Grid,然后其实Grid还没有创建,这时就会出错)
    //因为Delphi没有提供AfterCreate事件,所以只好自己实现了。而且这个方法比OnShow要强,因为OnShow是有可能被多次执行的。
      

  10.   

    如果你想要“高级”点,你可以重新定义 constructor 来实现。不过我觉得第一种方法很好:条理清晰,结构也很好,没有把太多的细节“封装”,便于以后阅读。
      

  11.   

    to cybercake(数字蛋糕) 对于这个问题,我觉得没有必要使用这种复杂,影响程序普通流程的技术。
      

  12.   

    cybercake(数字蛋糕) 你的方法不错
    我学了比较长的VC,封装已经成了习惯了,呵呵