var
  frm:TfrmChange;
begin
  frm := TfrmChange.Create(nil);
  with frm do
  begin
    try
      EmpNum := dbgrdh1.DataSource.DataSet.FieldByName('EmpNo').AsString;
//调试到这里的把鼠标放到DataSet上面显示:DataSet Variable 'Self'inassessible here due to optimizition,是什么原因呢?
      EmpName := dbgrdh1.DataSource.DataSet.FieldByName('EmpName').AsString;
      ShowModal;
    finally
      Free;
    end;
  end;

解决方案 »

  1.   


    procedure TfrmHRMRegister.actContractExecute(Sender: TObject);
    var
      frm:TfrmContract;
    begin
      frm := TfrmContract.Create(nil);
      with frm do
      begin
        try
          EmpNum := dbgrdh1.DataSource.DataSet.FieldByName('EmpNo').AsString;
          EmpName := dbgrdh1.DataSource.DataSet.FieldByName('EmpName').AsString;
          ShowModal;
        finally
          Free;
        end;
      end;
    end;procedure TfrmHRMRegister.actUndergoExecute(Sender: TObject);
    var
      frm:TfrmUndergo;
    begin
      frm := TfrmUndergo.Create(nil);
      with frm do
      begin
        try
          EmpNum := dbgrdh1.DataSource.DataSet.FieldByName('EmpNo').AsString;
          EmpName := dbgrdh1.DataSource.DataSet.FieldByName('EmpName').AsString;
          ShowModal;
        finally
          Free;
        end;
      end;
    end;
    这里2个按钮的代码, 一个会出错, 一个不会出错。 为什么呢? 如果是内存没有释放,为什么另外一个不会呢?
      

  2.   

    可能是因为你创建的窗体里面包含释放自身的代码并且被执行了,例如在TfrmContract的OnClose事件里有Self.Free
      

  3.   

    检查过, 没有, 而且我都还没有Show这个窗体出来
      

  4.   

    我能问一下你的dbgrdh1与是不是存在于TfrmHRMRegister及TfrmChange类中,
    我没有猜错的话就是WITH所引起的错误.为什么呢?
    procedure TfrmHRMRegister.actUndergoExecute(Sender: TObject);
    var
      frm:TfrmUndergo;
    begin
      frm := TfrmUndergo.Create(nil);
      with frm do
      begin
        try
          EmpNum := dbgrdh1.DataSource.DataSet.FieldByName('EmpNo').AsString;
          EmpName := dbgrdh1.DataSource.DataSet.FieldByName('EmpName').AsString;
          ShowModal;
        finally
          Free;
        end;
      end;

    end;拿你这个来分析,如果你的TfrmUndergo类中也有一个dbgrdh1;哪么上面的代码相当于procedure TfrmHRMRegister.actUndergoExecute(Sender: TObject);
    var
      frm:TfrmUndergo;
    begin
      frm := TfrmUndergo.Create(nil);
       
        try
          frm.EmpNum := frm.dbgrdh1.DataSource.DataSet.FieldByName('EmpNo').AsString;
          frm.EmpName := frm.dbgrdh1.DataSource.DataSet.FieldByName('EmpName').AsString;
          ShowModal;
        finally
          Free;
        end;
      

    end;
    这个时侯拿到的DBGRDH1就不对了,
    但如果这样改.
    procedure TfrmHRMRegister.actUndergoExecute(Sender: TObject);
    var
      frm:TfrmUndergo;
    begin
      frm := TfrmUndergo.Create(nil);
      with frm do
      begin
        try
          EmpNum := self.dbgrdh1.DataSource.DataSet.FieldByName('EmpNo').AsString;
          EmpName := self.dbgrdh1.DataSource.DataSet.FieldByName('EmpName').AsString;
          ShowModal;
        finally
          Free;
        end;
      end;

    end;
    就正确了.