Программный Файл: ...\Samples\Solution\Ffc\_PoolManager.scx

Представленный пример демонстрирует, как вы можете использовать в своих Проектах класс Диспетчера Пула (Pool Manager), который обеспечивает управление некоторым множеством или Коллекцией Объектов, интенсивно и неоднократно используемых в короткий промежуток времени.

В данном примере используются следующие Классы.

Класс Библиотека Классов Краткое Описание

_poolmanager

_poolmanager.vcx

Обеспечивает эффективное управление Коллекцией или подмножеством Объектов одного пользовательского Класса.

Пулинг Объектов (объединение)

В представленном примере, пользовательские Формы собраны в некоторый Пул (Коллекцию) таким образом, что уже созданные Формы могут быть использованы неоднократно при обработке Данных, выборе конкретного Клиента. (Вместо того, чтобы каждый раз создавать новый Экземпляр рассматриваемого набора Форм.)

Для использования функций класса Диспетчера Пула достаточно определить следующие Значения для базовых Свойств:

cClass   = frmCustomer

cClassLibrary = frmCustomer.vcx

Связывание ключевых Событий Диспетчера Пула

Вы можете Связать основные События рассматриваемого класса _PoolManager. В рассматриваемом примере: в соответствующем Событии пользовательский формы Init  выполняется Определение Локального обработчика для соответствующих Событий-Методов рассматриваемого Класса: PoolManager_ObjectRequested и PoolManager_ObjectReturned, а соответствующие Обработчики в локальной форме: _PoolManager ObjectRequested и ObjectReturned, которые отслеживают текущее состояние Базовых Событий:

  CopyCode imageКопировать Код
BINDEVENT(This.PoolManager,"ObjectRequested",ThisForm,"PoolManager_ObjectRequested")
BINDEVENT(This.PoolManager,"ObjectReturned",ThisForm,"PoolManager_ObjectReturned")

Requesting Objects (Вызов Объектов)

Для вызова (активации) требуемого объекта из созданного Пула, достаточно вызвать соответствующий Метод Get Диспетчера _PoolManager.

Для открытия пользовательской Формы в рассматриваемом Примере:

  1. Выберите Имя Клиента в представленном Списке.

  2. Выполните команду View Customer (Просмотр Клиента).

Вы можете открыть несколько копий Формы, выбрав различных Клиентов (как показано выше) - View Customer, в каждом случае вызов Объекта указанной Формы выполняется при помощи рассматриваемого Диспетчера Пула Объектов. Метод пользовательской формы ViewCustomer может содержать следующий фрагмент программного кода:

  CopyCode imageКопировать Код
loForm = ThisForm.PoolManager.Get(m.lcCustID)
If Vartype(m.loForm) == "O"
loForm.Show()
EndIf

В данном примере, указанный Метод Get возвращает еще неиспользуемый Объект из Пула или создает Новый Объект (Форму). Когда вы выбираете нового Клиента (создается соответствующая форма данного Клиента), в соответствующем событии Init данной формы выполняется привязка Событий диспетчера Пула (форм): _PoolManager ObjectRequested и ObjectReturned, которые "закрепляются" за приватными переменными с именем THISPOOLMANAGER, которые создаются в каждой копии Метода Get:

  CopyCode imageКопировать Код
BINDEVENT(THISPOOLMANAGER,"ObjectRequested",This,"PoolManager_ObjectRequested")
BINDEVENT(THISPOOLMANAGER,"ObjectReturned",This,"PoolManager_ObjectReturned")

В таком случае, можно использовать выполнение для пользовательской Формы Метода Hide - вместо метода Release, что обеспечивает более эффективное управление Пулом пользовательских Форм (формы не разрушаются при их закрытии, и не создаются вновь при повторном обращении).

Returning Objects (Возврат Объектов)

Для освобождения сохраненного ранее Объекта в Пуле Диспетчера _PoolManager используется соответствующий метод Free. В рассматриваемом примере, в пользовательской форме, в соответствующем событии QueryUnloadсодержится следующий фрагмент программного кода, который фактически  "освобождает" данный Объект из под Контроля Диспетчера (исключает из Пула):

  CopyCode imageКопировать Код
If Vartype(This.oPoolManager) == "O"
This.oPoolManager.Free(This)
NoDefault
EndIf

См. также