Текущий раздел:

Описания RDS

Руководство программиста

Глава 2. Создание моделей блоков

§2.8. Сохранение и загрузка параметров блока

§2.8.2. Сохранение параметров в двоичном формате

# Руководство программиста

## Глава 2. Создание моделей блоков

### §2.8. Сохранение и загрузка параметров блока

#### §2.8.2. Сохранение параметров в двоичном формате

Рассматривается сохранение и загрузка личных данных блока в двоичном формате, описываются соответствующие реакции модели (RDS_BFM_SAVEBIN и RDS_BFM_LOADBIN соответственно). В один из ранее описанных примеров добавляется сохранение и загрузка параметров в двоичном формате.

В качестве самого простого примера рассмотрим сохранение и загрузку параметров блока в двоичном формате для модели Test1. Ранее мы уже добавили в эту модель функцию настройки параметров, теперь сделаем так, чтобы значения этих параметров сохранялись вместе с блоком. Теперь функция модели будет выглядеть следующим образом (изменения выделены цветом):

      //============= Модель блока ==============
      extern "C" __declspec(dllexport)
        int RDSCALL Test1(int CallMode,
                          RDS_PBLOCKDATA BlockData,
                          LPVOID ExtParam)
      { TTest1Data *data;
        switch(CallMode)
          { case RDS_BFM_INIT: // Инициализация
              BlockData->BlockData=new TTest1Data();
              break;
            case RDS_BFM_CLEANUP:// Очистка
              data=(TTest1Data*)(BlockData->BlockData);
              delete data;
              break;
            case RDS_BFM_SETUP: // Функция настройки
              data=(TTest1Data*)(BlockData->BlockData);
              return data->Setup();
            case RDS_BFM_SAVEBIN:
              // Сохранение параметров в двоичном формате
              data=(TTest1Data*)(BlockData->BlockData);
              rdsWriteBlockData(&(data->IParam),sizeof(data->IParam));
              rdsWriteBlockData(&(data->DParam),sizeof(data->DParam));
              break;
            case RDS_BFM_LOADBIN:
              // Загрузка параметров в двоичном формате
              data=(TTest1Data*)(BlockData->BlockData);
              rdsReadBlockData(&(data->IParam),sizeof(data->IParam));
              rdsReadBlockData(&(data->DParam),sizeof(data->DParam));
              break;
          }
        return RDS_BFR_DONE;
      }
      //=========================================

Как уже отмечалось, основное достоинство двоичного формата – простота реализации. Для каждого из параметров потребовалось всего два вызова функций: один – для сохранения, другой – для загрузки.

При сохранении схемы, записи блока в библиотеку или копировании его в буфер обмена модель будет вызвана с параметром RDS_BFM_SAVEBIN для сохранения данных в двоичном формате. Точнее, при сохранении схемы или записи блока в библиотеку модель сначала будет вызвана для сохранения данных в текстовом формате с параметром RDS_BFM_SAVETXT, но, поскольку реакция на это событие отсутствует, ничего не будет сохранено, и RDS вызовет модель еще раз с параметром RDS_BFM_SAVEBIN. Как и в реакциях на другие события в этой модели, указатель на личную область данных блока, хранящийся в BlockData->BlockData, будет приведен к типу «указатель на TTest1Data» и присвоен вспомогательной переменной data. В личной области данных блока хранятся два параметра: целый IParam и вещественный DParam. Каждый из них сохраняется при помощи сервисной функции rdsWriteBlockData. Эта функция принимает два параметра: указатель на начало области памяти, которую нужно сохранить, и размер этой области в байтах. Для каждого из двух параметров передается указатель на него и размер этого параметра, полученный при помощи оператора sizeof. В результате двух последовательных вызовов этой функции в RDS будет передано 12 байтов: 4 байта займет целое число IParam, и 8 байтов займет вещественное число с двойной точностью (double) DParam. Если блок копировался в буфер обмена, эти 12 байтов попадут туда вместе с остальными данными этого блока. Если же запись производилась в текстовом формате, они будут преобразованы в 24 шестнадцатеричных символа и добавлены к тексту параметров блока отдельной строкой, начинающейся с «dlldata data 12».

При загрузке схемы или добавлении в нее блока из библиотеки или буфера обмена модель будет вызвана с параметром RDS_BFM_LOADBIN, поскольку данные блока были сохранены в двоичном формате. Параметры IParam и DParam загружаются двумя последовательными вызовами функции rdsReadBlockData, в том же порядке, в котором они сохранялись. Как и парная ей функция rdsWriteBlockData, rdsReadBlockData принимает два параметра – указатель на начало загружаемой области и размер этой области.

Теперь измененные параметры блока не будут теряться при сохранении и последующей загрузке схемы. Для этого потребовалось всего четыре вызова – по два на каждый параметр. Следует, однако, помнить, что любое изменение типа или последовательности сохраняемых параметров приведет к тому, что старые схемы с этим блоком будут загружаться с ошибками.