procedure Txinzengfm.FormShow(Sender: TObject);
var
  i, j: Integer; //定义两个整型变量用来循环行和列
begin
  ADODataSet2.Open;
  StringGrid1.RowCount := ADODataSet2.RecordCount + 1; //定义StringGrid1的行数
  j := 0; //赋初值
  while not ADODataSet2.Eof do
  begin
    for i := 0 to ADODataSet2.FieldCount - 2 do //字段数为什么要减2呢,因为StringGrid1的列数是从0开始的,要减掉1外,ADODataSet2里的备注一个字段也不要的,
    StringGrid1.Cells[i + 1, j + 1] := ADODataSet2.Fields[i].AsString; //?
    ADODataSet2.Next; {这样就在第二列里的第二行开始,不停的把ADODataSet2的字段循环给StringGrid1的格子赋值}
    Inc(j); {i在0到1之间循环一次的时候,j才加1,如[1,1]、[2,1],然后是[1,2]、[2,2],然后是[1,3]、[2,3]这样一直下去的}
  end;
  说明:(1)ADODataSet2连接的表有三个字段,只取前面的两个,
        (2)后面的注释是我理解的,不一定是对的,
        (3)这个程序是可以正常运行的。
  问题1:
      在“?”前面那句我不清楚Fields[i]里“i”的意思,应该循环次数等于StringGrid1的行数呀?
  问题2:
   我对“Inc(j); {i在0到1之间循环一次的时候,j才加1,如[1,1]、[2,1],然后是[1,2]、[2,2],然后是[1,3]、[2,3]这样一直下去的}”的解释不知道是不是这样的,但“j”到底到多少才停止呢?