--- title: "Пример использования функций работы с динамическими массивами" type: guide api: [api7] tags: [guide, api7, dynamic] sources: - dynamic_massiv_func_example.html --- ## Пример использования функций работы с динамическими массивами struct User_Data // определение структуры пользовательского массива { int I; char *c; float f; }; //функция удаляет элемент User_Data пользовательского массива void WINAPI DelUserFunc (void *val) { User_Data *tmp = (User_Data *)val; Message(tmp->c); delete [] tmp->c; delete tmp; } //функция добавляет элемент User_Data в пользовательский массив int CreateUserItem (reference arr, int i, char *c, float f) { User_Data* tmp = new User_Data; tmp->i = I; tmp->c = new char [strlen(c) +1]; strcpy (tmp->c, c); tmp->f = f; return AddArrayItem (arr, -1, tmp, 0); } //функция выдает содержимое элемента User_Data void ShowUserItem (User_Data & tmp) { char buf[128]; sprintf (buf, " i=%d f=%f\n c=%s ", tmp.i, tmp.f, tmp.c); Message (buf); } void Array_Example (void) { User_Data *tmp; //создадим пользовательский массив неопределенной длины reference userArr = CreateArray (USER_ARR, DelUserFunc); if (!CreateUserItem (userArr, 1, "январь", 31.)) MessageBoxResult(); if (!CreateUserItem (userArr, 2, "февраль", 29.)) MessageBoxResult(); if (!CreateUserItem (userArr, 3, "март", 31.)) MessageBoxResult(); //просмотрим массив for (int i=0; i< GetArrayCount(userArr); i++) { // получим указатель на элемент массива GetUserArrayItem (userArr, i, &(void*)tmp); ShowUserItem (*tmp); } ClearArray (userArr); //очистить массив Message ("удаляем массив"); DeleteArray (userArr); }; ## Пример обработки динамического запроса при создании панели инструментов ![st_reduc](../resources/images_st_reduc.jpg) В качестве примера используется процесс указания точки и угла Placement. Процесс содержит системную панель, элементы управления которой позволяют задать два параметра - точку и угол. Можно выделить 3 состояния процесса: •указание точки, •указание угла, •все задано. Если процесс переходит в состояния все задано, то возможны два варианта. Автоматически запускается создание объекта. Процесс ожидает ручного нажатия кнопки Создать объект . При этом никакие функции CallBack не выполняются. В API за это отвечает свойство IProcessParam::AutoReduce, Таким образом, создавая панель, содержащую кнопку Автосоздание объекта с возможностью управлять ее состоянием (нажата/отжата) через ButtonUpdate, необходимо в первый раз синхронизировать состояния кнопки и флага IProcessParam::AutoReduce. Предположим, что процесс запускается с нажатой кнопкой автосоздания. Необходимо задать значение IProcessParam::AutoReduce, равное TRUE. Поля задания точки и угла на панели расфиксированы. Первый щелчок мыши в поле чертежа фиксирует точку, второй фиксирует угол и по флагу IProcessParam::AutoReduce запускается создание объекта. После этого поля задания точки и угла расфиксируются, то есть процесс переходит в начальное состояние (благодаря флагу IProcessParam::AutoReduce=TRUE). В случае нажатия кнопки автосоздания в процессе, событие придет в библиотеку, и инвертирует флаг IProcessParam::AutoReduce в самом процессе автоматически. Пользовательская панель может содержать только элементы управления, а не поля задания параметров. На построения они не влияют, так как таблица состояний статическая и описывается до запуска процесса. Таким образом, если процесс перешел в состояние все задано, то есть значения всех параметров установлены и на пользовательской панели можно только отрабатывать изменение состояния элементов управления, никакие CallBack - функции не выполняются. У процесса указания точки Cursor аналогичная схема работы, но задаваемый параметр всего один и первый же щелчок мыши в поле чертежа переводит процесс в состояние все задано. Для имитации работы процесса Cursor с постоянным присутствием вызовов CallBack'ов необходимо выполнить следующие действия: 1. На старте процесса задать значение IProcessParam::AutoReduce, равное TRUE. 2. В событии ButtonClick на нажатия кнопки автосоздания всегда возвращать FALSE, то есть не давать процессу инвертировать значение IProcessParam::AutoReduce. 3. Управлять состоянием кнопки в ButtonUpdate по собственному усмотрению. 4. Всю логику работы реализовать в функции обратной связи CallBack, то есть, если заданы не все значения параметров, то возвращать 1, а если все, то 0.