请阁下注意你的这一段代码:
  sql.Clear;
  sql.Text:='select max(Cno) from communicate';
  open;
  no:=fields[6].Asinteger+1;
你这里使用的SQL查询语句,所返回的结果集只有一个字段,即是max(Cno),因此no:=fields[6].Asinteger+1;这一句中,Fields[6]是不存在的,因此提示列表下标超出范围。
还有,请程式的书写规范。