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

Описания RDS

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

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

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

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

Полный исходный текст на языке C++ для библиотеки (DLL) с моделью блока, сохраняющего параметры в двоичном формате. Изменения относительно предыдущей версии этой модели выделены цветом.

      // Сохранение параметров в двоичном формате
      #include <windows.h>
      #include <math.h>
      #include <RdsDef.h>
      // Подготовка описаний сервисных функций
      #define RDS_SERV_FUNC_BODY GetInterfaceFunctions
      #include <RdsFunc.h>

      //========== Главная функция DLL ==========
      int WINAPI DllMain(HINSTANCE /*hinst*/,
                               unsigned long reason,
                               void* /*lpReserved*/)
      { if(reason==DLL_PROCESS_ATTACH) // Загрузка DLL
          { // Получение доступа к функциям RDS
            if(!GetInterfaceFunctions())
              RDS_SERV_ERROR_MSGW // Сообщение: старая версия RDS
          }
        return 1;
      }
      //========= Конец главной функции =========

      //=========================================
      //= Пример блока с личной областью данных =
      //=========================================

      //====== Класс личной области данных ======
      class TTest1Data
      { public:
          int IParam;       // Целый параметр
          double DParam;    // Вещественный параметр
          int Setup(void);  // Функция настройки параметров
          TTest1Data(void)  // Конструктор класса
            { IParam=0; DParam=0.0;
              rdsMessageBoxW(L"Область создана",L"TTest1Data",MB_OK);
            };
          ~TTest1Data()     // Деструктор класса
            { rdsMessageBoxW(L"Область удалена","LTTest1Data",MB_OK);};
      };
      //=========================================

      //============= Модель блока ==============
      extern "C" __declspec(dllexport)
        int RDSCALL Test1(int CallMode, // Режим вызова (событие в RDS)
                          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;
      }
      //=========================================
      // Функция настройки параметров
      // ВАЖНО: Исходный текст программы должен быть записан в UTF8,
      //   в противном случае необходимо использовать версии функций
      //   с суффиксом "W" и символьные константы с префиксом "L"
      int TTest1Data::Setup(void)
      { RDS_HOBJECT window; // Идентификатор вспомогательного объекта
        BOOL ok;            // Пользователь нажал "OK"
        // Создание окна
        window=rdsFORMCreate(FALSE,-1,-1,"Ввод параметров");
        // Добавление полей ввода
        rdsFORMAddEdit(window,0,1,RDS_FORMCTRL_EDIT,
                       "Целый параметр:",80);
        rdsFORMAddEdit(window,0,2,RDS_FORMCTRL_EDIT,
                       "Вещественный параметр:",80);
        // Занесение исходных значений в поля ввода
        rdsSetObjectInt(window,1,RDS_FORMVAL_VALUE,IParam);
        rdsSetObjectDouble(window,2,RDS_FORMVAL_VALUE,DParam);
        // Открытие окна
        ok=rdsFORMShowModalEx(window,NULL);
        if(ok)
          { // Нажата кнопка OK - запись параметров обратно в блок
            IParam=rdsGetObjectInt(window,1,RDS_FORMVAL_VALUE);
            DParam=rdsGetObjectDouble(window,2,RDS_FORMVAL_VALUE);
          }
        // Уничтожение окна
        rdsDeleteObject(window);
        // Возвращаемое значение
        return ok?RDS_BFR_MODIFIED:RDS_BFR_DONE;
      }
      //=========================================