Sdílet prostřednictvím


Datové objekty a zdroje dat: Vytváření a likvidace

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 je, když se data ve vaší aplikaci přetáhněte přetažením. Druhá situace je, když je možnost Vložit nebo Vložit jinak zvolena z nabídky Upravit.

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 architekturou v rámci operace přetažení a bude také 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í speciální operaci vložení nebo vložení, měli byste vytvořit COleDataObject objekt a volat její č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 nedojde ke zničení datového objektu, nebude možné, aby žádná aplikace úspěšně zkopírovala 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 kopí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í v dané skupiněCOleDataSource::CacheData.COleDataSource::DelayRenderData

  5. Aplikace volá SetClipboard členovou funkci (nebo DoDragDrop členovou funkci, pokud se jedná o operaci přetažení) patřící k objektu vytvořenému v kroku 3.

  6. Pokud se jedná o operaci vyjmutí 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 zdroj pro každou aplikaci CView-odvozenou třídu pro všechny kromě GetClipboardData funkcí.OnGetClipboardData Tyto dvě funkce jsou v COleClientItem implementacích třídy nebo COleServerItem-odvozené třídy. Tyto ukázkové programy poskytují dobrý příklad implementace těchto konceptů.

Jedna další situace, ve které můžete chtít vytvořit COleDataSource objekt, dojde, pokud upravujete výchozí chování operace přetažení myší. Další informace naleznete v části Ole Drag and drop: Customize drag and drop article.

Zničení zdrojů dat

Zdroje dat musí být zničeny aplikací, která za ně aktuálně zodpovídá. V situacích, kdy zdroj dat předáte OLE, například volání COleDataSource::D oDragDrop, musíte volat pDataSrc->InternalRelease. Pří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ématu Přetažení, Schránka a Manipulace s datovými objekty a zdroji dat.

Viz také

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