Объекты и источники данных. Создание и деструкция

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

Создание объектов данных

Объекты данных используются конечным приложением: клиентом или сервером. Объект данных в конечном приложении — это один конец соединения между исходным и конечным приложениями. Объект данных в конечном приложении используется для доступа к данным источника данных и взаимодействия с ними.

Существует две стандартные ситуации, когда требуется объект данных. Первая ситуация: данные сбрасываются в приложение с помощью перетаскивания. Вторая ситуация: выбор команды "Вставка" или "Специальная вставка" в меню "Правка".

В первой ситуации необходимо создать объект данных. Указатель на существующий объект данных будет передан функции OnDrop. Этот объект данных создается платформой как часть операции перетаскивания и также будут уничтожен платформой. Это не всегда так при вставке другим способом. Дополнительные сведения см. в разделе "Уничтожение объектов данных".

Если приложение выполняет вставку или специальную вставку, вам необходимо создать объект COleDataObject и вызвать его функцию-член AttachClipboard. При этом объект данных связывается с данными в буфере обмена. Затем можно использовать этот объект данных в функции вставки.

Уничтожение объектов данных

Если вы следуйте схеме, описанной в разделе "Создание объектов данных", уничтожение объектов данных является тривиальным аспектом передачи данных. Объект данных, который был создан в функции вставки, будет уничтожен MFC при возврате из функции вставки.

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

Создание источников данных

Источники данных используются источником передачи данных, которым может быть клиент или сервер. Источник данных в исходном приложении — это один конец соединения между исходным и конечным приложениями. Объект данных в конечном приложении используется для взаимодействия с данными источника данных.

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

  1. Пользователь выбирает некоторые данные.

  2. Пользователь выбирает "Копировать " (или "Вырезать") в меню "Изменить " или начинает операцию перетаскивания.

  3. В зависимости от структуры программы приложение создает объект COleDataSource или объект класса, производного от COleDataSource.

  4. Выбранные данные вставляются в источник данных путем вызова одной из функций в группе COleDataSource::CacheData или COleDataSource::DelayRenderData.

  5. Приложение вызывает функцию-член SetClipboard (или DoDragDrop, если это операция перетаскивания) объекта, созданного на шаге 3.

  6. Если это операция вырезания или DoDragDrop возвращается DROPEFFECT_MOVE, данные, выбранные на шаге 1, удаляются из документа.

Этот сценарий реализуется примерами OLE MFC OCLIENT и HIERSVR. Посмотрите на источник производного от CView класса каждого приложения для всех функций, за исключением GetClipboardData и OnGetClipboardData. Эти две функции находятся в реализации производных от COleClientItem или COleServerItem классов. Эти примеры служат хорошим примером реализации этих концепций.

Еще одна ситуация, в которой может потребоваться создать объект COleDataSource, возникает при изменении поведения операции перетаскивания по умолчанию. Дополнительные сведения см. в статье о перетаскивании OLE: настройка перетаскивания .

Уничтожение источников данных

Источники данных должно уничтожить приложение, которое в данный момент отвечает за них. В ситуациях, когда вы отправляете источник данных в OLE, например вызов COleDataSource::D oDragDrop, необходимо вызвать pDataSrc->InternalRelease. Например:

void CMyListView::OnLvnBegindrag(NMHDR *pNMHDR, LRESULT *pResult)
{
   UNREFERENCED_PARAMETER(pResult);

   LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

   CMyDataSource* pDataSrc = new CMyDataSource();
   if (NULL != pDataSrc)
   {
      pDataSrc->Initialize(pNMLV, this);
      pDataSrc->DelayRenderData((CLIPFORMAT)RegisterClipboardFormat(_T("TIGroupFiles")));
      pDataSrc->DoDragDrop();
      pDataSrc->InternalRelease();
   }
}

Если вы не передали источник данных OLE, то вы отвечаете за его уничтожение, как для любого типичного объекта C++.

Дополнительные сведения см. в разделе "Перетаскивание", "Буфер обмена" и "Управление объектами данных" и "Источники данных".

См. также

Объекты и источники данных (OLE)
Класс COleDataObject
Класс COleDataSource