Dela via


Dataobjekt och datakällor: Skapa och förstöra

Som beskrivs i artikeln Dataobjekt och datakällor (OLE) representerar dataobjekt och datakällor båda sidor av en dataöverföring. Den här artikeln förklarar när du ska skapa och förstöra dessa objekt och källor för att utföra dina dataöverföringar korrekt, inklusive:

Skapa dataobjekt

Dataobjekt används av målprogrammet – antingen klienten eller servern. Ett dataobjekt i målprogrammet är ena änden av en anslutning mellan källprogrammet och målprogrammet. Ett dataobjekt i målprogrammet används för att komma åt och interagera med data i datakällan.

Det finns två vanliga situationer där ett dataobjekt behövs. Den första situationen är när data tas bort i ditt program med dra och släpp. Den andra situationen är när Klistra in eller Klistra in special väljs från menyn Redigera.

I en dra-och-släpp-situation behöver du inte skapa ett dataobjekt. En pekare till ett befintligt dataobjekt skickas till din OnDrop funktion. Det här dataobjektet skapas av ramverket som en del av dra och släpp-åtgärden och kommer också att förstöras av det. Detta är inte alltid fallet när klistra in görs med en annan metod. Mer information finns i Förstöra dataobjekt.

Om programmet utför en specialåtgärd för klistra in eller klistra in bör du skapa ett COleDataObject objekt och anropa dess AttachClipboard medlemsfunktion. Detta associerar dataobjektet med data i Urklipp. Du kan sedan använda det här dataobjektet i inklistringsfunktionen.

Förstöra dataobjekt

Om du följer schemat som beskrivs i Skapa dataobjekt är det en trivial aspekt av dataöverföringar att förstöra dataobjekt. Dataobjektet som skapades i inklistringsfunktionen kommer att förstöras av MFC när inklistringsfunktionen returneras.

Om du följer en annan metod för att hantera inklistringsåtgärder kontrollerar du att dataobjektet har förstörts när inklistringsåtgärden har slutförts. Tills dataobjektet har förstörts är det omöjligt för något program att kopiera data till Urklipp.

Skapa datakällor

Datakällor används av dataöverföringskällan, som kan vara antingen klienten eller serversidan för dataöverföringen. En datakälla i källprogrammet är ena änden av en anslutning mellan källprogrammet och målprogrammet. Ett dataobjekt i målprogrammet används för att interagera med data i datakällan.

Datakällor skapas när ett program behöver kopiera data till Urklipp. Ett typiskt scenario körs så här:

  1. Användaren väljer vissa data.

  2. Användaren väljer Kopiera (eller Klipp ut) från menyn Redigera eller påbörjar en dra och släpp-åtgärd.

  3. Beroende på programmets design skapar programmet antingen ett COleDataSource objekt eller ett objekt från en klass som härletts från COleDataSource.

  4. De valda data infogas i datakällan genom att anropa någon av funktionerna i COleDataSource::CacheData eller COleDataSource::DelayRenderData -grupperna.

  5. Programmet anropar SetClipboard medlemsfunktionen (eller DoDragDrop medlemsfunktionen om detta är en dra och släpp-åtgärd) som tillhör objektet som skapades i steg 3.

  6. Om det här är en Klipp ut-åtgärd eller DoDragDrop returnerar DROPEFFECT_MOVE tas de data som valts i steg 1 bort från dokumentet.

Det här scenariot implementeras av MFC OLE-exemplen OCLIENT och HIERSVR. Titta på källkoden för varje programs härledda klass för alla funktioner utom CView och GetClipboardData. Dessa två funktioner finns i antingen COleClientItem eller COleServerItem-derived-klassimplementeringar. Dessa exempelprogram är ett bra exempel på hur du implementerar dessa begrepp.

En annan situation där du kanske vill skapa ett COleDataSource objekt inträffar om du ändrar standardbeteendet för en dra och släpp-åtgärd. Mer information finns i artikeln Dra och släpp i OLE: Anpassa dra och släpp .

Förstöra datakällor

Datakällor måste förstöras av det program som för närvarande ansvarar för dem. I situationer där du överför datakällan till OLE, som när du anropar COleDataSource::DoDragDrop, måste du anropa pDataSrc->InternalRelease. Till exempel:

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

Om du inte har överlämnat datakällan till OLE ansvarar du för att förstöra den, som med alla vanliga C++-objekt.

Mer information finns i Dra och släpp, Urklipp och Manipulera dataobjekt och datakällor.

Se även

Dataobjekt och datakällor (OLE)
COleDataObject-klass
COleDataSource-klass