我在表单里放了一个TDBGridEh控件,想点击标题栏后排序,现在碰到问题,在TADBQuery未打开时点击标题栏,系统会提示:“Access violation at address 00546D09 in module 'project1.exe'.Read of address 00000000.”错误,请问如何判断TADBQuery?
//点击标题栏时调用排序函数
procedure TForm3.DBGridEh1TitleBtnClick(Sender: TObject; ACol: Integer;Column: TColumnEh);
begin
   //我写下句的目的:数据集打开并且记录数不为零才执行排序函数,可是,试后这样判断数据集是否已打开会提示上面的错误,请问如何判断
   if (query_gonghao.Active=true) and (query_gonghao.RecordCount<>0) then
   my_sort(dbgrideh1);
end;//排序函数
procedure TForm3.my_sort(grid:TDBGridEh);
begin
  //注意:用该函数时,要先引用EhLibADO,否则不会排序
  grid.OptionsEh:=grid.OptionsEh+[dghAutoSortMarking];
  grid.ColumnDefValues.Title.TitleButton:=true;
  grid.SortLocal:=true;
end;

解决方案 »

  1.   

    是ADOQuery吧
    判断是否打开就是if ADOQuery.Active
    你的query_gonghao对象是在哪里创建的,是否没有Create,或Create了又被Free
      

  2.   

    我的目的是在ADOQuery未打开时,直接返回,不让它执行排序功能。procedure TForm3.DBGridEh1TitleBtnClick(Sender: TObject; ACol: Integer;Column: TColumnEh);
    begin
    if query_gonghao.Active=true then
       my_sort(dbgrideh1);
    end;//(下面过程是控件开发商提供的,在EhLibADO单元里)
    //象上面那样写判断语句的话,如果数据集未打开时会跳过my_sort(dbgrideh1),但是,仍然会进入TDBGridEh控件开发商提供的排序函数内,其原始代码如下:procedure TADOSQLDatasetFeaturesEh.ApplySorting(Sender: TObject;
      DataSet: TDataSet; IsReopen: Boolean);
    begin
      if Sender is TCustomDBGridEh then
        if TCustomDBGridEh(Sender).SortLocal then
          SortDataInADODataSet(TCustomDBGridEh(Sender), TCustomADODataSet(DataSet))
        else
          //执行到该局时就提示内存访问错误了
          inherited ApplySorting(Sender, DataSet, IsReopen);
    end;
      

  3.   

    我对TDBGridEh的排序做少许改动后,不会提示内存错误了(难道EhLib开发商也会搞错):
    procedure TADOSQLDatasetFeaturesEh.ApplySorting(Sender: TObject;
      DataSet: TDataSet; IsReopen: Boolean);
    begin
      if Sender is TCustomDBGridEh then
        if TCustomDBGridEh(Sender).SortLocal then
          SortDataInADODataSet(TCustomDBGridEh(Sender), TCustomADODataSet(DataSet))
        else
          if DataSet.Active=true then //加上该句后就不会提示内存错误了
          inherited ApplySorting(Sender, DataSet, IsReopen);
    end;