Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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:
Användaren väljer vissa data.
Användaren väljer Kopiera (eller Klipp ut) från menyn Redigera eller påbörjar en dra och släpp-åtgärd.
Beroende på programmets design skapar programmet antingen ett
COleDataSourceobjekt eller ett objekt från en klass som härletts frånCOleDataSource.De valda data infogas i datakällan genom att anropa någon av funktionerna i
COleDataSource::CacheDataellerCOleDataSource::DelayRenderData-grupperna.Programmet anropar
SetClipboardmedlemsfunktionen (ellerDoDragDropmedlemsfunktionen om detta är en dra och släpp-åtgärd) som tillhör objektet som skapades i steg 3.Om det här är en Klipp ut-åtgärd eller
DoDragDropreturnerar 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