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

#include "FormFunctions.h"      // переменные для работы с формой
#include "Main.h"               // переменные для работы с главной формой
#include "LockFuses.h"          // для использования окна LockFusesForm
#include "PortFunctions.h"      // переменные для функций работы с портом
#include "ChipFunctions.h"      // переменные для работы с чипом
#include "ProgressBar.h"        // для использования прогресс-бара
#include "Image.h"              // для использования окна ImageForm
//---------------------------------------------------------------------------
#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->CheckBox1->Enabled     = true;         // активируем чекбоксы
  Form1->CheckBox2->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->CheckBox1->Enabled     = false;        // деактивируем чекбоксы
  Form1->CheckBox2->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;
                FormData.RE6Size=SelectedChip.Area3Size;
                FormData.RE7Size=SelectedChip.Area3Size;
                break;
  }
  InitDataOnForm(1);                            // инициализируем данные RichEdit1
  InitDataOnForm(2);                            // инициализируем данные RichEdit2
  InitDataOnForm(3);                            // инициализируем данные RichEdit3
  InitDataOnForm(4);                            // инициализируем данные RichEdit4
  InitDataOnForm(6);                            // инициализируем данные RichEdit6
  InitDataOnForm(7);                            // инициализируем данные RichEdit7
  Form1->Edit1->Text=SelectedChip.Name;         // подписываем имя чипа на форме
  // здесь мы ещё выполняли LoadImage, но теперь она у нас отображается на отдельной форме
  PlaceDataToForm(0,0);                         // выводим ID в Edit2
}
//---------------------------------------------------------------------------
//--- ИНИЦИАЛИЗАЦИЯ ДАННЫХ ФОРМЫ ДЛЯ ВЫБРАННОЙ ОБЛАСТИ ----------------------
//---------------------------------------------------------------------------
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(8*i),8)+": 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF   |   я?я?я?я?я?я?я?я?");       // строка 72 символа + CR+LF = 74
                // убираем переносы в последней строке
                Form1->RichEdit1->SelStart=74*(i-1)+72;
                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(8*i),8)+": 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF   |   я?я?я?я?я?я?я?я?");       // строка 72 символов
                // убираем переносы в последней строке
                Form1->RichEdit2->SelStart=74*(i-1)+72;
                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   |   яяяяяяяяяяяяяяяя");       // строка 80 символов
                // убираем переносы в последней строке
                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   |   яяяяяяяяяяяяяяяя");       // строка 80 символов
                // убираем переносы в последней строке
                Form1->RichEdit4->SelStart=82*(i-1)+80;
                Form1->RichEdit4->SelLength=2;
                Form1->RichEdit4->SelText="";
                Form1->RichEdit4->Visible=true;         // делаем область видимой
                break;
    case 6:     // инициализируем RichEdit6 (конфигурация)
                Form1->RichEdit6->Visible=false;        // делаем область невидимой
                Form1->RichEdit6->Clear();              // очищаем RichEdit1
                for(i=0; i<FormData.RE6Size/16; i++)    // заполняем строки
                  Form1->RichEdit6->Lines->Add(IntToHex(int(8*i+SelectedChip.ConfigStart),8)+": 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF   |   я?я?я?я?я?я?я?я?");       // строка 72 символов + CR+LF = 74
                // убираем переносы в последней строке
                Form1->RichEdit6->SelStart=74*(i-1)+72;
                Form1->RichEdit6->SelLength=2;
                Form1->RichEdit6->SelText="";
                Form1->RichEdit6->Visible=true;         // делаем область видимой
                break;
    case 7:     // инициализируем RichEdit7 (конфигурация)
                Form1->RichEdit7->Visible=false;        // делаем область невидимой
                Form1->RichEdit7->Clear();              // очищаем RichEdit2
                for(i=0; i<FormData.RE7Size/16; i++)    // заполняем строки
                  Form1->RichEdit7->Lines->Add(IntToHex(int(8*i+SelectedChip.ConfigStart),8)+": 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF   |   я?я?я?я?я?я?я?я?");       // строка 72 символов
                // убираем переносы в последней строке
                Form1->RichEdit7->SelStart=74*(i-1)+72;
                Form1->RichEdit7->SelLength=2;
                Form1->RichEdit7->SelText="";
                Form1->RichEdit7->Visible=true;         // делаем область видимой
                break;
    default:    break;
  }
}
//---------------------------------------------------------------------------
//--- ЗАГРУЖАЕМ СХЕМУ ПОДКЛЮЧЕНИЯ -------------------------------------------
//---------------------------------------------------------------------------
void LoadImage()
{ if(FileExists(SelectedChip.ImageName))        // загружаем схему подключения
  { ImageForm->Image1->Picture->LoadFromFile(SelectedChip.ImageName);
  }
  else
  { MessageBox(NULL,"Невозможно отобразить схему подключения,\n(не найден файл картинки). Или подключайте\nпо даташиту, или скачайте полную версию\nпрограммы с сайта radiohlam.ru","Error",MB_OK);
    ImageForm->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;
    case 3:     Size=SelectedChip.Area3Size;
                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=2; i>0; i--)
                { // переводим очередной байт в hex-строку
                  TempBuf[0]=SelectedChip.ID>>(8*(i-1));// берём байт
                  BinToHex(TempBuf,OutHexBuf,1);        // преобразовать строку в целое (байт)
                  OutHexBuf[2]=0;                       // строка должна заканчиваться нулём
                  TempIDStr+=UpperCase(OutHexBuf);      // переводим в верхний регистр
                }
                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;
                    case 3: TempBuf[0]=SelectedChip.Area3[i];
                            break;
                    default: TempBuf[0]=0;
                             break;
                  }
                  BinToHex(TempBuf,OutHexBuf,1);        // преобразовать строку в целое (байт)
                  OutHexBuf[2]=0;                       // строка должна заканчиваться нулём
                  // и вычисляем его положение
                  LineNum=i/16;                         // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                // номер байта в строке (считая с нуля)
                  // меняем область слева
                  if(LocalNum%2)        // если это нечётный (старший байт)
                  { Form1->RichEdit1->SelStart=LineNum*74+10+5*(LocalNum-1)/2; } // ставим курсор на начало старшего байта
                  else                  // если это чётный (младший байт)
                  { Form1->RichEdit1->SelStart=LineNum*74+12+5*LocalNum/2; }     // ставим курсор на начало младшего байта
                  Form1->RichEdit1->SelLength=2;                        // выделяем 2 символа
                  Form1->RichEdit1->SelText=UpperCase(OutHexBuf);       // заменяем на OutHexBuf (2 символа и нуль-терминатор, который не будет записан)
                  // меняем область справа
                  Form1->RichEdit1->SelStart=LineNum*74+56+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;
                    case 3: TempBuf[0]=SelectedChip.Area3[i];
                            break;
                    default: TempBuf[0]=0;
                             break;
                  }
                  BinToHex(TempBuf,OutHexBuf,1);        // преобразовать строку в целое (байт)
                  OutHexBuf[2]=0;                       // строка должна заканчиваться нулём
                  // и вычисляем его положение
                  LineNum=i/16;                          // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                 // номер байта в строке (считая с нуля)
                  // меняем область слева
                  if(LocalNum%2)        // если это нечётный (старший байт)
                  { Form1->RichEdit2->SelStart=LineNum*74+10+5*(LocalNum-1)/2; } // ставим курсор на начало старшего байта
                  else                  // если это чётный (младший байт)
                  { Form1->RichEdit2->SelStart=LineNum*74+12+5*LocalNum/2; }     // ставим курсор на начало младшего байта
                  Form1->RichEdit2->SelLength=2;                        // выделяем 2 символа
                  Form1->RichEdit2->SelText=UpperCase(OutHexBuf);       // заменяем на OutHexBuf (2 символа и нуль-терминатор, который не будет записан)
                  // меняем область справа
                  Form1->RichEdit2->SelStart=LineNum*74+56+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;
                    case 3: TempBuf[0]=SelectedChip.Area3[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;
                    case 3: TempBuf[0]=SelectedChip.Area3[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;
    case 6:     // помещаем нужные данные в RichEdit6 (конфигурация)
                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;
                    case 3: TempBuf[0]=SelectedChip.Area3[i];
                            break;
                    default: TempBuf[0]=0;
                             break;
                  }
                  BinToHex(TempBuf,OutHexBuf,1);        // преобразовать строку в целое (байт)
                  OutHexBuf[2]=0;                       // строка должна заканчиваться нулём
                  // и вычисляем его положение
                  LineNum=i/16;                         // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                // номер байта в строке (считая с нуля)
                  // меняем область слева
                  if(LocalNum%2)        // если это нечётный (старший байт)
                  { Form1->RichEdit6->SelStart=LineNum*74+10+5*(LocalNum-1)/2; } // ставим курсор на начало старшего байта
                  else                  // если это чётный (младший байт)
                  { Form1->RichEdit6->SelStart=LineNum*74+12+5*LocalNum/2; }     // ставим курсор на начало младшего байта
                  Form1->RichEdit6->SelLength=2;                        // выделяем 2 символа
                  Form1->RichEdit6->SelText=UpperCase(OutHexBuf);       // заменяем на OutHexBuf (2 символа и нуль-терминатор, который не будет записан)
                  // меняем область справа
                  Form1->RichEdit6->SelStart=LineNum*74+56+LocalNum;    // ставим курсор в нужную позицию
                  Form1->RichEdit6->SelLength=1;                        // выделяем 1 символ
                  if(unsigned(TempBuf[0])<0x1F) OutHexBuf[1]=0x1F;                // если символ непечатный - заменяем
                  else                          OutHexBuf[1]=TempBuf[0];          // иначе пишем как есть
                  Form1->RichEdit6->SelText=OutHexBuf[1];               // пишем
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit6->SelStart=10;                  // ставим курсор в нужную позицию
                Form1->RichEdit6->SelLength=0;                  // отменяем выделение
                break;
    case 7:     // помещаем нужные данные в RichEdit7 (конфигурация)
                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;
                    case 3: TempBuf[0]=SelectedChip.Area3[i];
                            break;
                    default: TempBuf[0]=0;
                             break;
                  }
                  BinToHex(TempBuf,OutHexBuf,1);        // преобразовать строку в целое (байт)
                  OutHexBuf[2]=0;                       // строка должна заканчиваться нулём
                  // и вычисляем его положение
                  LineNum=i/16;                          // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                 // номер байта в строке (считая с нуля)
                  // меняем область слева
                  if(LocalNum%2)        // если это нечётный (старший байт)
                  { Form1->RichEdit7->SelStart=LineNum*74+10+5*(LocalNum-1)/2; } // ставим курсор на начало старшего байта
                  else                  // если это чётный (младший байт)
                  { Form1->RichEdit7->SelStart=LineNum*74+12+5*LocalNum/2; }     // ставим курсор на начало младшего байта
                  Form1->RichEdit7->SelLength=2;                        // выделяем 2 символа
                  Form1->RichEdit7->SelText=UpperCase(OutHexBuf);       // заменяем на OutHexBuf (2 символа и нуль-терминатор, который не будет записан)
                  // меняем область справа
                  Form1->RichEdit7->SelStart=LineNum*74+56+LocalNum;    // ставим курсор в нужную позицию
                  Form1->RichEdit7->SelLength=1;                        // выделяем 1 символ
                  if(unsigned(TempBuf[0])<0x1F) OutHexBuf[1]=0x1F;                // если символ непечатный - заменяем
                  else                          OutHexBuf[1]=TempBuf[0];          // иначе пишем как есть
                  Form1->RichEdit7->SelText=OutHexBuf[1];               // пишем
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit7->SelStart=10;                   // ставим курсор в нужную позицию
                Form1->RichEdit7->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;
    case 3:     Size=SelectedChip.Area3Size;
                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
                  if(LocalNum%2)        // если это нечётный (старший байт)
                  { Form1->RichEdit1->SelStart=LineNum*74+10+5*(LocalNum-1)/2; } // ставим курсор на начало байта (в области слева)
                  else                  // если это чётный (младший байт)
                  { Form1->RichEdit1->SelStart=LineNum*74+12+5*LocalNum/2; }     // ставим курсор на начало байта (в области слева)
                  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;
                    case 3:  SelectedChip.Area3[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
                  if(LocalNum%2)        // если это нечётный (старший байт)
                  { Form1->RichEdit2->SelStart=LineNum*74+10+5*(LocalNum-1)/2; } // ставим курсор на начало байта (в области слева)
                  else                  // если это чётный (младший байт)
                  { Form1->RichEdit2->SelStart=LineNum*74+12+5*LocalNum/2; }     // ставим курсор на начало байта (в области слева)
                  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;
                    case 3:  SelectedChip.Area3[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;
    case 6:     // забираем данные с RichEdit6 (конфигурация)
                for(unsigned int i=0;i<Size;i++)        // будем перебирать все байты
                { // вычисляем позицию байта на форме
                  LineNum=i/16;                         // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                // номер байта в строке
                  // забираем байт с формы и переводим его hex
                  if(LocalNum%2)        // если это нечётный (старший байт)
                  { Form1->RichEdit6->SelStart=LineNum*74+10+5*(LocalNum-1)/2; } // ставим курсор на начало байта (в области слева)
                  else                  // если это чётный (младший байт)
                  { Form1->RichEdit6->SelStart=LineNum*74+12+5*LocalNum/2; }     // ставим курсор на начало байта (в области слева)
                  Form1->RichEdit6->SelLength=2;                        // выделяем 2 символа
                  SubStr=LowerCase(Form1->RichEdit6->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;
                    case 3:  SelectedChip.Area3[i]=TempBuf[0];
                             break;
                    default: break;
                  }
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit6->SelStart=10;                   // ставим курсор в нужную позицию
                Form1->RichEdit6->SelLength=0;                  // отменяем выделение
                break;
    case 7:     // забираем данные с RichEdit7 (конфигурация)
                for(unsigned int i=0;i<Size;i++)        // будем перебирать все байты
                { // вычисляем позицию байта на форме
                  LineNum=i/16;                         // номер строки, в которой расположен байт
                  LocalNum=i-16*LineNum;                // номер байта в строке
                  // забираем байт с формы и переводим его hex
                  if(LocalNum%2)        // если это нечётный (старший байт)
                  { Form1->RichEdit7->SelStart=LineNum*74+10+5*(LocalNum-1)/2; } // ставим курсор на начало байта (в области слева)
                  else                  // если это чётный (младший байт)
                  { Form1->RichEdit7->SelStart=LineNum*74+12+5*LocalNum/2; }     // ставим курсор на начало байта (в области слева)
                  Form1->RichEdit7->SelLength=2;                        // выделяем 2 символа
                  SubStr=LowerCase(Form1->RichEdit7->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;
                    case 3:  SelectedChip.Area3[i]=TempBuf[0];
                             break;
                    default: break;
                  }
                  // если кратно 1024 - вычисляем новую позицию прогресс-бара
                  if(i%1024==0)
                  { LBar->ProgressBar1->Position=100*(i+1)/Size;
                  }
                }
                // устанавливаем курсор на начало
                Form1->RichEdit7->SelStart=10;                   // ставим курсор в нужную позицию
                Form1->RichEdit7->SelLength=0;                  // отменяем выделение
                break;
    default:    break;
  }
  LBar->Free();                 // уничтожаем форму с прогресс-баром
  Form1->PageControl1->Visible = true;
}
//---------------------------------------------------------------------------

