Поделиться через


Объекты данных и источники данных: манипуляция

После создания объекта данных или источника данных можно выполнить ряд распространенных операций с данными, таких как вставка и удаление данных, перечисление форматов данных и многое другое. В этой статье описываются методы, необходимые для выполнения наиболее распространенных операций. Ниже приведены разделы:

Вставка данных в источник данных

Способ вставки данных в источник данных зависит от того, предоставляются ли данные немедленно или по запросу, а также от того, в каком носителе он предоставляется. Ниже приведены возможности.

Немедленное предоставление данных (мгновенная отрисовка)

  • Вызывайте COleDataSource::CacheGlobalData многократно для каждого формата буфера обмена, в котором вы предоставляете данные. Передайте используемый формат буфера обмена, дескриптор памяти, содержащей данные, и, при необходимости, структуру FORMATETC , описывающую данные.

    -или-

  • Если вы хотите работать непосредственно со структурами STGMEDIUM, необходимо вызвать COleDataSource::CacheData, а не COleDataSource::CacheGlobalData в приведенном выше варианте.

Предоставление данных по запросу (отложенное отображение)

Это расширенный раздел.

  • Вызывайте COleDataSource::DelayRenderData многократно для каждого формата буфера обмена, в котором вы предоставляете данные. Передайте используемый формат буфера обмена и, при необходимости, структуру FORMATETC, описывающую данные. При запросе данных фреймворк вызовет COleDataSource::OnRenderData, который необходимо переопределить.

    -или-

  • Если вы используете CFile объект для предоставления данных, вызовите COleDataSource::DelayRenderFileData вместо COleDataSource::DelayRenderData предыдущего параметра. При запросе данных фреймворк вызовет COleDataSource::OnRenderFileData, который необходимо переопределить.

Определение форматов, доступных в объекте данных

Прежде чем приложение разрешает пользователю вставлять в него данные, необходимо знать, есть ли форматы в буфере обмена, которые он может обрабатывать. Для этого приложение должно выполнить следующее:

  1. COleDataObject Создайте объект и структуру FORMATETC.

  2. Вызовите функцию-член объекта AttachClipboard, чтобы ассоциировать объект данных с данными в буфере обмена.

  3. Выполните одно из следующих действий:

    • Вызовите функцию-член объекта IsDataAvailable данных, если требуется только один или два формата. Это позволит сэкономить время в тех случаях, когда данные в буфере обмена поддерживают значительно больше форматов, чем ваше приложение.

      -или-

    • Вызовите метод объекта данных BeginEnumFormats, чтобы начать перечисление форматов, доступных в буфере обмена. Затем вызовите GetNextFormat, пока буфер обмена не возвращает формат, поддерживаемый приложением, или пока не останется других форматов.

Если вы используете ON_UPDATE_COMMAND_UI, теперь можно включить пункты "Вставить" и, возможно, "Специальная вставка" в меню "Изменить". Для этого вызовите либо CMenu::EnableMenuItem, либо CCmdUI::Enable. Дополнительные сведения о том, какие приложения-контейнеры должны делать с элементами меню и когда, см. в разделе Меню и ресурсы: дополнения контейнеров.

Получение данных из объекта данных

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

Средний Функция для вызова
Глобальная память (HGLOBAL) COleDataObject::GetGlobalData
Файл (CFile) COleDataObject::GetFileData
Структура STGMEDIUM (IStorage) COleDataObject::GetData

Обычно тип носителя будет указываться вместе с форматом буфера обмена. Например, объект CF_EMBEDDEDSTRUCT всегда находится в IStorage среде, требующей структуры STGMEDIUM . Поэтому вы будете использовать GetData , так как это единственная из этих функций, которые могут принимать структуру STGMEDIUM .

В случаях, когда формат буфера обмена находится в среде IStream или HGLOBAL, фреймворк может предоставить указатель CFile, ссылающийся на данные. Затем приложение может использовать чтение файла для получения данных так же, как и импорт данных из файла. По сути, это клиентский интерфейс для OnRenderData и OnRenderFileData подпрограмм в источнике данных.

Теперь пользователь может вставить данные в документ так же, как и для других данных в том же формате.

Что вы хотите узнать больше о

См. также

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