我在一个子窗口中加了一个BUTTON,实现的操作是,关闭本窗口,另外打开一个新的子窗口.可为什么关闭窗口后却打不开新的子窗口button中的代码如下:
procedure Ttx_1.BitBtn1Click(Sender: TObject);
begin
dm.bxxd_query.Connection:=dm.adoc;
dm.bxxd_query.SQL.Clear;
dm.bxxd_query.SQL.Add('select * from bxd where (zt=:dd) and (gssx-date()<2) order by dh' );
dm.bxxd_query.Parameters.ParamByName('dd').Value :='订单';
dm.bxxd_query.Open;
if bx_xd=nil then
  bx_xd:=Tbx_xd.Create(self);
bx_xd.Show;
tx_1.Close;
end;
我在tx_1中的onclose的代码如下.
action := cafree;
 tx_1 := nil;
tx_1的建立是在菜单下建立
if tx_1=nil then
  tx_1:=Ttx_1.Create(self);
tx_1.Show;
可为什么点了按钮后bx_xd确没显示,当我把按钮中的tx_1.Close;取消后就可正常显示bx_xd.可tx_1却没关闭,这是为什么.有什么没法解决

解决方案 »

  1.   

    通俗一点说:这是顺序的问题,不是没有显示,是显示后又被关闭了。你可以加个SHOWMESSAGE跟踪一下就知道了。
    因为你的bx_xd表单是在TX_1中被建立的,父一级窗体关闭时,肯定将所有子窗体一起关闭。
    如果你想在显示bx_xd时,不想看到TX_1,那么可以隐藏,在关闭bx_xd时,再关闭TX_1窗体。
      

  2.   

    因为 TX_1 是 bx_tx 的父窗体(bx_xd:=Tbx_xd.Create(self); ),父窗体释放的时候,它的所有子窗体也将会释放。如果只是仅仅要隐藏 TX_1 ,那可以把
    bx_xd.Show; 
    tx_1.Close; 
    改为
    tx_1.Hide;
    bx_xd.Show; 
    //tx_1.Close; 
      

  3.   

    楼上兄弟,我这个是mdichild窗口,用hide会出错
    我用showwindow(tx_1.handle, sw_hide);隐藏窗口,第一次bx_xd窗口会正常显示,而tx_1也会隐藏掉,当系统不退出。第二次重新操作。点击button时会出错这是什么原因,如何解决
      

  4.   

    tx_1:=Ttx_1.Create(self); 
    改成
    tx_1:=Ttx_1.Create(Application); 
    或者 
    tx_1:=Ttx_1.Create(nil); 
      

  5.   

    楼上的兄弟,我想我的问题应该是比较清楚吧。我是听了你的意见,所以改变思路,把要关闭的窗口改为隐藏。但在隐藏实现中出现了问题。我用showwindow(tx_1.handle, sw_hide)代替了tx_1.Close; 当程序运行时,第一次点击这个安钮时,功能可以实现。但,重复操作,再次点击这个按钮时就出现问题了
      

  6.   

    老爸没了儿子哪里来
    tx_1:=Ttx_1.Create(application); 
      

  7.   

    哎!是 MDI 早就应该说清楚啊!if bx_xd=nil then 
      bx_xd:=Tbx_xd.Create(self); 
    bx_xd.Show; 
    tx_1.Close; 改为if bx_xd=nil then 
      bx_xd:=Tbx_xd.Create(Application)
    else
      bx_xd.Show; 
    tx_1.Close; 
      

  8.   

    分析一下这段代码:
    if bx_xd=nil then 
      bx_xd:=Tbx_xd.Create(self); 
    bx_xd.Show; 
    tx_1.Close; 
    end;bx_xd是一个窗体类的变量,没错吧? bx_xd:=Tbx_xd.Create(self); 这句是将bx_xd实例化,没错吧?
    那么楼上的朋友们有没有想过Tbx_xd.Create(self)这句的Create方法需要的参数是甚?这个参数是用来
    做甚滴? 这里的Create方法需要传入一个Owner参数,Owner参数是拿来做甚滴? 不用我说了吧.
    Tbx_xd.Create(self); 这句传入了self,这里self就是tx_1,没有错吧? 那么tx_1.Close; 这句是把
    tx_1销毁了,那么此时bx_xd也会跟着被销毁.改为 tx_1:=Ttx_1.Create(application); 是对的(这个楼上已经有人指出来了).
    不过,如果你还是没有能把你想要的窗体正确显示出来,我觉得就很遗憾了,个人认为应该是你程序的流程不
    正解所致.写程序一定要明确整个程序的运行流程,学会分析流程和跟踪调试程序是非常重要滴. 相信你会搞定这个小问题的.  GOOD LUCK.