我想在dbgrid中增加序号,我用的是bde的query,想用其dataset的recno但其值总是-1,
用ado则无问题,但我由于是修改一个老程序,所以必须用bde实现,也不可能用sql语句实现,怎么办?

解决方案 »

  1.   

    我从网上看了一下老帖子,说bde只能连接本地的数据库,如果连接远程数据库则就是-1
    谁能给我一个肯定的回答,谢谢!
      

  2.   

    procedure Tform1.DBGrid1DrawColumnCell(Sender: TObject;
    const Rect: TRect; DataCol: Integer; Column: TColumn;
    State: TGridDrawState);
    begin
       if Column.Index = 0 then
       with DBGrid1.Canvas do
       begin
          FillRect(Rect);
          TextOut(Rect.Left+2, Rect.Top+2, IntToStr(DBGrid1.DataSource.DataSet.RecNo));
       end;
    end;
      

  3.   

    FCU(彩色铅笔)你的方法我用过,关键是TextOut(Rect.Left+2, Rect.Top+2, IntToStr(DBGrid1.DataSource.DataSet.RecNo))中的DBGrid1.DataSource.DataSet.RecNo值同样是-1,这就是我的问题所在呀。
    另:由于我是修改一个老系统,所以我不可能将数据引擎从bde改为ado。
      

  4.   

    不是哪种数据库都有RecNo的。
      

  5.   

    如果数据库不支持RECNO,只有在QUERY 增加自定义字段,再遍历一下所以记录进行编号。
      

  6.   

    bde连oracle之类数据,没有recno(它永远为-1)
    给你个参考
    http://www.51delphi.com/delphi/showtl?ID=46664
      

  7.   

    不是有计算字段吗?用这个.TForm1 *Form1;//全局变量
    int i=0;  
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------void __fastcall TForm1::Query1CalcFields(TDataSet *DataSet)
    {
      //计算字段的事件
      i++;
      DataSet->FieldByName("calc")->AsInteger = i;
    }BCB更熟些,是BCB的代码.不好意思.
      

  8.   

    楼上的,只要一滚动dbgrid,序号就不对了,不要说如果插入或删除
      

  9.   

    放一个TDataSetProvider连接原来的TTable或TQuery
    再放一个TClientDataSet连接TDataSetProvider,操作TClientDataSet就行了.
      

  10.   

    总结:搞了好几天,试过了网上各种方法,总结如下:
    1,在sql可以实现但是效率低.
    2,用sql结合临时表可以实现,但是不适合修改老系统,因为修改的工作量大.
    3,用query的recno实现不了,所以提醒后来者不要浪费时间.
    最后,我放弃了不提供此功能.
    最后谢谢各位,operfume(橘子香水) 的方法比较新颖,我准备再试试.