void __fastcall TFrListMail::RzToolButton1Click(TObject *Sender)
{   TMemoryStream *pms= new TMemoryStream();
	TStringList *LS =new TStringList();
	struct rMail rMail;
	AnsiString NewFileName;
	int i,viTmpMINfTurn;
	AnsiString vsQRaspRaspNameRTF;
	//Если распоряжение уже рассылалось, то не рассылать, если не имеешь на то дополнительных прав.
 /*			vsSQLQw="SELECT Id24NameStatus FROM bm_Rasp   "
					" WHERE Idn=:D0 ; ";
 Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
 Qw->Parameters->Items[0]->Value= IdRasp;
 Qw->Open();
 if((Qw->Fields->Fields[0]->AsInteger==5448350)&&(!MainForm->flEditAllRasp))  	// Id24NameStatus=5448350//На утверждении
 {ShowMessage(AnsiString("Это распоряжени уже разосланно на утверждение")); return; }
 */ //Просто не Enable кнопку рассылки
	///





 if (pcSoglasovanieRassilka->ActivePage==tsSoglasovanie)
 {      ///проверка на отсутствие "_Копия" и "Новый подписной индекс"
	 StartProcedure:
	  vsSQLQw =   " SELECT TOP 1 Idn  FROM bm_RaspDetail "
				  " WHERE idRasp=:D0 AND DateDel is NULL "
				  " AND  LTRIM(RTRIM(NameRaspDetail)) LIKE '%_Копия%'; ";    //? Копия_
	   Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
	   Qw->Parameters->Items[0]->Value=IdRasp;
	   Qw->Open();
	  if(Qw->RecordCount>0)// { ShowMessage("Рассылка невозможна. \n В названиях подписных индексов присутствует слово '_Копия'"); return;}
		 {
		if (MessageDlg("Рассылка невозможна. \n В названиях  присутствует слово '_Копия'. Редактировать?",mtConfirmation,TMsgDlgButtons()<<mbYes<<mbNo,0)!=mrYes)
		  {return;}else
			 {
			  {try{Opts.Clear();locvalues[0]=Variant(Qw->Fields->Fields[0]->AsInteger);FrBisniessMenedger->QRaspDetail->Locate("Idn",locvalues,Opts);}catch(...){};};
			  FrBisniessMenedger->btUpdRaspDetailClick(Sender);
			  goto StartProcedure;
			 }
         }



	  vsSQLQw =   " SELECT TOP 1 Idn, isnull(PIdn,0)  FROM bm_RaspDetail "
				  " WHERE idRasp=:D0 AND DateDel is NULL "
				  " AND LTRIM(RTRIM(NameRaspDetail))='Новый подписной индекс' ; ";
	   Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
	   Qw->Parameters->Items[0]->Value=IdRasp;
	   Qw->Open();
	  if(Qw->RecordCount>0)
		 {
			if (MessageDlg("Рассылка невозможна. \n В названиях подписных индексов присутствует 'Новый подписной индекс'. Удалить?",mtConfirmation,TMsgDlgButtons()<<mbYes<<mbNo,0)!=mrYes)
			  {	if (MessageDlg(" Редактировать  'Новый подписной индекс'?",mtConfirmation,TMsgDlgButtons()<<mbYes<<mbNo,0)!=mrYes)
				   {return;}else
				{
					  {try{Opts.Clear();locvalues[0]=Variant(Qw->Fields->Fields[0]->AsInteger);FrBisniessMenedger->QRaspDetail->Locate("Idn",locvalues,Opts);}catch(...){};};
					  FrBisniessMenedger->btUpdRaspDetailClick(Sender);
					  goto StartProcedure;
			    }


			  }//Сделать переход к редактированию.
			else
			  {   int TmpIdnPIForDel,TmpIdnComplForDel;
				  TmpIdnComplForDel=0;
				  TmpIdnPIForDel=Qw->Fields->Fields[0]->AsInteger;
				  TmpIdnComplForDel=Qw->Fields->Fields[1]->AsInteger;

				  vsSQLQw = " DECLARE @Idn int; SET @Idn=:D0; "
				  " DELETE FROM bm_RaspDetail "
				  " WHERE Idn=@Idn OR PIdn=@Idn; ";
				   Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
				   Qw->Parameters->Items[0]->Value=TmpIdnPIForDel;
				   Qw->ExecSQL();

				   if(TmpIdnComplForDel>0)
					  {
						  vsSQLQw=	" DECLARE  @IdInsMod int, @Idn int, @CostWithNDS money, @CostWithoutNDS money, @CostMINWithNDS money, @CostMINWithoutNDS money"
						  " SET @Idn=:D0"
						  " SET @IdInsMod=:D1"
						  " SELECT  @CostWithoutNDS=SUM(CostWithoutNDS),@CostWithNDS=SUM(CostWithNDS),@CostMINWithoutNDS=SUM(CostMINWithoutNDS),@CostMINWithNDS=SUM(CostMINWithNDS)"
						  " FROM bm_RaspDetail"
						  " WHERE fType=2 AND PIdn =@Idn and  DateDel is null;"
							" UPDATE bm_RaspDetail SET"
							"	 CostWithNDS =@CostWithNDS "
							"	,CostWithoutNDS =@CostWithoutNDS "
							"	,CostMINWithNDS =@CostMINWithNDS "
							"	,CostMINWithoutNDS =@CostMINWithoutNDS "
							"	,DateMod = GetDate() "
							"	,IdMod =@IdInsMod "
							"	WHERE Idn= @Idn ;" ;
						  Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
						  Qw->Parameters->Items[0]->Value=TmpIdnComplForDel;
						  Qw->Parameters->Items[1]->Value=PermisHdr.KeyUserStartProgramm;;
						  Qw->ExecSQL();
					   }
				   ShowMessage("Подписной индекс с наименованием 'Новый подписной индекс' удален.\n Рассылка запустится повторно. ");
				   goto StartProcedure;
//				   return;
              }
		 }

//Проверка что поле Состав ПИ заполненно у всех.

	 vsSQLQw =   " SELECT top 1 Idn FROM bm_RaspDetail WHERE IdRasp=:D0 AND DateDel IS NULL and fType=2 and CompositionOfPI=0 ";
				   Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
				   Qw->Parameters->Items[0]->Value=IdRasp;
				   Qw->Open();
 if((Qw->RecordCount>0)&&((QListRaspVidRasp->AsInteger==4742151)||(QListRaspVidRasp->AsInteger==4742153)))
   {ShowMessage(AnsiString("В распоряжении не у всех подписных индексов указан \"Cостав ПИ\".\n Вам необходимо заполнить это поле."));
	return;
   }

///Проверка наличия кодов Axapta

		 vsSQLQw =   " SELECT Idn FROM bm_RaspDetail WHERE IdRasp=:D0 AND DateDel IS NULL AND fType=3 AND (ItemIdAxapta ='' OR ItemIdAxapta is NULL OR IdnAxapta is NULL)";
				   Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
				   Qw->Parameters->Items[0]->Value=IdRasp;
				   Qw->Open();

		 if(Qw->RecordCount>0){ShowMessage(AnsiString("Не у всех номенклатур проставлены коды Axapta. Рассылка распоряжения на утверждение невозможна.")); return;}

///




//Проверка заполненности всех полей комментариев и распоряжени
   QListRasp->Close();
   QListRasp->Parameters->Items[0]->Value=IdRasp;
   QListRasp->Open();




 //Проверка наличия ценового комитета.

	 vsSQLQw =   " SELECT Idn FROM bm_RaspDetail WHERE IdRasp=:D0 AND DateDel IS NULL ";
				   Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
				   Qw->Parameters->Items[0]->Value=IdRasp;
				   Qw->Open();

				   //if(QListRasp->Active==false){QListRasp->Open(); }
				   //int ttt= QListRaspVidRasp->AsInteger;
				  // int yyy=Qw->RecordCount;
 if((Qw->RecordCount>0)&&((QListRaspVidRasp->AsInteger==4742151)||(QListRaspVidRasp->AsInteger==4742153)))
   {
	 vsSQLQw =   " SELECT Idn FROM bm_ListMail WHERE IdRasp=:D0 AND DateDel IS NULL AND fType=3/*Ценовой комитет*/ ";
				   Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
				   Qw->Parameters->Items[0]->Value=IdRasp;
				   Qw->Open();

	 if(Qw->RecordCount==0){ShowMessage(AnsiString("Не заполнен список ценового комитета. Рассылка распоряжения на утверждение невозможна.")); return;}
	}

 //

/*
//Проверка заполненности всех полей комментариев и распоряжени
   QListRasp->Close();
   QListRasp->Parameters->Items[0]->Value=IdRasp;
   QListRasp->Open();
 */
   QListComments->Close();
   QListComments->Parameters->Items[0]->Value=IdRasp;
   QListComments->Open();

   fAllEntering=true;//Флаг проверки заполненности всех полей
   //Проверка распоряжения
	   if((QListRaspId256TypeRasp->AsInteger)==0)        fAllEntering=false;           //Тип распоряжения
	   // Есть всегда if(Trim(QListRaspId24City->AsInteger)==0) fAllEntering=false;    //Город
	   if(Trim(QListRaspRaspNameRTF->AsString)=="")      fAllEntering=false;           //Наименование распоряжения
	   if(Trim(QListRaspContentTargetRTF->AsString)=="") fAllEntering=false;           // Цели распоряжения
	   if(Trim(QListRaspId24NameStatuser->AsString)=="") fAllEntering=false;           // (Предлагаю:, Приказываю: и прочее)
	   if(Trim(QListRaspContentRTF->AsString)=="")       fAllEntering=false;           // Содержание распоряжения
	   if((QListRaspEmplDol->AsInteger)==0)              fAllEntering=false;           //Должность утверждающего
	   if((QListRaspIdEmplUsers->AsInteger)==0)          fAllEntering=false;           // ФИО утверждающего
/*   ///проверка на отсутствие "_Копия" и "Новый подписной индекс"
	  vsSQLQw =   " SELECT  Idn  FROM bm_RaspDetail "
				  " WHERE idRasp=:D0 AND DateDel is NULL "
				  " AND ((LTRIM(RTRIM(NameRaspDetail))='Новый подписной индекс') OR (LTRIM(RTRIM(NameRaspDetail)) LIKE '%_Копия%')); ";
	   Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
	   Qw->Parameters->Items[0]->Value=IdRasp;
	   Qw->Open();
	  if(Qw->RecordCount>0) { ShowMessage("Рассылка невозможна. \n В названиях подписных индексов присутствуют 'Новый подписной индекс' или '_Копия'"); return;}


   */
  ///
	  QAddFilesEXEL->Close();
	  QAddFilesEXEL->Parameters->Items[0]->Value=IdRasp;
	  QAddFilesEXEL->Open();

	 if ((QListRaspVidRasp->AsInteger==4742152/*"Распоряжение о выпуске нового продукта" После набора статистики переделать под таблицу прав*/)&&(QAddFilesEXEL->RecordCount<1))//Продукт
	  {
	   ShowMessage("Рассылка невозможна. \n Необходимо указать прикрепленный файл EXEL"); return;//Наличие прикрепленного файла

	  }
   ///

     ///
	  QAddFilesDOC->Close();
	  QAddFilesDOC->Parameters->Items[0]->Value=IdRasp;
	  QAddFilesDOC->Open();

	 if ((QListRaspVidRasp->AsInteger==4742440/*"Техническое задание на разработу в Отдел разработки и сопровождения программных продуктов" После набора статистики переделать под таблицу прав*/)&&(QAddFilesDOC->RecordCount<1))//Продукт
	  {
	   ShowMessage("Рассылка невозможна. \n Необходимо указать прикрепленный файл DOC"); return;//Наличие прикрепленного файла

	  }
   ///

   //Проверка распоряжения
   if ((QListRaspVidRasp->AsInteger==4742151)||((QListRaspVidRasp->AsInteger==4742153)))//Цена
	  {
	   //Проверка по комментариям  Тип цены. 1-Базовая;2-Бюджетная;3-Со скидкой. Стандартная;4-Со скидкой. Расчётная
	   if ((QListCommentsTypeCost->AsInteger==3)||((QListCommentsTypeCost->AsInteger==4)))
		  {
		   if(((QListCommentsId256NameDiscount->AsInteger)==0)&&(QListCommentsTypeCost->AsInteger==3)) fAllEntering=false;  //Код из Lib256 с Видом скидки
		   if(((QListCommentsId256NameAction ->AsInteger)==0)&&(QListCommentsTypeCost->AsInteger==4)) fAllEntering=false;  //Код из Lib256 с Видом скидки
		   if((QListCommentsId256CostDiscount->AsInteger)==0) fAllEntering=false;  //Код из Lib256 с описанием размера скидки
		   if((QListCommentsDateRealization->AsDateTime)==TDateTime(1900, 01, 01)) fAllEntering=false;  //Срок реализации
		   if(Trim(QListCommentsPrognozEffects->AsString)=="") fAllEntering=false; //Прогноз эффективности
		   if(Trim(QListCommentsGrantingConditions->AsString)=="") fAllEntering=false; // Условия скидки
		//Пооверяем CheckBox'ы
		  //	vsSQLQw = " SELECT (isnull(A.id256TextActionPurpose,0)+isnull(A.id256TextGroupClients,0)+isnull(A.id256TextAdvancementChannel,0))id256Text,A.TypeFiеld "
		  vsSQLQw =   " SELECT  DISTINCT A.TypeFiеld "
					  " FROM bm_CheckLists A "
					  "	LEFT JOIN bm_CommentsCheckLists B ON B.IdCheckLists=A.Idn "
					  "	LEFT JOIN bm_Comments C ON C.Idn= B.IdComments "
					  " WHERE C.idRasp=:D0 AND B.DateDel is NULL ";
		   Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
		   Qw->Parameters->Items[0]->Value=IdRasp;
		   Qw->Open();
		   if (Qw->RecordCount<3) fAllEntering=false; //Если заполнено меньше 3 CheckBox'ов
		   Qw->Close();

		///
		   if (QListCommentsTypeCost->AsInteger==4)  //Проверяем соответствуют ли продукты в таблицы прогнозируемых затрат и у подписных индексов
			  {										// при типе распоряжения 4-Со скидкой. расчетное-
			  bool fProduce=true;//Флаг соответствия продуктов. true-соответствуют

			  vsSQLQw =   " SELECT  DISTINCT IdProduce "
						  " FROM bm_PredictedDebit  "
						  " WHERE idRasp=:D0 AND DateDel is NULL ";
			   Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
			   Qw->Parameters->Items[0]->Value=IdRasp;
			   Qw->Open();
			  vsSQLQw =   " SELECT  DISTINCT idAdvProduceClass "
						  " FROM bm_RaspDetail  "
						  " WHERE idRasp=:D0 AND DateDel is NULL ";
			   Qw2->Close();Qw2->SQL->Clear();Qw2->SQL->Add(vsSQLQw);
			   Qw2->Parameters->Items[0]->Value=IdRasp;
			   Qw2->Open();

			   if(Qw->RecordCount!=Qw2->RecordCount) fProduce=false;
			   while(Qw->Eof==false)
			   {
			   vsSQLQw =  " SELECT  TOP 1 idAdvProduceClass "
						  " FROM bm_RaspDetail  "
						  " WHERE idRasp=:D0 AND idAdvProduceClass=:D1 AND DateDel is NULL ";
			   Qw2->Close();Qw2->SQL->Clear();Qw2->SQL->Add(vsSQLQw);
			   Qw2->Parameters->Items[0]->Value=IdRasp;
			   Qw2->Parameters->Items[1]->Value=Qw->Fields->Fields[0]->AsInteger;
			   Qw2->Open();
			   if(Qw2->RecordCount>0) fProduce=false;
			   Qw->Next();}

			   Qw->Close();
			   Qw2->Close();


			  if (!fProduce) { if(MessageDlg("Продукты в подписных индексах и в прогнозируемых затратах не соответствуют. Продолжить рассылку?",mtInformation,TMsgDlgButtons()<<mbYes<<mbNo,0)!=mrYes) {Abort();return;}}
			  }//if (QListCommentsTypeCost->AsInteger==4)
		  }//if ((QListCommentsTypeCost->AsInteger==3)||((QListCommentsTypeCost->AsInteger==4)))
	   ///
	  }//if (QListRaspVidRasp->AsInteger==0)//Цена
   ///


///
  if (!fAllEntering)
	 {
	  ShowMessage(AnsiString("Не все поля заполнены. Рассылка распоряжения на утверждение невозможна."));

	  //--- первая часть марлезонского балета
	  if ((QListRaspId256TypeRasp->AsInteger)==0)
		 {ShowMessage("Не выбран тип распоряжения...");}
	  if (Trim(QListRaspRaspNameRTF->AsString)=="")
		 {ShowMessage("Не указано наименование распоряжения...");}
	  if (Trim(QListRaspContentTargetRTF->AsString)=="")
		 {ShowMessage("Не указана цель распоряжения...");}
	  if (Trim(QListRaspId24NameStatuser->AsString)=="")
		 {ShowMessage("Не указано ''Предлагаю:'', ''Приказываю:'' и прочее...");}
	  if (Trim(QListRaspContentRTF->AsString)=="")
		 {ShowMessage("Не указано ''Содержание распоряжения''...");}
	  if ((QListRaspEmplDol->AsInteger)==0)
		 {ShowMessage("Не указана ''Должность утверждающего''...");}
	  if ((QListRaspIdEmplUsers->AsInteger)==0)
		 {ShowMessage("Не указаны ''ФИО утверждающего''...");}

	  //--- вторая часть марлезонского балета
	  if (((QListCommentsId256NameDiscount->AsInteger)==0)&&(QListCommentsTypeCost->AsInteger==3))
		 {ShowMessage("Не указан ''Код из Lib256 с Видом скидки''...");}
	  if (((QListCommentsId256NameAction ->AsInteger)==0)&&(QListCommentsTypeCost->AsInteger==4))
		 {ShowMessage("Не указан ''Код из Lib256 с Видом скидки''...");}
	  if ((QListCommentsId256CostDiscount->AsInteger)==0)
		 {ShowMessage("Не указан ''Код из Lib256 с описанием размера скидки''...");}
	  if ((QListCommentsDateRealization->AsDateTime)==TDateTime(1900, 01, 01))
		 {ShowMessage("Не указан ''Срок реализации''...");}
	  if (Trim(QListCommentsPrognozEffects->AsString)=="")
		 {ShowMessage("Не указан ''Прогноз эффективности''...");}
	  if (Trim(QListCommentsGrantingConditions->AsString)=="")
		 {ShowMessage("Не указаны ''Условия скидки''...");}
	  //конец балета - занавес

	  return;
	  }
///Проверка дробности цены
	QNE->Close();
	QNE->Parameters->Items[0]->Value=IdRasp;
    QNE->Open();
	QNE->First();
	while(QNE->Eof==false)
	   {if((((QNECostWithNDS->AsCurrency*100)%1)>0)||(((QNECostWithoutNDS->AsCurrency*100)%1)>0))
	   {ShowMessage("Сохранение невозможно. \n Сперва приведите значения цен с НДС и без НДС для номенклатурных единиц к целым копейкам."); return; }
	   QNE->Next();}
///////////////////////////


   /////Запись текста письма в БД
   vsSQLQw = "DECLARE @IdRasp int, @PermisHdr int;"//, @MailPathAddFiles text, @MailText text ; " //Нельзя создавать переменную типа text
				" SET @IdRasp =:D0; SET @PermisHdr =:D1;"// SET @MailPathAddFiles =:D2; SET @MailText =:D3; "
				" UPDATE bm_ListMail SET MailPathAddFiles=:D2, MailText=:D3, DateMod=GetDate(), IdMod= @PermisHdr WHERE IdRasp=@IdRasp ";
   Qw->Close();
   Qw->SQL->Clear();
   Qw->SQL->Add(vsSQLQw);
   Qw->Parameters->Items[0]->Value = IdRasp;
   Qw->Parameters->Items[1]->Value = PermisHdr.KeyUserStartProgramm;

	LS->Clear();        
	pms->Position=0;
	LS->SaveToStream(pms);
	pms->Position=0;
	Qw->Parameters->Items[2]->LoadFromStream(pms,ftMemo);
	pms->Clear();
	pms->Position=0;
	reContentRTF->Lines->SaveToStream(pms);
	pms->Position=0;
	Qw->Parameters->Items[3]->LoadFromStream(pms,ftMemo);
	pms->Clear();
	Qw->ExecSQL();
	Qw->Close();
    LS->Clear();

  RzPanel300->Visible=true;

  rMail=MainForm->CreateMail(IdRasp,1);
 
  ///// рассылаем распоряжение лицам с минимальным порядком очереди fTyrn, но не 0
  vsSQLQw=" SELECT MIN(fTurn) FROM bm_ListMail"
			" WHERE  DateDel is null"
			" AND IdRasp=:D0"
			" AND ( fType=0 OR fType=2) "
			" AND fTurn>0"
			" AND (fResault=0 OR fResault is NULL )";
 Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
 Qw->Parameters->Items[0]->Value= IdRasp;
 Qw->Open();
 viTmpMINfTurn=Qw->Fields->Fields[0]->AsInteger;
	QEmplUserDol2->First();
	while((QEmplUserDol2->Eof==false))
		 {
		  if ((Trim(QEmplUserDol2Mail->AsString) != "") && (QEmplUserDol2fTurn->AsInteger == viTmpMINfTurn))
			 {
			  rMail.ResiveName        = QEmplUserDol2FamIO->AsString;
			  rMail.ResiveMailAddress = QEmplUserDol2Mail->AsString;
			  vsSQLQw = "UPDATE bm_ListMail SET DateSheet = GetDate() "
						"WHERE Idn = :D0;";
			  Qw->Close();
			  Qw->SQL->Clear();
			  Qw->SQL->Add(vsSQLQw);
			  Qw->Parameters->Items[0]->Value = QEmplUserDol2Idn->AsString;
			  Qw->ExecSQL();
			  MainForm->SendEmail(&rMail);
			  }
		  QEmplUserDol2->Next();
		  }


  //Рассылаем замещающим утверждающих
  QEmplUserDol3->First();
	while((QEmplUserDol3->Eof==false))
	  {if ((Trim(QEmplUserDol3Mail->AsString)!="")&&(QEmplUserDol3fTurn->AsInteger==viTmpMINfTurn))
		 { rMail.ResiveName=QEmplUserDol3FamIO->AsString;
		   rMail.ResiveMailAddress=QEmplUserDol3Mail->AsString;

		   MainForm->SendEmail(&rMail);
		 }
   QEmplUserDol3->Next();
	  }
 ////
  ///Выставляем распоряжению состояние-в рассылке-
			vsSQLQw="UPDATE bm_Rasp  SET "
					"  Id24NameStatus=5448350"//На утверждении
					" ,DateSheet= GetDate() "
					" ,IdSheet=:D0  "
					" WHERE Idn=:D1 ; ";
 Qw->Close();Qw->SQL->Clear();Qw->SQL->Add(vsSQLQw);
 Qw->Parameters->Items[0]->Value= PermisHdr.KeyUserStartProgramm;
 Qw->Parameters->Items[1]->Value= IdRasp;
 Qw->ExecSQL();
///

 RzPanel300->Visible=false;

 ShowMessage("Рассылка писем по листу согласования начата.");
}// if (pcSoglasovanieRassilka->ActivePage=tsSoglasovanie)
 if (pcSoglasovanieRassilka->ActivePage==tsRassilka)
 { MainForm->Sheet(IdRasp);
    
 }
}
//===========================================================================
// ヘッダ情報を生成する
//===========================================================================
bool __fastcall TAttacheCaseFileEncrypt::CreateHeaderData
	(TMemoryStream *pms, TStringList *FileList, TStringList *FilePathList, __int64 &AllTotalFileSize)
{

int i, c;

int ret;
int Index = 0;
int HeaderSizeAddress = 0;
TSearchRec sr;
String OneLine;
String DirPath, FileName;

String MsgText;

//暗号部トークン
const AnsiString Passcode_AttacheCase = "Passcode:AttacheCase\n";
//暗号化ファイルの作成日
AnsiString LastDateTimeString = "LastDateTime:" + DateTimeToStr(Now()) + "\n";

//旧ヘッダーテキストすべて
AnsiString Fn_HeaderText;
//Unicode用ヘッダーテキストすべて
String U_HeaderText;

int EncryptHeaderSize = 0;  //暗号部ヘッダサイズ

char buffer[BUF_SIZE];
char chain_buffer[BUF_SIZE];

TStringList *HeaderDataList;
TMemoryStream* tpms;          //テンポラリメモリストリーム

//-----------------------------------
// ヘッダ情報(平文)
//-----------------------------------
const char charReservedValue[4] = { 0, 0, 0, 0 };

const char charDataSubVersion = ATC_DATA_SUB_VERSION;
const char charOptMissTypeLimitsNumOption = intOptMissTypeLimitsNumOption;
const char charOptBrokenFileOption = (fOptBrokenFileOption > 0 ? 1 : 0);
const char charTokenString[17] = "_AttacheCaseData";
const int DataFileVersion = ATC_DATA_FILE_VERSION;
const int AlgorismType = TYPE_ALGORISM_RIJNDAEL;

//データサブバージョン                              : 1byte
pms->Write(&charDataSubVersion, sizeof(char));
//予約データ(reserved)                             : 1byte
pms->Write(&charReservedValue, sizeof(char));
//ミスタイプ回数                                    : 1byte
pms->Write(&charOptMissTypeLimitsNumOption, sizeof(char));
//破壊するか否か                                    : 1byte
pms->Write(&charOptBrokenFileOption, sizeof(char));
//トークン                                          : 16byte
pms->Write(&charTokenString, 16);
//データファイルバージョン                          : 4byte
pms->Write(&DataFileVersion, sizeof(int));
//アルゴリズムタイプ                                : 4byte
pms->Write(&AlgorismType, sizeof(int));
//暗号化部分のヘッダデータサイズ(先に確保しておく):4byte
HeaderSizeAddress = pms->Position;
pms->Write(&EncryptHeaderSize, sizeof(int));

//-----------------------------------
// ヘッダ情報(暗号化部分)
//-----------------------------------

//進捗状況表示
ProgressPercentNum = -1;
//'暗号化するファイルリストの生成中...'
ProgressStatusText = LoadResourceString(&Msgencrypt::_LABEL_STATUS_TITLE_LISTING);

//ヘッダデータリスト(文字列)
HeaderDataList = new TStringList;
//パスワード
HeaderDataList->Add(Passcode_AttacheCase);
//作成日
HeaderDataList->Add(LastDateTimeString);

for ( i = 0; i < FileList->Count; i++ ){
	//ファイル
	if (FileExists(FileList->Strings[i]) == true) {
		DirPath = ExtractFileDir(FileList->Strings[i]);
		FileName = ExtractFileName(FileList->Strings[i]);
		ProgressMsgText = FileName;      //処理中のファイル名
		AllTotalFileSize +=
			GetFileInfoList(Index, DirPath, FileName, FileList->Strings[i], FilePathList, HeaderDataList);
	}
	//ディレクトリ
	else{
		DirPath = ExtractFileDir(FileList->Strings[i]);
		FileName = ExtractFileName(FileList->Strings[i]);
		ProgressMsgText = FileName;      //処理中のファイル名
		//トップディレクトリ
		GetFileInfoList(Index, DirPath, FileName, FileList->Strings[i], FilePathList, HeaderDataList);
		//その配下
		AllTotalFileSize +=
			GetFileInfoList(Index, FileList->Strings[i], "", FileList->Strings[i], FilePathList, HeaderDataList);
	}

	//ユーザーキャンセル
	if (Terminated == true) {
		delete HeaderDataList;
		return(false);
	}

}// end for;

//進捗状況表示
ProgressPercentNum = -1;
//'ヘッダデータを書き込んでいます...'
ProgressStatusText = LoadResourceString(&Msgencrypt::_LABEL_STATUS_TITLE_ENCRYPTING_LIST);
ProgressMsgText = "";

//メモリストリームへ書き込み
tpms = new TMemoryStream;

//------------------------------------------------
// 暗号化時にヘッダデータの互換性維持
//---------------------------------------------------
HeaderDataList->SaveToStream(tpms, TEncoding::GetEncoding(932));
//新バージョン(ver.2.8.0~)用(UTF-8)に保存
for (i = 0; i < HeaderDataList->Count; i++) {
	HeaderDataList->Strings[i] = StringReplace(HeaderDataList->Strings[i],"Fn_","U_",TReplaceFlags()<<rfIgnoreCase );
}
HeaderDataList->SaveToStream(tpms, TEncoding::UTF8);

delete HeaderDataList;

//-----------------------------------
//ヘッダ情報の暗号化
//-----------------------------------

//暗号化の準備
gentables();
//キー入力
gkey( 8, 8, key);

for (i = 0; i < BUF_SIZE; i++) {
	buffer[i] = 0;
}

//初期化ベクトル(IV)を生成
fillrand(chain_buffer, BUF_SIZE);
pms->Write(chain_buffer, BUF_SIZE);

//先頭にポインタを戻す
tpms->Seek((__int64)0, TSeekOrigin::soBeginning);
EncryptHeaderSize = 0;

//CBCモードで書き込む
while (tpms->Read( buffer, BUF_SIZE ) != NULL){

	EncryptHeaderSize += BUF_SIZE;

	// xor
	for ( i = 0; i < BUF_SIZE; i++ ){
		buffer[i] ^= chain_buffer[i];
	}

	// rijndael
	rijndael_encrypt(buffer);

	pms->Write(buffer, BUF_SIZE);

	//CBC&バッファの初期化
	for ( i = 0; i < BUF_SIZE; i++ ){
		chain_buffer[i] = buffer[i];
		buffer[i] = 0;
	}

	//ユーザーキャンセル
	if (Terminated == true) {
		delete tpms;
		return(false);
	}

}//loop;

delete tpms;

//暗号化部分のヘッダデータサイズ(確保しておいた場所へ改めて書き込む)
pms->Position = HeaderSizeAddress;
pms->Write(&EncryptHeaderSize, sizeof(int));
//先頭にポインタを戻す
pms->Seek((__int64)0, TSeekOrigin::soBeginning);

return(true);


}//end CreateHeaderData;