type   
  TfrmNewItem   =   class(TForm)   
  private                         
    {   Private   declarations   }   
    tmpType:Integer;
  public                          
    {   Public   declarations   }   
    procedure ShowForm(mType:Integer);
  end;   var
  frmNewItem: TfrmNewItem;implementationprocedure TfrmNewItem.ShowForm(mType:Integer);
begin
  if frmNewItem = nil then
    frmNewItem:=TfrmNewItem.Create(nil);  try
    tmpType:=mType;    frmNewItem.ShowModal;
  finally
    Free;
    frmNewItem:=nil;
  end;
end;在其他窗体里调用frmNewItem.ShowForm(100);执行到tmpType:=mType;时就出现非法访问。
请问为什么会出现这样的情况?在tmpType:=mType;之前不是已经创建了frmNewItem,为何还会出现非法访问

解决方案 »

  1.   

    procedure TfrmNewItem.ShowForm(mType:Integer); 
    begin 
      if frmNewItem = nil then 
        frmNewItem:=TfrmNewItem.Create(Owner);   try 
        tmpType:=mType; 
        frmNewItem.ShowModal; 
      finally 
        Free; 
        frmNewItem:=nil; 
      end; 
    end;
      

  2.   

    TfrmNewItem.ShowForm执行这个函数时,对象还没有创建!!!!!TfrmNewItem.ShowForm执行这个函数时,会有两参数入栈,第一个是TfrmNewItem对象指针,另一个是自己的mType:Integer第一个对象指针肯定是NIL,因为你还没有创建就调用了。所以访问对象的数据成员tmpType时就报错了。
      

  3.   

    既然frmNewItem是全局变量,那么可以在initialization和finalization里面创建和释放。