void CGcodeDlg::OnButsave() 
{  for(tru_row = 0;tru_row <= 100;tru_row++)
       {
 if(!m_Grid.GetItemText(tru_row,1).IsEmpty())
 tru_row++;       }
}判断listctrl中每一行的第一列不为空时,tru_row加1
我只在列表第一行和第二行的第一列输入了数据
可是tru_row还是加到了101
错在哪里了呢?void CGcodeDlg::OnButsave() 
{
// TODO: Add your control notification handler code here
 
char * daoku1[10] =  {"T1","T2","T3","T4","T5","T6"};
char * daoku2[10] =  {"T7","T8","T9","T10","T11"}; 
char * changesword[101] = {{0}}; 
int max_col = 5;
int max_row = 100;
    int tru_row ;

int xdk[101] = {0};
int ydk[101] = {0};
int jxdk = 0;
int jydk = 0;
    int dk = 1;
int pre_af_dk[101];
 
CString filetext;
    CString itemtext;  CString filename = _T("d:\\data.txt");
 try
 { 
      CFile file(filename,CFile::modeCreate | CFile::modeWrite | CFile::shareExclusive);
 for(tru_row = 0;tru_row <= max_row;tru_row++)
       {
 if(!m_Grid.GetItemText(tru_row,1).IsEmpty())
 tru_row++;       }
 
 
 for (int row = 0; row < tru_row; row++)
 {
  int xm = 0,xn = 0;
//          for (int col = 1; col <= 1; col++)
//    {       CString temp_row = m_Grid.GetItemText(tru_row,1);
       if(temp_row.IsEmpty())
 {
 MessageBox("输入数据");
 return;
 }                       //check if any characters have been written
       int col = 1;
  
                  if(col == 1)  /*判断刀库*/
  {
      int n = 0;
      char *str[10];
      CString temp_1 = m_Grid.GetItemText(row,col);
      char *buf = temp_1.GetBuffer(temp_1.GetLength()+1);     //char *ch = cstr.GetBuffer(cstr1.GetLength() + 1);  temp_1.ReleaseBuffer();
      changesword[dk] = buf;
 
 if (row >= 1 && (strcmp(changesword[dk-1],changesword[dk]) == 0))

 {
 pre_af_dk[dk] = 1;
 dk++;
 }
  else
  {
  pre_af_dk[dk] = 0;
  dk++;
  }  
      char steps[] = " \n"; 
      while ((str[n] = strtok(buf,steps)) != NULL)
 {
       n++;       buf = NULL;
 }
    for (int y = 0; y <= 5; y++)

 { 
for (int x = 0; x < n; x++)
{
  if (strcmp(daoku1[y], str[x]) == 0 )
{
xdk[jxdk++] = 1;
ydk[jydk++] = 0;
      xm = 1;
} }
 
}
for (int z = 0; z <=4; z++)
{
for (int x = 0; x < n; x++)
{
if (strcmp(daoku2[z], str[x]) == 0 )
{
ydk[jydk++] = 1;
xdk[jxdk++] = 0;
xn = 1;
}
} }
if(xm && xn)
{
SetTimer(150,10000,NULL);
MessageBox("输入刀号有错,请重新输入", "Error", MB_ICONERROR | MB_OK );
return;
}
                      }  // exit    if(col == 1)
                    col++;
//  }   //exit column cycle
 if ((row == 0) && xm && col >=1)  //判断第一行并且第1列输入字符串属于daodu1[]  {
    itemtext += m_Grid.GetItemText(0,1);
 itemtext += "\40M13 M8\r\n";
 }
 else if ((row == 0) && xn && col >=1)         //判断第一行并且第1列输入字符串属于daodu2[]  {
itemtext += m_Grid.GetItemText(0,1);  
 itemtext += "\40M14 M10\r\n";
 }
 else if (row >= 1 && (pre_af_dk[row]))//大于等于1行时并且当前列1与第一列1的数据相同时(判断字符串是否相同这里是不是有问题?)  {
 itemtext += "X";
 itemtext += m_Grid.GetItemText(row,2);
 }
 else if (row >= 1 && (!pre_af_dk[row]) && (xm && xdk[row-1]) || (xn && ydk[row-1]))    //大于等于1行,同时当前列1与前一列1数据不相同时  当前列1是属于daoku1
 {
                  itemtext += m_Grid.GetItemText(row,1);
 itemtext += "\r\n";
 itemtext += "G99 G81\40";
 itemtext += "\40R5\r\n";
 }
 
 
      else if(xn && ydk[jydk] && row >= 1 && (!pre_af_dk[row]))//大于等于1行,同时当前列1与前一列1数据不相同时  当前列1是属于daoku2 (这几个判断条件是不问题??)
  {
        …………………                                               ……                                           ……………………
                                               …………………………
  }
    else if (xn && xdk[jxdk] && row >= 1 && (!pre_af_dk[row]))
{
 itemtext += "M41 Q50";
//   itemtext += "\40R5\r\n";
//  }
  
 }  //exit row cycle
 itemtext += "Y20 U60  R30";
 CString temp;
 temp.Format("%s",itemtext);
 //  if(!temp.IsEmpty())
 
  filetext += temp;
      filetext += "\r\n";
      file.Write(filetext.GetBuffer(2),filetext.GetLength());
  file.Close();
 }
     catch(CFileException *e)
 {
 e->Delete();
 }
     MessageBox("保存完毕");
  
}
最后四个else if的判断不能按预想的去做?应该是出在判断条件哪里有问题?请高手帮找下问题,
还有在循环里面定义了变量,第一次循环里变量的值改变了,下次再循环时还赋初值吗?(象上面定义的 int xm = 0; 和 int xn = 0 ;)这里是不是只要赋值为1,再次循环就一直是一了???

解决方案 »

  1.   

    int allRows=m_Grid.GetItemCount( ); for(tru_row = 0;tru_row <= allRows /* 100 */;tru_row++)
      

  2.   

    以前是定义了一个
    int max_row = m_Grid.GetItemCount();
    for(tru_row = 0;tru_row <= max_row; tru_row++)  
    其实我定义ListCtrl时把所有的第一列都插入了数据的,但是只做序号来用,不用写入TXT文件件里面的,所以所有判断都把第一列给跳过去。我插入第一列数据时就定义了100行,所以这里用100,和你用GetItemCount()得到的是一样的,我调试运行了一下,应该问题出在if判断语句哪里了!当为空的时候tru_row还是++,就不知道为什么了?            
      

  3.   

    for(tru_row = 0;tru_row <= max_row;tru_row++)
    {
        if(m_Grid.GetItemText(tru_row,1).IsEmpty()) continue;
    //tru_row++;}
      

  4.   


    对。不管是否m_Grid.GetItemText(tru_row,1).IsEmpty()
    由于tru_row <= max_row;tru_row++ 
    tru_row 最终会到101,如果最后有内容再由于tru_row++;最后tru_row = 102
      

  5.   

    后面的哪些else if 语句是不是也有问题?
      

  6.   

    将m_Grid.GetItemText(tru_row,1)的值保存在一个变量里
    调试一下
    看看执行过程
      

  7.   


    谢谢大家
    这个程序最关键的还有个问题:
    //*********************************//
    ................................
    ................................
    {
    int n = 0;
    char *str[10];
    CString temp_1 = m_Grid.GetItemText(row,col);
    char *buf = temp_1.GetBuffer(temp_1.GetLength()+1); //char *ch = cstr.GetBuffer(cstr1.GetLength() + 1);temp_1.ReleaseBuffer();
    changesword[dk] = buf;
      
    if (row >= 1 && (strcmp(changesword[dk-1],changesword[dk]) == 0))
    {
    pre_af_dk[dk] = 1;
    dk++;
    }
    ................................
    ................................
    //*********************************//
    上面红色部分比较是有问题的
    应该是和指针相关的
    我比较两个字符串直接就if(str1 == str2)这样比较就问题解决了