---
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.
