예제 #1
0
std::string WriteCodeFile::GetChild(NodeInfo* parent, NodeInfo* node)
{
	auto parent_name = parent->cd.className+std::to_string(parent->uuid);
	auto class_name = node->cd.className;
	auto child_name = class_name+std::to_string(node->uuid);
	auto e_type = node->cd.type;
	auto type = Tools::GetEnumToString(e_type);

	m_FileBuff += FileCreateNode(e_type, child_name, class_name);
	switch (e_type)
	{
	case NodeType::Action:
	case NodeType::Condition:
	case NodeType::Decorate:
		m_FileBuff += FileSetAttr(node->cd, child_name);
		break;
	default:
		m_FileBuff += FileSetAbort(node->abort_type, child_name);
		break;
	}
	m_FileBuff += FileAddChild(child_name, parent_name);

	std::string ret = "successs!!!";
	for (int i = 0; i<node->child_list.size(); i++)
	{
		ret = GetChild(node, node->child_list[i]);
		if (ret != "successs!!!")
			break;
	}
	return ret;
}
예제 #2
0
//---------------------------------------------------------------------------
void TFormPici::GenOriginalRecordFile(void)
{ extern char *xlsHead;
  extern String g_curPiciFile,g_piciProductDesc,g_piciNumber,g_piciOperator,g_piciProductLine,g_piciProductCode,g_piciCheckweigher,g_piciProductName;
  extern TDateTime piciStartTime,piciOverTime;
  if(FileExists(g_curPiciFile))
  { int fileAttr= FileGetAttr(g_curPiciFile);
    if((fileAttr & faReadOnly)!=0)FileSetAttr(g_curPiciFile,fileAttr&~faReadOnly);
  }
  FILE *f=fopen(g_curPiciFile.c_str(),"wb");
  if(!f)return;
  fprintf(f,"%s\r\n",xlsHead);
  fprintf(f,"<center><strong><font size=4>%03d原始记录</font></strong></center>",g_CurPiciProductID);

  fprintf(f,"<table width=640 border=1>\r\n");
  fprintf(f,"<tr align=left><td>产品编号:</td><td colspan=2>%s</td></tr>",g_piciProductCode.c_str());
  fprintf(f,"<tr align=left><td>产品名称:</td><td colspan=2>%s</td></tr>",g_piciProductName.c_str());
  fprintf(f,"<tr align=left><td>产品描述:</td><td colspan=2>%s</td></tr>",g_piciProductDesc.c_str());
  fprintf(f,"<tr align=left><td>生产线号:</td><td colspan=2>%s</td></tr>",g_piciProductLine.c_str());
  fprintf(f,"<tr align=left><td>检重秤号:</td><td colspan=2>%s</td></tr>",g_piciCheckweigher.c_str());
  fprintf(f,"<tr align=left><td>批次号:</td><td colspan=2>%s</td></tr>",g_piciNumber.c_str());
  fprintf(f,"<tr align=left><td>操作员:</td><td colspan=2>%s</td></tr>",g_piciOperator.c_str());
  #if 0
  fprintf(f,"<tr align=left><td>件数:</td><td colspan=2>%d</td></tr>",g_PiciCounter);
  #else
  if(g_PiciCapacity==DefaultPiciCapacity)
  {  fprintf(f,"<tr align=left><td>件数:</td><td colspan=2></td></tr>");
  }
  else
  { fprintf(f,"<tr align=left><td>件数:</td><td colspan=2>%d</td></tr>",g_PiciCapacity);
  }
  #endif
  fprintf(f,"<tr align=left><td>批次开始时间:</td><td colspan=2>%s</td></tr>",DateTimeToStr(piciStartTime).c_str());
  fprintf(f,"<tr align=left><td>批次结束时间:</td><td colspan=2>%s</td></tr>",DateTimeToStr(piciOverTime).c_str());
  if(g_PiciCounter>0)
  { fprintf(f,"<tr><td colspan=3></td></tr>");
    fprintf(f,"<tr bgcolor=#DFDFDF align=center><td>序号</td><td>称重值</td><td>时间</td></tr>\r\n");
    for(int i=0;i<g_PiciCounter;i++)
    { fprintf(f,"<tr align=center><td>%03d</td><td>%3.03f%s</td><td>%s</td></tr>\r\n",i+1,weight_values[i],strDefaultUnit.c_str(),DateTimeToStr(weight_times[i]).c_str());
    }
  }
  fprintf(f,"</table></body></html>");
  fclose(f);
  FileSetAttr(g_curPiciFile, faReadOnly);
}
예제 #3
0
void TFormPici::GenStatFile(void)
{ extern char *xlsHead;
  char pbuf[128];
  extern String g_curStatFile,g_piciNumber,g_piciOperator,g_piciProductLine,g_piciProductCode,g_piciCheckweigher,g_piciProductName;
  extern TDateTime piciStartTime,piciOverTime;
  if(FileExists(g_curStatFile))
  { int fileAttr= FileGetAttr(g_curStatFile);
    if((fileAttr & faReadOnly)!=0)FileSetAttr(g_curStatFile,fileAttr&~faReadOnly);
  }
  FILE *f=fopen(g_curStatFile.c_str(),"wb");
  if(!f)return;

  fprintf(f,"%s\r\n",xlsHead);
  fprintf(f,"<center><strong><font size=4>%03d统计报表</font></strong></center>",g_CurPiciProductID);
  fprintf(f,"<table width=640 border=1>\r\n");
  fprintf(f,"<tr align=center><td align=right bgcolor=#DFDFDF>生产线号:</td><td>%s</td><td align=right bgcolor=#DFDFDF>产品编号:</td><td>%s</td><td bgcolor=#DFDFDF align=right>批次号:</td><td>%s</td></tr>\r\n",g_piciProductLine.c_str(),g_piciProductCode.c_str(),g_piciNumber.c_str());
  fprintf(f,"<tr align=center><td align=right bgcolor=#DFDFDF>检重秤号:</td><td>%s</td><td align=right bgcolor=#DFDFDF>产品名称:</td><td>%s</td><td bgcolor=#DFDFDF align=right>操作员:</td><td>%s</td></tr>\r\n",g_piciCheckweigher.c_str() ,g_piciProductName.c_str() ,g_piciOperator.c_str());

  fprintf(f,"<tr><td colspan=6></td></tr>");
  fprintf(f,"<tr bgcolor=#DFDFDF align=center><td colspan=2>全部产品</td><td colspan=2>合格产品</td><td colspan=2>不合格产品</td></tr>\r\n");
  fprintf(f,"<tr align=center><td align=right>数量合计:</td><td>%dpcs</td><td align=right>数量合计:</td><td>%dpcs</td><td align=right>数量合计:</td><td>%dpcs</td></tr>\r\n",g_PiciCounter,qualified_counter,g_PiciCounter-qualified_counter);
  fprintf(f,"<tr align=center><td align=right>重量总计:</td><td>%s%s</td><td align=right>重量总计:</td><td>%s%s</td><td align=right>重量总计:</td><td>%s%s</td></tr>\r\n",Edit_totalWeight->Text.c_str(),strDefaultUnit.c_str(),Edit_totalWeight1->Text.c_str(),strDefaultUnit.c_str(),WeightToStr(totalweight-totalweight1).c_str(),strDefaultUnit.c_str());

  int ll_count=0;
  for(int i=0;i<g_PiciCounter;i++){if(weight_values[i]<weight_ll)ll_count++;}
  fprintf(f,"<tr align=center><td align=right>标准偏差:</td><td>%s%s</td><td align=right>标准偏差:</td><td>%s%s</td><td align=right>超下限数量合计:</td><td>%dpcs</td></tr>\r\n",Edit_StandardDeviation->Text.c_str(),strDefaultUnit.c_str(),Edit_StandardDeviation1->Text.c_str(),strDefaultUnit.c_str(),ll_count);
  fprintf(f,"<tr align=center><td align=right>平均值:</td><td>%s%s</td><td align=right>平均值:</td><td>%s%s</td><td align=right>超上限数量合计:</td><td>%dpcs</td></tr>\r\n",Edit_Average->Text.c_str(),strDefaultUnit.c_str(),Edit_Average1->Text.c_str(),strDefaultUnit.c_str(),g_PiciCounter-qualified_counter-ll_count);

  fprintf(f,"<tr  align=center><td align=right>最小值:</td><td>%s%s</td><td align=right>最小值:</td><td>%s%s</td><td colspan=2></td></tr>\r\n",Edit_MinWeight->Text.c_str(),strDefaultUnit.c_str(),Edit_MinWeight1->Text.c_str(),strDefaultUnit.c_str());
  fprintf(f,"<tr align=center><td align=right>最大值:</td><td>%s%s</td><td align=right>最大值:</td><td>%s%s</td><td colspan=2></td></tr>\r\n",Edit_MaxWeight->Text.c_str(),strDefaultUnit.c_str(),Edit_MaxWeight1->Text.c_str(),strDefaultUnit.c_str());
  fprintf(f,"<tr align=center><td align=right>合格率:</td><td>%s%%</td><td colspan=4></td></tr>\r\n",Edit_QualifiedRate->Text.c_str());

  fprintf(f,"<tr><td colspan=6></td></tr>");
  fprintf(f,"<tr align=center><td align=right>批次开始时间:</td><td>%s</td><td colspan=4></td></tr>\r\n",DateTimeToStr(piciStartTime).c_str());
  fprintf(f,"<tr align=center><td align=right>批次结束时间:</td><td>%s</td><td colspan=4></td></tr>\r\n",DateTimeToStr(piciOverTime).c_str());

  fprintf(f,"</table></body></html>");
  fclose(f);

  FileSetAttr(g_curStatFile, faReadOnly);
}
//===========================================================================
// バッファの出力
//===========================================================================
int __fastcall TAttacheCaseFileDecrypt1::OutputBuffer
	(char *output_buffer, int buff_size,
	TFileStream *&fsOut, bool &fOpen,
	TStringList *FileList, int &FileIndex,
	__int64 *FileSizeList, int *FileAttrList, int *FileAgeList)
{

//返値 0=<:成功, -1:エラー, -2:ユーザーキャンセル

int res;

int rest;
String FileName, FilePath, DirPath;
char read_buffer[LARGE_BUF_SIZE];      //コンペア用
char temp_buffer[LARGE_BUF_SIZE];      //データ詰める用

//----------------------------------------------------------------------
// 解凍されたバッファがすべて書き込まれるまでループ
//----------------------------------------------------------------------

// ※0バイトファイルなどの場合もあるので
//  一度はループに入れるようにした。

//while (buff_size > 0 && !Terminated) {
do{

	// ファイルが開かれていないならオープンする
	if ( fOpen == false ) {

		for (FileIndex; FileIndex < FileList->Count; FileIndex++) {

			FileName = FileList->Strings[FileIndex];
			FilePath = OutDirPath + FileName;

			//----------------------------------------------------------------------
			// ディレクトリ
			//----------------------------------------------------------------------
			if (FileName.IsPathDelimiter(FileList->Strings[FileIndex].Length()) == true) {

				if ( fConfirmOverwirte == true && fOverwirteYesToAll == false ) {

					if (DirectoryExists(FilePath) == true) {

						//同名フォルダーの上書き確認メッセージダイアログ
						MsgText = LoadResourceString(&Msgdecrypt::_MSG_CONFIRM_OVER_WRITE_SAME_DIR)+"\n"+FilePath;
						Synchronize(&PostConfirmOverwriteMessageForm);

						if ( MsgReturnVal == mrYes ) {
							//上書きOKなのでFilePathはそのまま
						}
						else if ( MsgReturnVal == mrNo ) {
							//別名保存でFilePath文字列が書き換えられてきている
							FilePath = MsgReturnPath;
						}
						else if ( MsgReturnVal == mrYesToAll ) {
							//すべて上書き(YesToAll)
							fOverwirteYesToAll = true;
						}
						else if ( MsgReturnVal == mrCancel ) {
							//キャンセル
							goto LabelStop;
						}
					}

				}

				//-----------------------------------
				//暗号化ファイル自身への復号はNG
				//(ex: ..\hoge -> ..\hoge)
				//-----------------------------------
				if ( FilePath.CompareIC(AtcFilePath) == 0 ) {
					//'暗号化ファイル自身にファイルまたはフォルダーを復号することはできません。'+#13+
					//'復号処理を中止します。';
					MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_NOT_OVERWRITE_MYSELF)+"\n"+FilePath;
					MsgType = mtError;
					MsgButtons = TMsgDlgButtons() << mbOK;
					MsgDefaultButton = mbOK;
					Synchronize(&PostConfirmMessageForm);
					//エラー
					goto LabelError;
				}

				//フォルダの生成
				ForceDirectories(FilePath);
				//タイムスタンプのセット
				//FileSetDate(FilePath, FileAge[i]);  //フォルダはタイムスタンプをセットしない
				//属性のセット
				FileSetAttr(FilePath, FileAttrList[FileIndex]);

				if ( fOpenFolder == true && fOpenFolderOnce == false ) {
					ShellExecuteW(NULL, L"open", L"EXPLORER.EXE", FilePath.c_str(), FilePath.c_str(), SW_NORMAL);  //脆弱性対策(ver.2.70)
					//ShellExecuteW(NULL, L"explore", FilePath.c_str(), NULL, NULL, SW_NORMAL);	//こちらでも正常動作したようだ
					fOpenFolderOnce = true;
				}

				continue;

			}
			//----------------------------------------------------------------------
			// ファイル
			//----------------------------------------------------------------------
			else {

				if (fConfirmOverwirte == true && fOverwirteYesToAll == false ) {

					DirPath = ExtractFileDir(FilePath);
					if (DirectoryExists(DirPath) == false) {
						ForceDirectories(DirPath);
					}

					if (FileExists(FilePath) == true) {
						//同名ファイルの上書き確認メッセージダイアログ
						MsgText = LoadResourceString(&Msgdecrypt::_MSG_CONFIRM_OVER_WRITE_SAME_FILE)+"\n"+FilePath;
						Synchronize(&PostConfirmOverwriteMessageForm);

						if ( MsgReturnVal == mrYes ) {
							//上書きOKなのでFilePathはそのまま
						}
						else if ( MsgReturnVal == mrNo ) {
							//別名保存でFilePath文字列が書き換えられてきている
							FilePath = MsgReturnPath;
						}
						else if ( MsgReturnVal == mrYesToAll ) {
							//すべて上書き(YesToAll)
							fOverwirteYesToAll = true;
						}
						else if ( MsgReturnVal == mrCancel ) {
							//キャンセル
							goto LabelStop;
						}
					}

				}

				//-----------------------------------
				//暗号化ファイル自身への復号はNG
				//(ex: ..\hoge -> ..\hoge)
				//-----------------------------------
				if ( FilePath.CompareIC(AtcFilePath) == 0) {
					//'暗号化ファイル自身にファイルまたはフォルダーを復号することはできません。'+#13+
					//'復号処理を中止します。';
					MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_NOT_OVERWRITE_MYSELF)+"\n"+FilePath;
					MsgType = mtError;
					MsgButtons = TMsgDlgButtons() << mbOK;
					MsgDefaultButton = mbOK;
					Synchronize(&PostConfirmMessageForm);
					//エラー
					goto LabelError;
				}

				try {
					// TODO: ver.2.75以前で「複数ファイルは一つの暗号化ファイルにまとめる」に
					// チェックして暗号化されていた場合の対処
					DirPath = ExtractFileDir(FilePath);
					if (DirectoryExists(DirPath) == false) {
						ForceDirectories(DirPath);	//親フォルダーがなければ強制的に生成する
					}
					//出力するファイルを開く
					fsOut = new TFileStream(FilePath, fmCreate);
				}
				catch(...) {
					//保存する先のファイルが開けません。他のアプリケーションが使用中の可能性があります。
					MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_OUT_FILE_OPEN)+"\n"+FilePath;
					MsgType = mtError;
					MsgButtons = TMsgDlgButtons() << mbOK;
					MsgDefaultButton = mbOK;
					Synchronize(&PostConfirmMessageForm);
					goto LabelError;

				}

				fOpen = true;

				if (FileSizeList[FileIndex] == 0) { // 0バイトファイル?

					delete fsOut;
					fOpen = false;

					FileSetAttr(FilePath, (int)FileAttrList[FileIndex]); //属性のセット
					FileSetDate(FilePath, (int)FileAgeList[FileIndex]);  //タイムスタンプのセット

					//関連付けられたアプリケーションでファイルを開く
					if ( fTempOpenFile == true ) {
						ShellExecuteW(NULL, L"open", FilePath.c_str(), NULL, NULL, SW_NORMAL);
					}
				}
				else{
					break;
				}

			}

		}//end for;


	}//end if (fOpen == false);

	//-----------------------------------
	// 開いたファイルに書き込む
	//-----------------------------------
	if ( fOpen == true ) {

		//-----------------------------------
		// 通常書き込み
		//-----------------------------------

		if (fsOut->Size + buff_size < FileSizeList[FileIndex]) {

			if (fsOut->Write(output_buffer, buff_size) != buff_size) {
				goto LabelReadWriteError;
			}
			else {
				buff_size = 0;
			}

		}
		else {
			//クローズするファイルパス(書き込んでいたファイルパス)
			FileName = FileList->Strings[FileIndex];
			FilePath = OutDirPath + FileName;

			rest = FileSizeList[FileIndex] - fsOut->Size;

			if (fsOut->Write(output_buffer, rest) != rest) {
				goto LabelReadWriteError;
			}
			else {

				buff_size -= rest;

				//残ったバッファを前に詰める
				for (int i = 0; i < LARGE_BUF_SIZE; i++) {
					if (i < buff_size) {
						temp_buffer[i] = output_buffer[rest+i];
					}
					else{
						temp_buffer[i] = 0;
					}
				}
				memcpy(output_buffer, temp_buffer, LARGE_BUF_SIZE);

				delete fsOut;
				fOpen = false;

				FileSetAttr(FilePath, (int)FileAttrList[FileIndex]); //属性のセット
				FileSetDate(FilePath, (int)FileAgeList[FileIndex]);  //タイムスタンプのセット

				//関連付けられたアプリケーションでファイルを開く
				if ( fTempOpenFile == true ) {
					ShellExecuteW(NULL, L"open", FilePath.c_str(), NULL, NULL, SW_NORMAL);
				}
				FileIndex++;
			}

		}

	}
	else {
		//もう開くファイルがない
		break;

	//-----------------------------------
	}//end if ( fOpen == true );
	//-----------------------------------


}while (buff_size > 0 && !Terminated);//end while ( buf_size > 0 );
//----------------------------------------------------------------------

//出力バッファはきれいにしておく
for (int i = 0; i < LARGE_BUF_SIZE; i++) {
	output_buffer[i] = 0;
}

if ( Terminated == true ) {
	goto LabelStop;
}

//成功
return(0);

//-----------------------------------
//読み書きエラー
LabelReadWriteError:

	//'保存する先のファイルに書き込めません。復号できません。'
	MsgText = LoadResourceString(&Msgdecrypt::_MSG_ERROR_OUT_FILE_WRITE)+"\n"+fsOut->FileName;
	MsgType = mtError;
	MsgButtons = TMsgDlgButtons() << mbOK;
	MsgDefaultButton = mbOK;
	Synchronize(&PostConfirmMessageForm);

	if ( fOpen == true ) {
		delete fsOut;
		fOpen = false;
	}

	return(-1);


//-----------------------------------
//エラー
LabelError:

	//ここのエラーは直前でメッセージを提示してから来ている

	if ( fOpen == true ) {
		delete fsOut;
		fOpen = false;
	}

	return(-1);

//-----------------------------------
//ユーザーキャンセル
LabelStop:

	if ( fOpen == true ) {
		delete fsOut;
		fOpen = false;
	}

	return(-2);


}
예제 #5
0
//---------------------------------------------------------------------------
void TFormPici::GenFinalReportFile(void)
{ extern char *xlsHead;
  extern String g_curFinalReport,g_piciProductDesc,g_piciNumber,g_piciOperator,g_piciProductLine,g_piciProductCode,g_piciCheckweigher,g_piciProductName;
  extern TDateTime piciStartTime,piciOverTime;
  if(FileExists(g_curFinalReport))
  { int fileAttr= FileGetAttr(g_curFinalReport);
    if((fileAttr & faReadOnly)!=0)FileSetAttr(g_curFinalReport,fileAttr&~faReadOnly);
  }
  FILE *f=fopen(g_curFinalReport.c_str(),"wb");
  if(!f)return;
  fprintf(f,"%s\r\n",xlsHead);
  fprintf(f,"<center><strong><font size=4>%03d最终报表</font></strong></center>\r\n",g_CurPiciProductID);

  fprintf(f,"<table width=640 border=1>\r\n");
  fprintf(f,"<tr align=left><td colspan=2>产品编号:</td><td colspan=4>%s</td></tr>\r\n",g_piciProductCode.c_str());
  fprintf(f,"<tr align=left><td colspan=2>产品名称:</td><td colspan=4>%s</td></tr>\r\n",g_piciProductCode.c_str());
  fprintf(f,"<tr align=left><td colspan=2>产品描述:</td><td colspan=4>%s</td></tr>\r\n",g_piciProductDesc.c_str());
  fprintf(f,"<tr align=left><td colspan=2>生产线号:</td><td colspan=4>%s</td></tr>\r\n",g_piciProductLine.c_str());
  fprintf(f,"<tr align=left><td colspan=2>检重秤号:</td><td colspan=4>%s</td></tr>\r\n",g_piciCheckweigher.c_str());
  fprintf(f,"<tr align=left><td colspan=2>批次号:</td><td colspan=4>%s</td></tr>\r\n",g_piciNumber.c_str());
  fprintf(f,"<tr align=left><td colspan=2>操作员:</td><td colspan=4>%s</td></tr>\r\n",g_piciOperator.c_str());

  #if 0
  fprintf(f,"<tr align=left><td colspan=2>件数:</td><td colspan=4>%d</td></tr>",g_PiciCounter);
  #else
  if(g_PiciCapacity==DefaultPiciCapacity)
  {  fprintf(f,"<tr align=left><td colspan=2>件数:</td><td colspan=4></td></tr>");
  }
  else
  { fprintf(f,"<tr align=left><td colspan=2>件数:</td><td colspan=4>%d</td></tr>",g_PiciCapacity);
  }
  #endif
  fprintf(f,"<tr align=left><td colspan=2>批次开始时间:</td><td colspan=4>%s</td></tr>",DateTimeToStr(piciStartTime).c_str());
  fprintf(f,"<tr align=left><td colspan=2>批次结束时间:</td><td colspan=4>%s</td></tr>",DateTimeToStr(piciOverTime).c_str());
  fprintf(f,"<tr><td colspan=6></td></tr>");


  MyQuery->SQL->Text="select `configs`.*,`catalog`.* from `configs`,`catalog` where `catalog`.id="+IntToStr(g_CurPiciProductID);
  MyQuery->Active=true;

  float f_pdsd_1=CALC_PDSU(MyQuery->FieldByName("dev_ctcd")->AsFloat,MyQuery->FieldByName("dev_passrate")->AsFloat);
  float f_pdsd_2=CALC_PDSU(MyQuery->FieldByName("dev_ctcd")->AsFloat,MyQuery->FieldByName("pass_rate")->AsFloat);

  fprintf(f,"<tr align=center><td width=100 align=right>秤台长度:</td><td colspan=2>%0.03fmm</td><td width=100 align=right>通过率:</td><td colspan=2>%0.03fpcs/min</td></tr>",MyQuery->FieldByName("dev_ctcd")->AsFloat,MyQuery->FieldByName("dev_passrate")->AsFloat);
  fprintf(f,"<tr align=center><td width=100 align=right>轴间距离:</td><td colspan=2>%0.03fmm</td><td width=100 align=right>皮带速度:</td><td colspan=2>%0.3fm/min</td></tr>",MyQuery->FieldByName("dev_zjjl")->AsFloat,f_pdsd_1);
  fprintf(f,"<tr align=center><td width=100 align=right>轴直径:</td><td colspan=2>%0.03fmm</td><td width=100 align=right>实际频率:</td><td colspan=2>%0.03fHz</td></tr>",MyQuery->FieldByName("dev_zzj")->AsFloat,50.0*f_pdsd_1/MyQuery->FieldByName("dev_zdpdsd")->AsFloat);
  fprintf(f,"<tr><td colspan=6></td></tr>");

  fprintf(f,"<tr align=center><td width=100 align=right>最大皮带速度:</td><td colspan=2>%0.03fm/min</td><td width=100 align=right>最大称重:</td><td colspan=2>%0.03f%s</td></tr>",MyQuery->FieldByName("dev_zdpdsd")->AsFloat,weight_kg2default(MyQuery->FieldByName("dev_zdcz")->AsFloat),strDefaultUnit.c_str());
  fprintf(f,"<tr align=center><td width=100 align=right>最小皮带速度:</td><td colspan=2>%0.03fm/min</td><td width=100 align=right>最小称重:</td><td colspan=2>%0.03f%s</td></tr>",MyQuery->FieldByName("dev_zxpdsd")->AsFloat,weight_kg2default(MyQuery->FieldByName("dev_zxcz")->AsFloat),strDefaultUnit.c_str());
  fprintf(f,"<tr align=center><td width=100 align=right>最大频率:</td><td colspan=2>%0.03fHz</td><td width=100 align=right>显示分度:</td><td colspan=2>%0.03f%s</td></tr>",MyQuery->FieldByName("dev_zdpl")->AsFloat,weight_kg2default(MyQuery->FieldByName("dev_xsfd")->AsFloat),strDefaultUnit.c_str());
  fprintf(f,"<tr align=center><td width=100 align=right>最小频率:</td><td colspan=2>%0.03fHz</td><td width=100 align=right>显示单位:</td><td colspan=2>%s</td></tr>",MyQuery->FieldByName("dev_zxpl")->AsFloat,(MyQuery->FieldByName("dev_autozero")->AsInteger)?"g":"kg");
  fprintf(f,"<tr><td colspan=6></td></tr>");

  fprintf(f,"<tr align=center><td align=right>目标值:</td><td colspan=2>%0.03f%s</td><td align=right>通过率:</td><td colspan=2>%0.03fpcs/min</td></tr>\r\n",weight_tp,strDefaultUnit.c_str(),MyQuery->FieldByName("pass_rate")->AsFloat);
  fprintf(f,"<tr align=center><td align=right>下限值:</td><td colspan=2>%0.03f%s</td><td align=right>皮带速度:</td><td colspan=2>%0.03fm/min</td></tr>\r\n",weight_ll,strDefaultUnit.c_str(),f_pdsd_2);
  fprintf(f,"<tr align=center><td align=right>上限值:</td><td colspan=2>%0.03f%s</td><td align=right>修正系数:</td><td colspan=2>%0.03fm/min</td></tr>\r\n",weight_ul,strDefaultUnit.c_str(),MyQuery->FieldByName("correction_factor")->AsFloat);
  fprintf(f,"<tr><td colspan=6></td></tr>");

  fprintf(f,"<tr align=center><td align=right>剔除等待时间:</td><td colspan=2>%ds</td><td align=right>统计范围:</td><td colspan=2>%0.03f%%</td></tr>\r\n",MyQuery->FieldByName("tc_waittime")->AsInteger,MyQuery->FieldByName("stat_range")->AsFloat*100);
  fprintf(f,"<tr align=center><td align=right>剔除动作时间:</td><td colspan=2>%ds<td align=right>包装长度:</td><td colspan=2>%0.03fmm</td></tr>\r\n",MyQuery->FieldByName("tc_actiontime")->AsInteger,MyQuery->FieldByName("pack_length")->AsFloat);
  fprintf(f,"<tr align=center><td align=right>称重显示模式:</td><td colspan=2>%s<td align=right>预置皮重:</td><td colspan=2>%0.03f%s</td></tr>\r\n",(MyQuery->FieldByName("gross_or_net")->AsInteger==0)?"Gross":"Net",weight_kg2default(MyQuery->FieldByName("preset_tare")->AsFloat),strDefaultUnit.c_str());
  fprintf(f,"<tr><td colspan=6></td></tr>");

  fprintf(f,"<tr bgcolor=#DFDFDF align=center><td colspan=2>全部产品</td><td colspan=2>合格产品</td><td colspan=2>不合格产品</td></tr>\r\n");
  fprintf(f,"<tr align=center><td align=right>数量合计:</td><td>%dpcs</td><td align=right>数量合计:</td><td>%dpcs</td><td align=right>数量合计:</td><td>%dpcs</td></tr>\r\n",g_PiciCounter,qualified_counter,g_PiciCounter-qualified_counter);
  fprintf(f,"<tr align=center><td align=right>重量总计:</td><td>%s%s</td><td align=right>重量总计:</td><td>%s%s</td><td align=right>重量总计:</td><td>%s%s</td></tr>\r\n",Edit_totalWeight->Text.c_str(),strDefaultUnit.c_str(),Edit_totalWeight1->Text.c_str(),strDefaultUnit.c_str(),WeightToStr(totalweight-totalweight1).c_str(),strDefaultUnit.c_str());

  int ll_count=0;
  for(int i=0;i<g_PiciCounter;i++){if(weight_values[i]<weight_ll)ll_count++;}
  fprintf(f,"<tr align=center><td align=right>标准偏差:</td><td>%s%s</td><td align=right>标准偏差:</td><td>%s%s</td><td align=right>超下限数量合计:</td><td>%dpcs</td></tr>\r\n",Edit_StandardDeviation->Text.c_str(),strDefaultUnit.c_str(),Edit_StandardDeviation1->Text.c_str(),strDefaultUnit.c_str(),ll_count);
  fprintf(f,"<tr align=center><td align=right>平均值:</td><td>%s%s</td><td align=right>平均值:</td><td>%s%s</td><td align=right>超上限数量合计:</td><td>%dpcs</td></tr>\r\n",Edit_Average->Text.c_str(),strDefaultUnit.c_str(),Edit_Average1->Text.c_str(),strDefaultUnit.c_str(),g_PiciCounter-qualified_counter-ll_count);

  fprintf(f,"<tr  align=center><td align=right>最小值:</td><td>%s%s</td><td align=right>最小值:</td><td>%s%s</td><td colspan=2></td></tr>\r\n",Edit_MinWeight->Text.c_str(),strDefaultUnit.c_str(),Edit_MinWeight1->Text.c_str(),strDefaultUnit.c_str());
  fprintf(f,"<tr align=center><td align=right>最大值:</td><td>%s%s</td><td align=right>最大值:</td><td>%s%s</td><td colspan=2></td></tr>\r\n",Edit_MaxWeight->Text.c_str(),strDefaultUnit.c_str(),Edit_MaxWeight1->Text.c_str(),strDefaultUnit.c_str());
  fprintf(f,"<tr align=center><td align=right>合格率:</td><td>%s%%</td><td colspan=4></td></tr>\r\n",Edit_QualifiedRate->Text.c_str());
  fprintf(f,"<tr><td colspan=6></td></tr>");


  MyQuery->Active=false;

   
  fprintf(f,"</table></body></html>");
  fclose(f);
  FileSetAttr(g_curFinalReport, faReadOnly);

}