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,再次循环就一直是一了???
{ 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,再次循环就一直是一了???
int max_row = m_Grid.GetItemCount();
for(tru_row = 0;tru_row <= max_row; tru_row++)
其实我定义ListCtrl时把所有的第一列都插入了数据的,但是只做序号来用,不用写入TXT文件件里面的,所以所有判断都把第一列给跳过去。我插入第一列数据时就定义了100行,所以这里用100,和你用GetItemCount()得到的是一样的,我调试运行了一下,应该问题出在if判断语句哪里了!当为空的时候tru_row还是++,就不知道为什么了?
{
if(m_Grid.GetItemText(tru_row,1).IsEmpty()) continue;
//tru_row++;}
对。不管是否m_Grid.GetItemText(tru_row,1).IsEmpty()
由于tru_row <= max_row;tru_row++
tru_row 最终会到101,如果最后有内容再由于tru_row++;最后tru_row = 102
调试一下
看看执行过程
谢谢大家
这个程序最关键的还有个问题:
//*********************************//
................................
................................
{
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)这样比较就问题解决了