请大家帮加注释,越细越好,最好每句后面都有,谢谢大哥们。。。
void __fastcall TForm1::SelRow(TObject *Sender)
{ // 设定选中
int iLine = StringGrid1->Row;
if(iLine<1) return;
int iCol = StringGrid1->Col;
if(iCol!=10) return;
if( Trim(StringGrid1->Cells[1][iLine]).IsEmpty() ) return;
if( Trim(StringGrid1->Cells[10][iLine]).AnsiCompare("√")==0 )
StringGrid1->Cells[10][iLine] = "";
else
StringGrid1->Cells[10][iLine] = "√";
}
//------------------------显示波形图---------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{ //绘制选中编码图
Form2->Width=1020; //再form2窗口宽度
Form2->Height=550; //再form2窗口高度
Form2->Show(); //再form2窗口中显示
Form2->Canvas->Brush->Style=bsClear;
Form2->Canvas->Brush->Color = clWhite;
Form2->Canvas->Pen->Style=bsSolid;
Form2->Canvas->Pen->Width = 2;
Form2->Canvas->Pen->Color = clBlack;
Form2->Canvas->Rectangle(20,10,990,420); // 矩形框坐标
int iLine = 1;
for(int i=1; i<=StringGrid1->Row && iLine<7; i++)
{
if( Trim(StringGrid1->Cells[1][i]).IsEmpty() ) continue;
if( Trim(StringGrid1->Cells[10][i]).AnsiCompare("√")!=0 ) continue;
DoImage(i, iLine++); // 打"√"的绘制波形
}
}
//----------------------------绘制图像-----------------------------------------------
void __fastcall TForm1::DoImage(int iRow, int Nums)
{
int iLine = iRow;
int LowPos = 20 + Nums * 50;
int HighPos = LowPos - 35;
int ud[4];
AnsiString ID = StringGrid1->Cells[1][iLine];
int v1 = 10 * StrToIntDef(StringGrid1->Cells[2][iLine], 0); // 起始码A
int v2 = 10 * StrToFloatDef(StringGrid1->Cells[3][iLine], 0); // 起始码B
ud[0] = StrToIntDef(StringGrid1->Cells[4][iLine], 0); // 用户码1
ud[1] = StrToIntDef(StringGrid1->Cells[5][iLine], 0); // 用户码2
ud[2] = StrToIntDef(StringGrid1->Cells[6][iLine], 0); // 数据码
ud[3] = StrToIntDef(StringGrid1->Cells[7][iLine], 0); // 数据反码
Form2->Canvas->Pen->Width = 1;
Form2->Canvas->Pen->Color = clRed;
Form2->Canvas->MoveTo(20,HighPos); // 起始坐标点 经测算,定义1ms宽度为10个像素点
Form2->Canvas->LineTo(20+v1, HighPos); // 起始码A
Form2->Canvas->LineTo(20+v1, LowPos); //
v2=abs(v2); // ??? 此处请思考 【+、- 代表正负电平】
Form2->Canvas->LineTo(20+v1+v2, LowPos); // 起始码B
Form2->Canvas->Pen->Color = clBlack;
Form2->Canvas->LineTo(20+v1+v2, HighPos-5);
Form2->Canvas->LineTo(20+v1+v2, LowPos+5);
int x0=20+v1+v2;
unsigned char udx;
for(int j=0; j<4; j++)
{ udx = (char)ud[j];
for(int i=0; i<8; i++)
{ if( udx & (0x80>>i) )
{ Form2->Canvas->LineTo(x0, HighPos);
Form2->Canvas->LineTo(x0+6, HighPos);
Form2->Canvas->Pen->Color = clRed;
Form2->Canvas->LineTo(x0+6, LowPos);
Form2->Canvas->LineTo(x0+6+17, LowPos); // 1 高电平0.56ms,低电平1.69
x0=x0+6+17; // 换算为:高电平6个点,低电平17个点
}
else
{ Form2->Canvas->LineTo(x0, HighPos);
Form2->Canvas->LineTo(x0+6, HighPos);
Form2->Canvas->Pen->Color = clRed;
Form2->Canvas->LineTo(x0+6, LowPos); // 0 高电平0.56ms,低电平0.56
Form2->Canvas->LineTo(x0+6+6, LowPos); // 换算为:高电平6个点,低电平6个点
x0=x0+6+6;
}
}
Form2->Canvas->Pen->Color = clBlack;
Form2->Canvas->LineTo(x0, HighPos-5);
Form2->Canvas->LineTo(x0, LowPos+5);
}
Form2->Canvas->Pen->Color = clBlack; // 停止位
Form2->Canvas->LineTo(x0, HighPos);
Form2->Canvas->LineTo(x0+6, HighPos);
Form2->Canvas->LineTo(x0+6, LowPos);
Form2->Canvas->LineTo(x0+6+51, LowPos);
Form2->Canvas->TextOutA(x0+6+40, HighPos+10, ID);
}
//---------------------------清除绘图------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // 清除绘图
Form2->Canvas->Brush->Style=bsClear;
Form2->Canvas->Brush->Color = clWhite;
Form2->Canvas->Pen->Style=bsSolid;
Form2->Canvas->Pen->Width = 2;
Form2->Canvas->Pen->Color = clBlack;
Form2->Canvas->Rectangle(20,10,990,420); // 矩形框坐标
}
//---------------------------------------------------------------------------
// 将16进制数据转成字符串
String __fastcall TForm1::HexToStr(const char* pHex, int iSize)
{
String strHex;
for(int iIndex = 0; iIndex < iSize; iIndex++)
{
int iValueHigh = *(pHex + iIndex)/16;
// strHex += itoa(iValueHight,strHex);
// itoa(iValueHight,strHex,16);
int iValueLow = *(pHex + iIndex)%16;
if ( (iIndex+ 1) < iSize )
{
// strHex += itoa(iValueLow) + " ";
}
}
return strHex;
}
[解决办法]
内容有点多,不过考虑到60分的话就写写
void __fastcall TForm1::SelRow(TObject *Sender)
{ // 设定选中
int iLine = StringGrid1->Row; // 取得选中的行
if(iLine<1) return; // 如果没有选中第一行之外的行
int iCol = StringGrid1->Col; // 取得选中的列
if(iCol!=10) return; // 如果选中的列不是第10列
if( Trim(StringGrid1->Cells[1][iLine]).IsEmpty() ) return; // 如果选中行的第2单元格的文本去掉两端空格后为空
if( Trim(StringGrid1->Cells[10][iLine]).AnsiCompare("√")==0 ) // 如果选中行的第1列的文本在去掉两端空格后是对号的话
StringGrid1->Cells[10][iLine] = ""; // 就设定这一单元格为空
else
StringGrid1->Cells[10][iLine] = "√"; // 否则的话就设为对号
}
//------------------------显示波形图---------------------------------------------------
void __fastcall TForm1::Button5Click(TObject *Sender)
{ //绘制选中编码图
Form2->Width=1020; //再form2窗口宽度
Form2->Height=550; //再form2窗口高度
Form2->Show(); //再form2窗口中显示
Form2->Canvas->Brush->Style=bsClear; // 设置窗体二画刷样式为清除
Form2->Canvas->Brush->Color = clWhite; // 设置画刷颜色为白的
Form2->Canvas->Pen->Style=bsSolid; // 设置笔样式为实线
Form2->Canvas->Pen->Width = 2; // 笔宽度为2
Form2->Canvas->Pen->Color = clBlack; // 笔样式为黑色
Form2->Canvas->Rectangle(20,10,990,420); // 矩形框坐标
int iLine = 1;
for(int i=1; i<=StringGrid1->Row && iLine<7; i++) //
{
if( Trim(StringGrid1->Cells[1][i]).IsEmpty() ) continue; // 如果指定单元格的文本在去掉两端空格后为空的话就跳过本次循环
if( Trim(StringGrid1->Cells[10][i]).AnsiCompare("√")!=0 ) continue; // 如果指定行的指定列的单元格文本在去掉两端空格后不是对号的话就跳过本次循环
DoImage(i, iLine++); // 打"√"的绘制波形
}
}
//----------------------------绘制图像-----------------------------------------------
void __fastcall TForm1::DoImage(int iRow, int Nums)
{
int iLine = iRow;
int LowPos = 20 + Nums * 50;
int HighPos = LowPos - 35;
int ud[4];
AnsiString ID = StringGrid1->Cells[1][iLine]; // 取得指定单元格的值
int v1 = 10 * StrToIntDef(StringGrid1->Cells[2][iLine], 0); // 起始码A
int v2 = 10 * StrToFloatDef(StringGrid1->Cells[3][iLine], 0); // 起始码B
ud[0] = StrToIntDef(StringGrid1->Cells[4][iLine], 0); // 用户码1
ud[1] = StrToIntDef(StringGrid1->Cells[5][iLine], 0); // 用户码2
ud[2] = StrToIntDef(StringGrid1->Cells[6][iLine], 0); // 数据码
ud[3] = StrToIntDef(StringGrid1->Cells[7][iLine], 0); // 数据反码
Form2->Canvas->Pen->Width = 1; // 设置画笔的宽度
Form2->Canvas->Pen->Color = clRed; // 颜色
// MoveTo(移动画笔位置)和LineTo(画直线)是windows的API
Form2->Canvas->MoveTo(20,HighPos); // 起始坐标点 经测算,定义1ms宽度为10个像素点
Form2->Canvas->LineTo(20+v1, HighPos); // 起始码A
Form2->Canvas->LineTo(20+v1, LowPos); //
v2=abs(v2); 求整数的绝对值 // ??? 此处请思考 【+、- 代表正负电平】
Form2->Canvas->LineTo(20+v1+v2, LowPos); // 起始码B
Form2->Canvas->Pen->Color = clBlack;
Form2->Canvas->LineTo(20+v1+v2, HighPos-5);
Form2->Canvas->LineTo(20+v1+v2, LowPos+5);
int x0=20+v1+v2;
unsigned char udx;
for(int j=0; j<4; j++)
{ udx = (char)ud[j];
for(int i=0; i<8; i++)
{ if( udx & (0x80>>i) )
{ Form2->Canvas->LineTo(x0, HighPos);
Form2->Canvas->LineTo(x0+6, HighPos);
Form2->Canvas->Pen->Color = clRed;
Form2->Canvas->LineTo(x0+6, LowPos);
Form2->Canvas->LineTo(x0+6+17, LowPos); // 1 高电平0.56ms,低电平1.69
x0=x0+6+17; // 换算为:高电平6个点,低电平17个点
}
else
{ Form2->Canvas->LineTo(x0, HighPos);
Form2->Canvas->LineTo(x0+6, HighPos);
Form2->Canvas->Pen->Color = clRed;
Form2->Canvas->LineTo(x0+6, LowPos); // 0 高电平0.56ms,低电平0.56
Form2->Canvas->LineTo(x0+6+6, LowPos); // 换算为:高电平6个点,低电平6个点
x0=x0+6+6;
}
}
Form2->Canvas->Pen->Color = clBlack;
Form2->Canvas->LineTo(x0, HighPos-5);
Form2->Canvas->LineTo(x0, LowPos+5);
}
Form2->Canvas->Pen->Color = clBlack; // 停止位
Form2->Canvas->LineTo(x0, HighPos);
Form2->Canvas->LineTo(x0+6, HighPos);
Form2->Canvas->LineTo(x0+6, LowPos);
Form2->Canvas->LineTo(x0+6+51, LowPos);
Form2->Canvas->TextOutA(x0+6+40, HighPos+10, ID); // 在指定位置画出字符串
}
//---------------------------清除绘图------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{ // 清除绘图
Form2->Canvas->Brush->Style=bsClear; // 上面有
Form2->Canvas->Brush->Color = clWhite;
Form2->Canvas->Pen->Style=bsSolid;
Form2->Canvas->Pen->Width = 2;
Form2->Canvas->Pen->Color = clBlack;
Form2->Canvas->Rectangle(20,10,990,420); // 矩形框坐标
}
//---------------------------------------------------------------------------
// 将16进制数据转成字符串
String __fastcall TForm1::HexToStr(const char* pHex, int iSize)
{
// 这里都是些加减乘除
String strHex;
for(int iIndex = 0; iIndex < iSize; iIndex++)
{
int iValueHigh = *(pHex + iIndex)/16;
// strHex += itoa(iValueHight,strHex);
// itoa(iValueHight,strHex,16);
int iValueLow = *(pHex + iIndex)%16;
if ( (iIndex+ 1) < iSize )
{
// strHex += itoa(iValueLow) + " "; // itoa是把整数数字转为字符串,转换后一个一个连接到之前的字符串
}
}
return strHex;
}