我想从库中的数据表导到stringgrid,想做成比较直观一点的输入界面,把时间字段(sjd)作为行,把数据项目和数据编号字段作为两列输出,可是运行下面的程序时出错,原因是写到ADO_sjz时找不到fieldbyname,但我上次也是遇到这种情况我就照样写进去,结果就得了,可这次就是不得!请帮帮忙看一下哪里出错,若有怎么更好的更方便的更为直观的数据输入界面的控件请告诉我好吗?因为要做一个不同时段对同样的多条数据项目输入数据!要能让用户一眼就能看完各时段的数据和输入各时段的数据.以下是程序:
procedure Tsjxmzlr.Button1Click(Sender: TObject);
var
   i:integer;
   j:integer;
begin
    with ADOQ_sjz do
    begin
     ADOQ_sjz.Close;
     ADOQ_sjz.SQL.Clear;
     ADOQ_sjz.SQL.Text := 'select phid,sjmc from hymcb where lxmc=:lxmc';
     ADOQ_sjz.Parameters.ParamByName('lxmc').Value := trim(cb_lx.Text);
     ADOQ_sjz.Open;
     for i:=0 to ADOQ_sjz.RecordCount-1 do
     begin
      SG_sjz.Cells[0,i] := ADOQ_sjz.fieldbyname('phid').AsString;
      SG_sjz.Cells[1,i] := ADOQ_sjz.fieldbyname('sjmc').AsString;
      ADOQ_sjz.Next;
     end;
    end;
      with ADOQ_sjz do
       begin
        ADOQ_sjz.Close;
        ADOQ_sjz.SQL.Clear;
        ADOQ_sjz.SQL.Text := 'select sjd from sjb where bd=:bd';
        ADOQ_sjz.Parameters.ParamByName('sjd').Value := trim(CBB_bd.Text);
        ADOQ_sjz.Open;
        for j:=0 to ADOQ_sjz.RecordCount-1 do
         begin
          SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error] sjzlr.pas(118): Incompatible types: 'TStrings' and 'String'
          ADOQ_sjz.Next;
         end;
end;

解决方案 »

  1.   

    你这里With do没什么用,你下面的程序试试
    procedure Tsjxmzlr.Button1Click(Sender: TObject);
    var
       i:integer;
       j:integer;
    begin
         ADOQ_sjz.Close;
         ADOQ_sjz.SQL.Clear;
         ADOQ_sjz.SQL.Text := 'select phid,sjmc from hymcb where lxmc=:lxmc';
         ADOQ_sjz.Parameters.ParamByName('lxmc').Value := trim(cb_lx.Text);
         ADOQ_sjz.Open;
         for i:=0 to ADOQ_sjz.RecordCount-1 do
         begin
          SG_sjz.Cells[0,i] := ADOQ_sjz.fieldbyname('phid').AsString;
          SG_sjz.Cells[1,i] := ADOQ_sjz.fieldbyname('sjmc').AsString;
          ADOQ_sjz.Next;
         end;
         ADOQ_sjz.Close;
         ADOQ_sjz.SQL.Clear;
         ADOQ_sjz.SQL.Text := 'select sjd from sjb where bd=:bd';
         ADOQ_sjz.Parameters.ParamByName('sjd').Value := trim(CBB_bd.Text);
         ADOQ_sjz.Open;
         for j:=0 to ADOQ_sjz.RecordCount-1 do
         begin
           SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error] sjzlr.pas(118): Incompatible types: 'TStrings' and 'String'
           ADOQ_sjz.Next;
         end;
    end;
      

  2.   

    SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error] 找到错误啦 应该是.ASSTRING;  你少打个S, 呵呵,不细心
      

  3.   

    提示说你的类型不对哦,你试一下把
    SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astring;
    改成:
    SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').Value
      

  4.   

    主要是写到这里ADOQ_sjz时后面的不弹出fieldbyname,所以后面也就没有Value和asstring了!为什么呢?
      

  5.   

    我的也不弹出,但是写下去就行 DELPHI对ADO的技术支持不太好.但是后面能弹出Value和asstring
      

  6.   

    SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astringproperty Cols[Index: Integer]: TStrings;两个类型不一致
      

  7.   

    可以了,是这里出错:SG_sjz.Cols[j]应该改为:SG_sjz.CELLs[j,0]这们就能运行,不过得来的界面不能输入数据,怎么办啊?我是想让用户在比较直观的界面上输入数据的!大家有怎么更好的办法吗?
    比如:    1:30  2:00  2:30  3:00  
      项目一  20    30    20    30
      项目二  20    30    10    30
      项目三  20    50    10    20
      项目四  54    30    90    10
    在数据库中数据项目是一个字段,时间是一个字段,数据值是一个字段.
    这种怎么做啊?
      

  8.   

    应该是.asstring;而不是.astring; 你再好好看看你的程序
      

  9.   

    你用的是TStringGrid吧,这个是不能接受输入的你可以在OnDblClick事件中获取当前选中的Cell,然后弹出输入对话框接受用户输入,然后重写Cells[i,j]的值,最后提交数据库时自己通过程序控制SQL
      

  10.   

    要录入还是用DBGRID,
    或者你另外再开一个EDIT的窗口,当用户点击STRINGGRID的一个单元格的时候,将单元格的值送到EDIT窗口中,在这个EDIT中修改,然后保存到数据库中,再回显.procedure TForm15.StringGrid1SelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    begin
       stringgrid1.InstanceSize;
       edit1.Text :=stringgrid1.Cells[acol,arow];      
       a:=acol;
       b:=arow;
    end;
    回显操作:strtofloat(stringgrid1.Cells[a,b]):=edit1.text ;  //a,b是全局变量.
      

  11.   

    呵呵,告诉你不能弹出fieldbyname是因为没有在fields editor里面加fields,TStringGrid吧,在options 里面把goediting true就行了。
      

  12.   

    procedure Tsjxmzlr.Button1Click(Sender: TObject);
    var
       i:integer;
       j:integer;
    begin
         ADOQ_sjz.Close;
         ADOQ_sjz.SQL.Clear;
         ADOQ_sjz.SQL.Text := 'select phid,sjmc from hymcb where lxmc=:lxmc';
         ADOQ_sjz.Parameters.ParamByName('lxmc').Value := trim(cb_lx.Text);
         ADOQ_sjz.Open;//这里,习惯问题
      ADOQ_sjz。First;
         for i:=0 to ADOQ_sjz.RecordCount-1 do
         begin
          SG_sjz.Cells[0,i] := ADOQ_sjz.fieldbyname('phid').AsString;
          SG_sjz.Cells[1,i] := ADOQ_sjz.fieldbyname('sjmc').AsString;
          ADOQ_sjz.Next;
         end;
         ADOQ_sjz.Close;
    //这里要清楚参数****************************************************
       Query1.Params.Clear;
         ADOQ_sjz.SQL.Clear;
         ADOQ_sjz.SQL.Text := 'select sjd from sjb where bd=:bd';
         ADOQ_sjz.Parameters.ParamByName('sjd').Value := trim(CBB_bd.Text);
         ADOQ_sjz.Open;
         for j:=0 to ADOQ_sjz.RecordCount-1 do
         begin
           SG_sjz.Cols[j] := ADOQ_sjz.fieldbyname('sjd').astring;//这里提示错误:[Error] sjzlr.pas(118): Incompatible types: 'TStrings' and 'String'
           ADOQ_sjz.Next;
         end;
    end;
      

  13.   

    TString 类型,需要创建实例SG_sjz.Cols[j].Add(ADOQ_sjz.fieldbyname('sjd').astring)
      

  14.   

    可DBGRID怎么实现这种表格形式录入呢?我是想用这种表格形式录入的!怎么办啊?有没有怎么控件直接支持这种呢?
      

  15.   

    如果像liu_yq(春风不语的)所说的那样做的话太麻烦了,这样用户输入上百条数据不是太麻烦!所以希望各位高手帮忙!
      

  16.   

    问题是你为什么一定要用STRINGGRID.而不用DBGRID.
    我就是为了不编辑才用的STRINGGRID.
      

  17.   

    DbGrid有一定难度,不知道能实现不像楼主这样用表格某字段的数据来做列的,不知道能否通过Grid自动更新比如:    1:30  2:00  2:30  3:00  
      项目一  20    30    20    30
      项目二  20    30    10    30
      项目三  20    50    10    20
      项目四  54    30    90    10假设修改了第一个cell的数据,可能生成的SQL找不到1:30这个字段
    我具体没试过这种方法,如果可行,就权当我上面说的是废话了,我也搬根凳子学习下
      

  18.   

    将stringgrid的options里的goediting设成true就可以了。
    对于不想让用户编辑的表格单元在StringGrid1SelectCell事件里
    将canselect设成false
      

  19.   

    SG_sjz.Cols[0][j] := ADOQ_sjz.fieldbyname('sjd').AsString;//显示在第一列j行
      

  20.   

    非常感谢jsqth() 的教导!可以实现了我的想法!也谢谢大家的指导!