//---------------------------------------------------------------------------
#pragma hdrstop

#include "FormFunctions.h"      // переменные для работы с формой
#include "Main.h"               // переменные для работы с главной формой
#include "PortFunctions.h"      // переменные для функций работы с портом
#include "ChipFunctions.h"      // переменные для работы с чипом
#include "ProgressBar.h"        // для использования прогресс-бара
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
//--- ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ -------------------------------------------------
//---------------------------------------------------------------------------
form_inf        FormData;       // экземпляр данных формы
//---------------------------------------------------------------------------
//--- АКТИВИРОВАТЬ КНОПКИ УПРАВЛЕНИЯ НА ФОРМЕ -------------------------------
//---------------------------------------------------------------------------
void EnableButtons()
{ Form1->Button1->Enabled       = false;        // деактивируем кнопку Connect
  Form1->Button2->Enabled       = true;         // и активируем все остальные
  Form1->Button3->Enabled       = true;
  Form1->Button4->Enabled       = true;
  Form1->Button5->Enabled       = true;
  Form1->Button6->Enabled       = true;
  Form1->Button7->Enabled       = true;
  Form1->Button8->Enabled       = true;
  Form1->Button9->Enabled       = true;
  Form1->Button10->Enabled      = true;
  Form1->Button11->Enabled      = true;
  Form1->LockFuses1->Enabled    = true;
}
//---------------------------------------------------------------------------
//--- ДЕАКТИВИРОВАТЬ КНОПКИ УПРАВЛЕНИЯ НА ФОРМЕ -----------------------------
//---------------------------------------------------------------------------
void DisableButtons()
{ Form1->Button1->Enabled       = true;         // активируем кнопку Connect
  Form1->Button2->Enabled       = false;        // и деактивируем все остальные
  Form1->Button3->Enabled       = false;
  Form1->Button4->Enabled       = false;
  Form1->Button5->Enabled       = false;
  Form1->Button6->Enabled       = false;
  Form1->Button7->Enabled       = false;
  Form1->Button8->Enabled       = false;
  Form1->Button9->Enabled       = false;
  Form1->Button10->Enabled      = false;
  Form1->Button11->Enabled      = false;
  Form1->LockFuses1->Enabled    = false;
}
//---------------------------------------------------------------------------
//--- ИНИЦИАЛИЗАЦИЯ РАЗМЕРОВ RICHEDIT-ОВ ------------------------------------
//---------------------------------------------------------------------------
void InitFormInf(unsigned int ID)
{ // определяем количество байт в ричэдитах в зависимости от выбранного чипа
  switch(ID)
  { case 0:     return;
    default:    FormData.RE1Size=SelectedChip.Area1Size;
                FormData.RE2Size=SelectedChip.Area1Size;
                FormData.RE3Size=SelectedChip.Area2Size;
                FormData.RE4Size=SelectedChip.Area2Size;
                break;
  }
  InitDataOnForm(1);                            // инициализируем данные RichEdit1
  InitDataOnForm(2);                            // инициализируем данные RichEdit2
  InitDataOnForm(3);                            // инициализируем данные RichEdit3
  InitDataOnForm(4);                            // инициализируем данные RichEdit4
  LoadImage();                                  // загружаем схему подключения
  Form1->Edit1->Text=SelectedChip.Name;         // подписываем имя чипа на форме
  PlaceDataToForm(0,0);                         // выводим ID в RichEdit3
}
//---------------------------------------------------------------------------
//--- ИНИЦИАЛИЗАЦИЯ ДАННЫХ ФОРМЫ ДЛЯ ВЫБРАННОЙ ОБЛАСТИ ----------------------
//---------------------------------------------------------------------------
void InitDataOnForm(unsigned char OutForm)
{ unsigned int i;               // счётчик

  switch(OutForm)
  { case 1:     // инициализируем RichEdit1 (программа)
                Form1->RichEdit1->Visible=false;        // делаем область невидимой
                Form1->RichEdit1->Clear();              // очищаем RichEdit1
                for(i=0; i<FormData.RE1Size/16; i++)    // заполняем строки
                  Form1->RichEdit1->Lines->Add(IntToHex(int(16*i),8)+": FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   |   яяяяяяяяяяяяяяяя");       // строка 76 символов + CR+LF = 78
                // убираем переносы в последней строке
                Form1->RichEdit1->SelStart=82*(i-1)+80;
                Form1->RichEdit1->SelLength=2;
                Form1->RichEdit1->SelText="";
                Form1->RichEdit1->Visible=true;         // делаем область видимой
                break;
    case 2:     // инициализируем RichEdit2 (программа)
                Form1->RichEdit2->Visible=false;        // делаем область невидимой
                Form1->RichEdit2->Clear();              // очищаем RichEdit2
                for(i=0; i<FormData.RE2Size/16; i++)    // заполняем строки
                  Form1->RichEdit2->Lines->Add(IntToHex(int(16*i),8)+": FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   |   яяяяяяяяяяяяяяяя");       // строка 76 символов
                // убираем переносы в последней строке
                Form1->RichEdit2->SelStart=82*(i-1)+80;
                Form1->RichEdit2->SelLength=2;
                Form1->RichEdit2->SelText="";
                Form1->RichEdit2->Visible=true;         // делаем область видимой
                break;
    case 3:     // инициализируем RichEdit3 (данные)
                Form1->RichEdit3->Visible=false;        // делаем область невидимой
                Form1->RichEdit3->Clear();              // очищаем RichEdit3
                for(i=0; i<FormData.RE3Size/16; i++)    // заполняем строки
                  Form1->RichEdit3->Lines->Add(IntToHex(int(16*i),8)+": FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   |   яяяяяяяяяяяяяяяя");       // строка 76 символов
                // убираем переносы в последней строке
                Form1->RichEdit3->SelStart=82*(i-1)+80;
                Form1->RichEdit3->SelLength=2;
                Form1->RichEdit3->SelText="";
                Form1->RichEdit3->Visible=true;         // делаем область видимой
                break;
    case 4:     // инициализируем RichEdit4 (данные)
                Form1->RichEdit4->Visible=false;        // делаем область невидимой
                Form1->RichEdit4->Clear();              // очищаем RichEdit4
                for(i=0; i<FormData.RE4Size/16; i++)    // заполняем строки
                  Form1->RichEdit4->Lines->Add(IntToHex(int(16*i),8)+": FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF   |   яяяяяяяяяяяяяяяя");       // строка 76 символов
                // убираем переносы в последней строке
                Form1->RichEdit4->SelStart=82*(i-1)+80;
                Form1->RichEdit4->SelLength=2;
                Form1->RichEdit4->SelText="";
                Form1->RichEdit4->Visible=true;         // делаем область видимой
                break;
    default:    break;
  }
}
//---------------------------------------------------------------------------
//--- ЗАГРУЖАЕМ СХЕМУ ПОДКЛЮЧЕНИЯ -------------------------------------------
//---------------------------------------------------------------------------
void LoadImage()
{ if(FileExists(SelectedChip.ImageName))        // загружаем схему подключения
  { Form1->Image1->Picture->LoadFromFile(SelectedChip.ImageName);
  }
  else
  { MessageBox(NULL,"Невозможно отобразить схему подключения,\n(не найден файл картинки). Или подключайте\nпо даташиту, или скачайте полную версию\nпрограммы с сайта radiohlam.ru","Error",MB_OK);
    Form1->Image1->Picture->Bitmap->FreeImage();
  }
}
//---------------------------------------------------------------------------
//--- ПОМЕЩАЕМ ДАННЫЕ ИЗ ПАМЯТИ НА ФОРМУ ------------------------------------
//---------------------------------------------------------------------------
void PlaceDataToForm(unsigned char OutForm, unsigned char InArea)
{ char TempBuf[1], OutHexBuf[3];        // для преобразования
  unsigned int LineNum, LocalNum;       // для вычисления позиции байта
  unsigned int Size;                    // размер выводимой области
  AnsiString TempIDStr;                 // временная переменная для преобразования ID

  switch(InArea)   // параметры области из которой нужно выводить данные
  { case 1:     Size=SelectedChip.Area1Size;
                break;
    case 2:     Size=SelectedChip.Area2Size;
                break;
    default:    Size=0;
                break;
  }

  Form1->PageControl1->Visible = false;
  // включаем прогресс-бар
  Application->CreateForm(__classid(TLBar),&LBar);        // создаём форму с прогресс-баром
  LBar->Show();                                           // показываем её в немодальном окне
  switch(OutForm)  // какую область нужно заполнить
  { case 0:     // помещаем нужные данные в Edit2 (SelectedChip.ID)
                TempIDStr="";
                for(unsigned int i=0; i<3; i++)
                { // переводим очередной байт в hex-строку
                  TempBuf[0]=SelectedChip.ID>>(8*(2-i));// берём байт
                  BinToHex(TempBuf,OutHexBuf,1);        // преобразовать строку в целое (байт)
                  OutHexBuf[2]=0;                       // строка должна заканчиваться нулём
                  TempIDStr+=UpperCase(OutHexBuf);      // переводим в верхний регистр
                  TempIDStr+=" ";
                }
                Form1->Edit2->Text=TempIDStr.SubString(1,8);
                break;
    case 1:     // помещаем нужные данные в RichEdit1 (программа)
                for(unsigned int i=0;i<Size;i++)       // будем перебирать все байты
                { // переводим очередной байт в hex-строку
                  switch(InArea)
                  { case 1: TempBuf[0]=SelectedChip.Area1[i];
                            break;
                    case 2: TempBuf[0]=SelectedChip.Area2[i];
                            break;
                    default: TempBuf[0]=0;
                             break;
                  }
                  BinToHex(TempBuf,OutHexBuf,1);        // преобразовать строку в целое (байт)
                  OutHexBuf[2]=0;                       // строка должна заканчиваться нулём
                  // и вычисляем его положение
                  LineNum=i/16;                         // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                // номер байта в строке
                  // меняем область слева
                  Form1->RichEdit1->SelStart=LineNum*82+10+3*LocalNum;  // ставим курсор на начало байт
                  Form1->RichEdit1->SelLength=2;                        // выделяем 2 символа
                  Form1->RichEdit1->SelText=UpperCase(OutHexBuf);       // заменяем на OutHexBuf (2 символа и нуль-терминатор, который не будет записан)
                  // меняем область справа
                  Form1->RichEdit1->SelStart=LineNum*82+64+LocalNum;    // ставим курсор в нужную позицию
                  Form1->RichEdit1->SelLength=1;                        // выделяем 1 символ
                  if(unsigned(TempBuf[0])<0x1F) OutHexBuf[1]=0x1F;                // если символ непечатный - заменяем
                  else                          OutHexBuf[1]=TempBuf[0];          // иначе пишем как есть
                  Form1->RichEdit1->SelText=OutHexBuf[1];               // пишем
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit1->SelStart=10;                  // ставим курсор в нужную позицию
                Form1->RichEdit1->SelLength=0;                  // отменяем выделение
                break;
    case 2:     // помещаем нужные данные в RichEdit2
                for(unsigned int i=0;i<Size;i++)       // будем перебирать все байты
                { // переводим очередной байт в hex-строку
                  switch(InArea)
                  { case 1: TempBuf[0]=SelectedChip.Area1[i];
                            break;
                    case 2: TempBuf[0]=SelectedChip.Area2[i];
                            break;
                    default: TempBuf[0]=0;
                             break;
                  }
                  BinToHex(TempBuf,OutHexBuf,1);        // преобразовать строку в целое (байт)
                  OutHexBuf[2]=0;                       // строка должна заканчиваться нулём
                  // и вычисляем его положение
                  LineNum=i/16;                          // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                 // номер байта в строке
                  // меняем область слева
                  Form1->RichEdit2->SelStart=LineNum*82+10+3*LocalNum;   // ставим курсор на начало байт
                  Form1->RichEdit2->SelLength=2;                        // выделяем 2 символа
                  Form1->RichEdit2->SelText=UpperCase(OutHexBuf);       // заменяем на OutHexBuf (2 символа и нуль-терминатор, который не будет записан)
                  // меняем область справа
                  Form1->RichEdit2->SelStart=LineNum*82+64+LocalNum;    // ставим курсор в нужную позицию
                  Form1->RichEdit2->SelLength=1;                        // выделяем 1 символ
                  if(unsigned(TempBuf[0])<0x1F) OutHexBuf[1]=0x1F;                // если символ непечатный - заменяем
                  else                          OutHexBuf[1]=TempBuf[0];          // иначе пишем как есть
                  Form1->RichEdit2->SelText=OutHexBuf[1];               // пишем
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit2->SelStart=10;                   // ставим курсор в нужную позицию
                Form1->RichEdit2->SelLength=0;                  // отменяем выделение
                break;
    case 3:     // помещаем нужные данные в RichEdit3
                for(unsigned int i=0;i<Size;i++)        // будем перебирать все байты
                { // переводим очередной байт в hex-строку
                  switch(InArea)
                  { case 1: TempBuf[0]=SelectedChip.Area1[i];
                            break;
                    case 2: TempBuf[0]=SelectedChip.Area2[i];
                            break;
                    default: TempBuf[0]=0;
                             break;
                  }
                  BinToHex(TempBuf,OutHexBuf,1);        //преобразовать строку в целое (байт)
                  OutHexBuf[2]=0;                       //строка должна заканчиваться нулём
                  // и вычисляем его положение
                  LineNum=i/16;                          // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                 // номер байта в строке
                  // меняем область слева
                  Form1->RichEdit3->SelStart=LineNum*82+10+3*LocalNum;   // ставим курсор на начало байт
                  Form1->RichEdit3->SelLength=2;                        // выделяем 2 символа
                  Form1->RichEdit3->SelText=UpperCase(OutHexBuf);       // заменяем на OutHexBuf (2 символа и нуль-терминатор, который не будет записан)
                  // меняем область справа
                  Form1->RichEdit3->SelStart=LineNum*82+64+LocalNum;    // ставим курсор в нужную позицию
                  Form1->RichEdit3->SelLength=1;                        // выделяем 1 символ
                  if(unsigned(TempBuf[0])<0x1F) OutHexBuf[1]=0x1F;                // если символ непечатный - заменяем
                  else                          OutHexBuf[1]=TempBuf[0];          // иначе пишем как есть
                  Form1->RichEdit3->SelText=OutHexBuf[1];               // пишем
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit3->SelStart=10;                   // ставим курсор в нужную позицию
                Form1->RichEdit3->SelLength=0;                  // отменяем выделение
                break;
    case 4:     // помещаем нужные данные в RichEdit4
                for(unsigned int i=0;i<Size;i++)        // будем перебирать все байты
                { // переводим очередной байт в hex-строку
                  switch(InArea)
                  { case 1: TempBuf[0]=SelectedChip.Area1[i];
                            break;
                    case 2: TempBuf[0]=SelectedChip.Area2[i];
                            break;
                    default: TempBuf[0]=0;
                             break;
                  }
                  BinToHex(TempBuf,OutHexBuf,1);        //преобразовать строку в целое (байт)
                  OutHexBuf[2]=0;                       //строка должна заканчиваться нулём
                  // и вычисляем его положение
                  LineNum=i/16;                          // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                 // номер байта в строке
                  // меняем область слева
                  Form1->RichEdit4->SelStart=LineNum*82+10+3*LocalNum;   // ставим курсор на начало байт
                  Form1->RichEdit4->SelLength=2;                        // выделяем 2 символа
                  Form1->RichEdit4->SelText=UpperCase(OutHexBuf);       // заменяем на OutHexBuf (2 символа и нуль-терминатор, который не будет записан)
                  // меняем область справа
                  Form1->RichEdit4->SelStart=LineNum*82+64+LocalNum;    // ставим курсор в нужную позицию
                  Form1->RichEdit4->SelLength=1;                        // выделяем 1 символ
                  if(unsigned(TempBuf[0])<0x1F) OutHexBuf[1]=0x1F;                // если символ непечатный - заменяем
                  else                          OutHexBuf[1]=TempBuf[0];          // иначе пишем как есть
                  Form1->RichEdit4->SelText=OutHexBuf[1];               // пишем
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit4->SelStart=10;                   // ставим курсор в нужную позицию
                Form1->RichEdit4->SelLength=0;                  // отменяем выделение
                break;
    default:    break;
  }
  LBar->Free();                 // уничтожаем форму с прогресс-баром
  Form1->PageControl1->Visible = true;
}
//---------------------------------------------------------------------------
//--- ПОМЕЩАЕМ ДАННЫЕ С ФОРМЫ В ПАМЯТЬ --------------------------------------
//---------------------------------------------------------------------------
void GetDataToMemory(unsigned char InForm, unsigned char OutArea)
{ AnsiString SubStr;                    // для преобразования
  char *InHexBuf, TempBuf[1];           // для преобразования
  unsigned int LineNum, LocalNum;       // для вычисления позиции байта
  unsigned int Size, TempID;            // размер области

  switch(SelectedChip.ID)
  {     case 0:         return; // если чип не выбран или неизвестен - выходим
        default:        break;
  }

  switch(OutArea)  // параметры области, в которую нужно выводить данные
  { case 1:     Size=SelectedChip.Area1Size;
                break;
    case 2:     Size=SelectedChip.Area2Size;
                break;
    default:    Size=0;
                break;
  }

  Form1->PageControl1->Visible = false;
  // включаем прогресс-бар
  Application->CreateForm(__classid(TLBar),&LBar);        // создаём форму с прогресс-баром
  LBar->Show();                                           // показываем её в немодальном окне
  switch(InForm)// из какой области брать данные
  { case 1:     // забираем данные с RichEdit1 (ПРОГРАММА)
                for(unsigned int i=0;i<Size;i++)        // будем перебирать все байты
                { // вычисляем позицию байта на форме
                  LineNum=i/16;                         // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                // номер байта в строке
                  // забираем байт с формы и переводим его hex
                  Form1->RichEdit1->SelStart=82*LineNum+10+3*LocalNum;   // ставим курсор на начало байта (в области слева)
                  Form1->RichEdit1->SelLength=2;                        // выделяем 2 символа
                  SubStr=LowerCase(Form1->RichEdit1->SelText);          // получаем их в строку
                  InHexBuf=SubStr.c_str();              //скопировать в буфер байт для передачи (в виде строки)
                  HexToBin(InHexBuf,TempBuf,1);         //преобразовать строку в целое (байт)
                  // сохраняем в память
                  switch(OutArea)
                  { case 1:  SelectedChip.Area1[i]=TempBuf[0];
                             break;
                    case 2:  SelectedChip.Area2[i]=TempBuf[0];
                             break;
                    default: break;
                  }
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit1->SelStart=10;                   // ставим курсор в нужную позицию
                Form1->RichEdit1->SelLength=0;                  // отменяем выделение
                break;
    case 2:     // забираем данные с RichEdit2 (ПРОГРАММА)
                for(unsigned int i=0;i<Size;i++)        // будем перебирать все байты
                { // вычисляем позицию байта на форме
                  LineNum=i/16;                         // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                // номер байта в строке
                  // забираем байт с формы и переводим его hex
                  Form1->RichEdit2->SelStart=82*LineNum+10+3*LocalNum;   // ставим курсор на начало байта (в области слева)
                  Form1->RichEdit2->SelLength=2;                        // выделяем 2 символа
                  SubStr=LowerCase(Form1->RichEdit2->SelText);          // получаем их в строку
                  InHexBuf=SubStr.c_str();               //скопировать в буфер байт для передачи (в виде строки)
                  HexToBin(InHexBuf,TempBuf,1);          //преобразовать строку в целое (байт)
                  // сохраняем в память
                  switch(OutArea)
                  { case 1:  SelectedChip.Area1[i]=TempBuf[0];
                             break;
                    case 2:  SelectedChip.Area2[i]=TempBuf[0];
                             break;
                    default: break;
                  }
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit2->SelStart=10;                   // ставим курсор в нужную позицию
                Form1->RichEdit2->SelLength=0;                  // отменяем выделение
                break;
    case 3:     // забираем данные с RichEdit3 (ДАННЫЕ)
                for(unsigned int i=0;i<Size;i++)        // будем перебирать все байты
                { // вычисляем позицию байта на форме
                  LineNum=i/16;                         // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                // номер байта в строке
                  // забираем байт с формы и переводим его hex
                  Form1->RichEdit3->SelStart=82*LineNum+10+3*LocalNum;   // ставим курсор на начало байта (в области слева)
                  Form1->RichEdit3->SelLength=2;                        // выделяем 2 символа
                  SubStr=LowerCase(Form1->RichEdit3->SelText);          // получаем их в строку
                  InHexBuf=SubStr.c_str();              //скопировать в буфер байт для передачи (в виде строки)
                  HexToBin(InHexBuf,TempBuf,1);         //преобразовать строку в целое (байт)
                  // сохраняем в память
                  switch(OutArea)
                  { case 1:  SelectedChip.Area1[i]=TempBuf[0];
                             break;
                    case 2:  SelectedChip.Area2[i]=TempBuf[0];
                             break;
                    default: break;
                  }
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit3->SelStart=10;                   // ставим курсор в нужную позицию
                Form1->RichEdit3->SelLength=0;                  // отменяем выделение
                break;
    case 4:     // забираем данные с RichEdit4 (ДАННЫЕ)
                for(unsigned int i=0;i<Size;i++)        // будем перебирать все байты
                { // вычисляем позицию байта на форме
                  LineNum=i/16;                         // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                // номер байта в строке
                  // забираем байт с формы и переводим его hex
                  Form1->RichEdit4->SelStart=82*LineNum+10+3*LocalNum;   // ставим курсор на начало байта (в области слева)
                  Form1->RichEdit4->SelLength=2;                        // выделяем 2 символа
                  SubStr=LowerCase(Form1->RichEdit4->SelText);          // получаем их в строку
                  InHexBuf=SubStr.c_str();               //скопировать в буфер байт для передачи (в виде строки)
                  HexToBin(InHexBuf,TempBuf,1);          //преобразовать строку в целое (байт)
                  // сохраняем в память
                  switch(OutArea)
                  { case 1:  SelectedChip.Area1[i]=TempBuf[0];
                             break;
                    case 2:  SelectedChip.Area2[i]=TempBuf[0];
                             break;
                    default: break;
                  }
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit4->SelStart=10;                   // ставим курсор в нужную позицию
                Form1->RichEdit4->SelLength=0;                  // отменяем выделение
                break;
    default:    break;
  }
  LBar->Free();                 // уничтожаем форму с прогресс-баром
  Form1->PageControl1->Visible = true;
}
//--------------------------------------------------------------------------
//--- переключаемся с одного программатора на другой -----------------------
//--------------------------------------------------------------------------
void SwitchToSelectedHW(int V)
{  SelectedProgrammer = V;
   switch(SelectedProgrammer)
   { case 1:    Form1->RH00041->Caption = "* RH-0004";
                Form1->RH00101->Caption = "   RH-0010";
                Form1->RadioButton1->Checked=true;
                break;
     case 2:    Form1->RH00041->Caption = "   RH-0004";
                Form1->RH00101->Caption = "* RH-0010";
                Form1->RadioButton2->Checked=true;
     default:   break;
   }
}
//---------------------------------------------------------------------------
//--- ЗАПОМИНАЕМ ВЫБОР ПРОГРАММАТОРА ----------------------------------------
//---------------------------------------------------------------------------
void SaveOptions()
{ TFileStream* fs;              // указатель на поток записи
  char Symbol[1];               // символы для сохранения

  fs = new TFileStream("options.ini",fmCreate|fmOpenWrite);  // открываем файл для записи
  Symbol[0]=char(SelectedProgrammer);                        // символ, который будем сохранять
  fs->Write(Symbol,1);                                       // сохраняем в файл
  delete fs;                                                 // закрываем поток записи
}
//---------------------------------------------------------------------------
//--- ЗАГРУЖАЕМ СОХРАНЁННЫЙ ВЫБОР ПРОГРАММАТОРА -----------------------------
//---------------------------------------------------------------------------
void LoadOptions()
{ TFileStream* fs;              // указатель на поток чтения
  unsigned char rffch[1];       // сюда читаем байты из файла

  if(FileExists("options.ini"))
  { fs=new TFileStream("options.ini",fmOpenRead);         // создаём поток для чтения
    if(fs->Read(rffch,1))                                 // если успешно прочитали 1 байт - пихаем их куда нужно
    {         SelectedProgrammer=rffch[0];                // первый байт - тип программатора
    }
    else
    {         SelectedProgrammer=2;                       // по-умолчанию - RH-0010
    }
    delete fs;                                            // удаляем поток чтения
  }
  else
  {           SelectedProgrammer=2;                       // по-умолчанию - RH-0010
  }
}
//---------------------------------------------------------------------------

