procedure TfmKT_Main.Action_CreateYjycExecute(Sender: TObject);
var
  fmYjycMian:TfmKT_Yjyc_Main;
begin
  //fmYjycMian:=nil;
  if not Assigned(fmYjycMian) then
  begin
    fmYjycMian:=TfmKT_Yjyc_Main.Create(Application);
    fmYjycMian.Show;
  end;
end;实在是搞不定了.我用的是delphi2006.TfmKT_Yjyc_Main是MDI子窗体,想手工创建,已经从auto_create forms里面移到available forms里去了.想让TfmKT_Yjyc_Main只创建一个实例,从网上查了N久,都说用not Assigned,可是我弄了半天却不行,执行了if not Assigned(fmYjycMian) then 就结束了.为什么?请各位指教.

解决方案 »

  1.   

     fmYjycMian你定义成了局部变量,这里应该不用的
    在TfmYjycMian的单元文件里面,应该有一个
     fmYjycMian的全局变量
    所以你只要引用单元就行了!
    procedure TfmKT_Main.Action_CreateYjycExecute(Sender: TObject);  
    begin 
      if not Assigned(fmYjycMian) then 
      begin 
        fmYjycMian:=TfmKT_Yjyc_Main.Create(Application); 
        fmYjycMian.Show; 
      end; 
    end; 在TTfmKT_Main.OnClose上加上:
    Action := caFree;
    fmYjycMian := nil;
      

  2.   

    if not.....then 就结束了自然说明该窗体已经创建了。你看一下在工程文件里有没有把Tfmkt_Yjyc_main的窗体的创建过程注释掉。
      

  3.   

    MDIChild关闭的时候加一句frmMDIChild:=nil;
      

  4.   

    谢谢,按chenzhuo的方法是对的.没问题,不过我还是不明白,我那样写为什么不行呢?
      

  5.   

    我的办法是在TfmKT_Yjyc_Main声明的单元里面创建一个public函数function GetFrm_KT_Yjyc_Main: TfmKT_Yjyc_Main;
    const
      Instance: TfmKT_Yjyc_Main = nil;
    begin
      if not Assigned(Instance) then
        Instance := TfmKT_Yjyc_Main.Create(Application);
      Result := Instance;
    end;在implementation部分添加{$WRITEABLECONST ON}标记允许改写const变量。以后使用窗体的时候,就调用 GetFrm 函数就可以了。
      

  6.   

    至于 “执行了if not Assigned(fmYjycMian) then 就结束” 那是因为var声明的fmYjycMian初始状态就是nil,后面使用if判断是否为nil只有一个结果,所以编译器在处理过程中就把这句话给优化掉了。你在if哪里设置断点可能在调试过程中就显示为不可用断点,直接跳过。