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:
Uživatel vybere některá data.
Uživatel zvolí možnost Kopírovat (nebo Vyjmout) z nabídky Upravit nebo zahájí operaci přetažení.
V závislosti na návrhu programu aplikace vytvoří buď
COleDataSource
objekt, nebo objekt z třídy odvozené zCOleDataSource
.Vybraná data se vloží do zdroje dat voláním jedné z funkcí v dané skupině
COleDataSource::CacheData
.COleDataSource::DelayRenderData
Aplikace volá
SetClipboard
členovou funkci (neboDoDragDrop
členovou funkci, pokud se jedná o operaci přetažení) patřící k objektu vytvořenému v kroku 3.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