Udostępnij za pośrednictwem


Kontrolki ActiveX MFC: serializacja

W tym artykule omówiono sposób serializacji kontrolki ActiveX. Serializacja to proces odczytywania lub zapisywania na trwałym nośniku magazynu, takim jak plik dysku. Biblioteka klasy Microsoft Foundation (MFC) zapewnia wbudowaną obsługę serializacji w klasie CObject. COleControl rozszerza tę obsługę kontrolek ActiveX za pomocą mechanizmu wymiany właściwości.

Ważne

ActiveX to starsza technologia, która nie powinna być używana do tworzenia nowych rozwiązań. Aby uzyskać więcej informacji na temat nowoczesnych technologii zastępujących activex, zobacz Kontrolki ActiveX.

Serializacja kontrolek ActiveX jest implementowana przez zastąpienie COleControl::D oPropExchange. Ta funkcja, wywoływana podczas ładowania i zapisywania obiektu sterującego, przechowuje wszystkie właściwości zaimplementowane za pomocą zmiennej składowej lub zmiennej składowej z powiadomieniem o zmianie.

W poniższych tematach omówiono główne problemy związane z serializacją kontrolki ActiveX:

Implementowanie funkcji DoPropExchange

W przypadku generowania projektu kontrolki ActiveX kilka domyślnych funkcji obsługi jest automatycznie dodawanych do klasy kontrolek, w tym do domyślnej implementacji COleControl::D oPropExchange. W poniższym przykładzie pokazano kod dodany do klas utworzonych za pomocą Kreatora kontrolek ActiveX:

void CMyAxUICtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);

   // TODO: Call PX_ functions for each persistent custom property.
}

Jeśli chcesz ustawić właściwość jako trwałą, zmodyfikuj DoPropExchange ją, dodając wywołanie funkcji wymiany właściwości. W poniższym przykładzie pokazano serializacji niestandardowej właściwości CircleShape, gdzie właściwość CircleShape ma domyślną wartość TRUE:

void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);
PX_Bool(pPX, _T("CircleShape"), m_bCircleShape, TRUE);
}

W poniższej tabeli wymieniono możliwe funkcje wymiany właściwości, których można użyć do serializacji właściwości kontrolki:

Funkcje wymiany właściwości Cel
PX_Blob( ) Serializuje właściwość danych Binary Large Object (BLOB).
PX_Bool( ) Serializuje właściwość logiczną typu.
PX_Color( ) Serializuje właściwość koloru typu.
PX_Currency( ) Serializuje właściwość CY (waluta).
PX_Double( ) Serializuje właściwość typu double .
PX_Font( ) Serializuje właściwość Typ czcionki.
PX_Float( ) Serializuje właściwość typu float .
PX_IUnknown( ) Serializuje właściwość typu LPUNKNOWN.
PX_Long( ) Serializuje właściwość typu long .
PX_Picture( ) Serializuje właściwość Obrazu typu.
PX_Short( ) Serializuje właściwość typu short .
PXstring( ) Serializuje właściwość typu CString .
PX_ULong( ) Serializuje właściwość ULONG typu.
PX_UShort( ) Serializuje właściwość USHORT typu.

Aby uzyskać więcej informacji na temat tych funkcji wymiany właściwości, zobacz Trwałość kontrolek OLE w dokumentacji MFC.

Dostosowywanie domyślnego zachowania programu DoPropExchange

Domyślna implementacja DoPropertyExchange (jak pokazano w poprzednim temacie) wykonuje wywołanie klasy COleControlbazowej . Spowoduje to serializację zestawu właściwości automatycznie obsługiwanych przez COleControlprogram , który używa więcej miejsca do magazynowania niż serializowanie tylko właściwości niestandardowych kontrolki. Usunięcie tego wywołania pozwala obiektowi serializować tylko te właściwości, które należy wziąć pod uwagę jako ważne. Każda właściwość stockowa stwierdza, że zaimplementowana kontrolka nie będzie serializowana podczas zapisywania ani ładowania obiektu kontrolki, chyba że jawnie dodasz PX_ wywołania dla nich.

Implementowanie obsługi wersji

Obsługa wersji umożliwia poprawionej kontrolce ActiveX dodawanie nowych trwałych właściwości i nadal może wykrywać i ładować stan trwały utworzony przez wcześniejszą wersję kontrolki. Aby udostępnić wersję kontrolki jako część jego danych trwałych, wywołaj metodę COleControl::ExchangeVersion w funkcji kontrolki DoPropExchange . To wywołanie jest automatycznie wstawiane, jeśli kontrolka ActiveX została utworzona przy użyciu Kreatora kontrolek ActiveX. Można go usunąć, jeśli obsługa wersji nie jest potrzebna. Jednak koszt w rozmiarze kontroli jest bardzo mały (4 bajty) dla dodatkowej elastyczności zapewnianą przez obsługę wersji.

Jeśli kontrolka nie została utworzona za pomocą Kreatora kontrolek ActiveX, dodaj wywołanie COleControl::ExchangeVersion metody , wstaw następujący wiersz na początku DoPropExchange funkcji (przed wywołaniem metody COleControl::DoPropExchange):

void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);
}

Jako numer wersji można użyć dowolnego identyfikatora DWORD . Projekty generowane przez Kreatora kontrolek ActiveX używają _wVerMinor funkcji i _wVerMajor jako domyślne. Są to stałe globalne zdefiniowane w pliku implementacji klasy kontrolki ActiveX projektu. W pozostałej części DoPropExchange funkcji możesz wywołać metodę CPropExchange::GetVersion w dowolnym momencie, aby pobrać zapisywaną lub pobieraną wersję.

W poniższym przykładzie wersja 1 tej przykładowej kontrolki ma tylko właściwość "ReleaseDate". Wersja 2 dodaje właściwość "OriginalDate". Jeśli kontrolka zostanie poinstruowana o załadowaniu stanu trwałego ze starej wersji, inicjuje zmienną składową nowej właściwości na wartość domyślną.

void CMyAxSerCtrl::DoPropExchange(CPropExchange* pPX)
{
   ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
   COleControl::DoPropExchange(pPX);

   PX_Long(pPX, _T("ReleaseDate"), m_ReleaseDate);
   if (pPX->GetVersion() >= MAKELONG(0, 2))
   {
      PX_Long(pPX, _T("OriginalDate"), m_OriginalDate);
   }
   else
   {
      if (pPX->IsLoading())
         m_OriginalDate = 0;
   }
}

Domyślnie kontrolka "konwertuje" stare dane na najnowszy format. Jeśli na przykład wersja 2 kontrolki ładuje dane zapisane przez wersję 1, zapisze format wersji 2 po ponownym zapisaniu. Jeśli chcesz, aby kontrolka zapisywała dane w formacie ostatnim odczytu, przekaż wartość FALSE jako trzeci parametr podczas wywoływania metody ExchangeVersion. Ten trzeci parametr jest opcjonalny i domyślnie ma wartość TRUE .

Zobacz też

Kontrolki ActiveX MFC