Tárgyak ole, klub programozók

Konténerek és szerverek

A mechanizmus OLE, két alkalmazás van - tartalmazó alkalmazásokat tárgy, és az alkalmazások, amelyek felhívják szerkesztésére az objektumot. Alkalmazás tartalmazó nevű objektum egy konténer. Az alkalmazás szerkesztéséhez használt tárgy, úgynevezett szerver. Hangsúlyozzuk, hogy ugyanaz a szoftver egyszerre, és a tárolótér és a kiszolgáló rész.







Vezérlők és az automatizálás szerverek

Automation Server saját módszereit és tulajdonságait más alkalmazásokat. Olyan alkalmazás, amely képes kezelni a szerver, az úgynevezett automatizálási vezérlők. Megjegyezzük ezzel kapcsolatban, hogy az ActiveX vezérlők nem más, mint egy automatizálási szerver.

1. Hozza létre a MFC-nevű alkalmazás ole.
2. Alkalmazás típusa lapcsoport zászlók egységes dokumentum (SDI) és használat MFC statikus könyvtár.
3. vegyület irattámasz lapon állítsa be a zászló Container
4. A többi beállítás lehet hagyni a lelkiismerete.
5. generált Classes lapon megtekintheti az osztályok jegyzékét, ahonnan alkalmazás osztály lesz kialakítva. Ezek az osztályok ColeApp - class alkalmazás ColeView - véli osztály, ColeDoc - class dokumentum CmainFrame - class ablakkeret, ColeCntrItem - class OLE-objektumot.

Fordítsuk a projekt és futtatni. A Szerkesztés menü, akkor csak az aktív elemet Insert New Object. Ez teszi lehetővé számunkra, hogy a mi általunk választott dokumentum objektumot. Válassza ezt az opciót. A megjelenő ablakban kiválaszthatja, hogy milyen típusú objektum kerül a mi tartályban.

A lista elem egy Microsoft Word dokumentumot, és kattintson a Tovább gombra, hogy OK. Az ablakban a mi kérelem tárgya lesz - Word dokumentumot. Ügyeljen arra, hogy a Szerkesztés menü. Ez az Ige menü. Az egyetlen kivétel, válasszuk a Fájl, amely összhangban van az alkalmazás. Ezen túlmenően, és MS Word eszköztár jelenik meg az ablakban.
Az egér használata, módosítsa a méretek létesítmény és naberom szöveget.

Kattintson a Tovább gombra az Esc gombot - a tárgy eltűnik a mi ablakot, de a szöveget gépelt benne. Figyeljünk arra, hogy a létesítmény nem aktív vagy de aktiválható kattintással, mint amilyennek lennie kellene a szokásos OLE. E hátrány, és lesz az egyik pontot a mi további megfontolásra.
Ahhoz, hogy újra aktiválja a projekt (korábban deaktiválja az ESC gomb megnyomásával), meg kell fellebbezni a ponton a szerkesztés / Object / Edit menüben.

A vizsgálati terv modulok eljutottunk a furcsa, első pillantásra, a felfedezés. A projekt két funkciója van.


void ColeDoc :: Serialize (CArchive ar)
<
if (ar.IsStoring ())
<
// kiegészítő kód menteni egy dokumentumot, az archívumban
>
más
<
// további helyreállítási kódot az archívumban
>

// A funkciót szerializálni bázis osztály
// menteni az objektum, amely jelenleg a tartályban.
COleDocument :: Serialize (ar);
>


Különösen azt kell figyelni, hogy az utolsó hívás:


Ez egy nagyon fontos kihívás. A kis tanulmány, amely azt javasoljuk, hogy tartsa meg, kedves olvasó, azt mutatja, hogy ezt a funkciót nevezik szerializációja CntrItem.cpp modult. Itt a funkció:








érvényteleníti ColeCntrItem :: Serialize (CArchive ar)
<
ASSERT_VALID (e);

// menteni (helyreállítása) az objektum található
// Mivel ezen a ponton a tartályban
COleClientItem :: Serialize (ar);

if (ar.IsStoring ())
<
// tárolhat egyéb adatok osztályú támogatás
// kifogást a tartály
>
más
<
// visszaállítani az adatokat a másik osztály támogatása
// objektumot a tartályban
>
>


Ösztönösen, az egész pont ezt a funkciót. Vesszük az eredeti, hogy az adatok biztonsági mentést végez-e. Következésképpen a helyzet adat-helyreállítást. Mivel az adatok hasznosítása és ugyanazt a funkciót, akkor nyilvánvaló, hogy az adat helyreállítás is helyes végrehajtását. Így, az oka a megjelenését az objektum nem található osztályban ColeClientItem módszerek. Értelmében a legmegfelelőbb módszer DoVerb módszer.


virtuális BOOL DoVerb
(
HOSSZÚ nVerb,
CView * pView,
LPMSG lpMsg = NULL
)


Ezt a módszert alkalmazzák a termék a lépések által meghatározott az első paraméter. A második és a harmadik paraméter általában feltételezzük, hogy NULL, mégis, akkor tegye vissza a mutatót az objektum renderelés. Action [benyújtja szerkesztési objektum] határozza meg az első paraméter a -1 (vagy 0). Jelentése -2 meghatározza szerkesztési objektumot egy külön ablakban. Ennek eredményeként a sorba rendezést, akkor a gépet a tartályba, és hogy szerkesztésére a tárgy fog kinézni. Ehelyett DoVerb funkció, akkor a módszer

érvényteleníti ColeCntrItem :: Serialize (CArchive ar)
<
ASSERT_VALID (e);
COleClientItem :: Serialize (ar);
if (ar.IsStoring ())
<
>
más
<
this-> DoVerb (0, this-> GetActiveView ());
GetActiveView () -> m_pSelection = e;
GetDocument () -> UpdateAllViews (NULL);
>
>


Megmutattuk hozzávetőleges érvelés, amely gyakran kell követni munka közben, mint egy programozó, és nincs kéznél a teljes dokumentációt.
Így tudjuk menteni és visszaállítani a konténer objektum. Most tovább javítja a projekt.
Tűztük a következő probléma: a tárgy mozog, és változtatja a helyét. Új tag osztály ColeCntrItem m_rect típusú CRect. Ez a változó információt tárol a vizuális objektum helyének. Most vigyázni, hogy ez a változó maradt serialization. Ehhez ismét átírja a funkció serialize


érvényteleníti ColeCntrItem :: Serialize (CArchive ar)
<
ASSERT_VALID (e);
COleClientItem :: Serialize (ar);
if (ar.IsStoring ())
<
ar<>
más
<
ar >> m_rect;
this-> DoVerb (0, this-> GetActiveView ());
GetActiveView () -> m_pSelection = e;
GetDocument () -> UpdateAllViews (NULL);
>
>


Átírása az osztály kivitelező ColeCntrItem így inicializálni a kezdeti érték az objektum pozícióját.


ColeCntrItem :: ColeCntrItem (ColeDoc * pContainer)
: COleClientItem (pContainer)
<
m_rect = CRect (20,20,300,300);
>


Találunk itt oleView.cpp modul funkciója


érvényteleníti ColeView :: OnDraw (CDC * PDC)


Ebben találjuk a hívás

és cserélje ki egy

Tag m_pSelection osztály ColeView kommunikál a képviselet és a tárgy van a tartályban. Térjünk a funkció

érvényteleníti ColeCntrItem :: OnGetItemPosition (CRect rPosition)

Ezt a funkciót akkor visszatér egy téglalap objektumot. Megváltoztatni ezt a funkciót, hogy tartalmaz egyetlen sort.

érvényteleníti ColeCntrItem :: OnGetItemPosition (CRect rPosition)
<
rPosition = m_rect;
>

A merev rögzítés a tárgyak nem jó. Ahhoz, hogy a rendszer sokkal rugalmasabb, térjünk a funkció ColeCntrItem :: OnChangeItemPosition. Ezt a funkciót nevezik minden alkalommal változik a helyét és méretét az objektum a tartályban. Itt a szöveg a funkciót.


BOOL ColeCntrItem :: OnChangeItemPosition (const CRect rectPos)
<
ASSERT_VALID (e);

if (! COleClientItem :: OnChangeItemPosition (rectPos))
return false;

A paraméter ennek a funkciónak éppen ez a helyzet az új helyét az objektum. Add hozzá a következő funkciókat funkciót.

// Emlékezz az új méretet
m_rect = rectPos;
// állítsa a kép frissítése zászló
GetDocument () -> SetModifiedFlag ();
// frissíti a kijelző
GetDocument () -> UpdateAllViews (NULL);

Ennek eredményeként, jöttünk, hogy egy alkalmazás, amely lehetővé teszi, hogy hozzanak egy konténer objektum, szerkesztheti, módosíthatja annak méretét és helyzetét, hogy megőrizzék a tárgy és annak állapotát a fájlt, és visszaállíthatja onnan.