Sdílet prostřednictvím


Datové objekty a zdroje dat: Vytvoření a zničení

Jak je vysvětleno v článku Datové objekty a zdroje dat (OLE), datové objekty a zdroje dat představují obě strany přenosu dat. Tento článek vysvětluje, kdy vytvořit a zničit tyto objekty a zdroje pro správné přenosy dat, včetně:

Vytváření datových objektů

Datové objekty používají cílová aplikace – klient nebo server. Datový objekt v cílové aplikaci je jedním koncem připojení mezi zdrojovou a cílovou aplikací. Datový objekt v cílové aplikaci slouží k přístupu k datům ve zdroji dat a interakci s nimi.

Existují dvě běžné situace, kdy je potřeba datový objekt. První situace nastane, když se data přetahují do vaší aplikace. Druhá situace nastává, když je z nabídky Upravit zvolena možnost Vložit nebo Vložit jinak.

V situaci přetažení nemusíte vytvářet datový objekt. Do funkce OnDrop se předá ukazatel na existující datový objekt. Tento datový objekt je vytvořen rámcem v rámci operace přetažení a upuštění a také jím bude zničen. To není vždy případ, kdy vkládání provádí jiná metoda. Další informace naleznete v tématu Zničení datových objektů.

Pokud aplikace provádí operaci vložení nebo speciální vložení, měli byste vytvořit COleDataObject objekt a volat jeho členovou AttachClipboard funkci. Tím se datový objekt přidruží k datům ve schránce. Tento datový objekt pak můžete použít ve funkci vložení.

Zničení datových objektů

Pokud postupujete podle schématu popsaného v části Vytváření datových objektů, zničení datových objektů je triviální aspekt přenosu dat. Datový objekt vytvořený ve funkci vložení bude při vrácení funkce vložení zničen knihovnou MFC.

Pokud postupujete podle jiné metody zpracování operací vložení, ujistěte se, že je datový objekt po dokončení operace vložení zničen. Dokud nebude datový objekt zničen, žádná aplikace nebude moci úspěšně zkopírovat data do schránky.

Vytváření zdrojů dat

Zdroje dat se používají zdrojem přenosu dat, což může být klient nebo serverová strana přenosu dat. Zdrojem dat ve zdrojové aplikaci je jeden konec připojení mezi zdrojovou aplikací a cílovou aplikací. Datový objekt v cílové aplikaci slouží k interakci s daty ve zdroji dat.

Zdroje dat se vytvoří, když aplikace potřebuje zkopírovat data do Schránky. Typický scénář se spustí takto:

  1. Uživatel vybere některá data.

  2. Uživatel zvolí možnost Kopírovat (nebo Vyjmout) z nabídky Upravit nebo zahájí operaci přetažení.

  3. V závislosti na návrhu programu aplikace vytvoří buď COleDataSource objekt, nebo objekt z třídy odvozené z COleDataSource.

  4. Vybraná data se vloží do zdroje dat voláním jedné z funkcí ve skupinách COleDataSource::CacheData nebo COleDataSource::DelayRenderData.

  5. Aplikace volá členskou funkci SetClipboard (nebo členskou funkci DoDragDrop, pokud jde o operaci přetažení a upuštění), patřící k objektu vytvořenému ve třetím kroku.

  6. Pokud se jedná o operaci Vyjmout nebo DoDragDrop vrátí DROPEFFECT_MOVE, data vybraná v kroku 1 se z dokumentu odstraní.

Tento scénář je implementován pomocí ukázek OLE MFC OCLIENT a HIERSVR. Podívejte se na zdrojovou třídu odvozenou z CView pro každou aplikaci kromě funkcí GetClipboardData a OnGetClipboardData. Tyto dvě funkce se nacházejí buď v implementacích třídy COleClientItem nebo ve třídě odvozené od COleServerItem. Tyto ukázkové programy poskytují dobrý příklad implementace těchto konceptů.

Další situace, ve které můžete chtít vytvořit COleDataSource objekt, nastane, pokud upravujete výchozí chování operace přetažení. Další informace naleznete v článku OLE Drag and drop: Customize drag and drop.

Zničení zdrojů dat

Zdroje dat musí být zničeny aplikací, která za ně aktuálně zodpovídá. V situacích, kdy předáte zdroj dat OLE, například při volání COleDataSource::DoDragDrop, je třeba zavolat pDataSrc->InternalRelease. Například:

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();
   }
}

Pokud jste nepředali zdroj dat OLE, pak jste zodpovědní za zničení, stejně jako u jakéhokoli typického objektu C++.

Další informace naleznete v tématech Přetažení, Schránka a Manipulace s datovými objekty a zdroji dat.

Viz také

Datové objekty a zdroje dat (OLE)
třída COleDataObject
Třída COleDataSource