..:: Kurz MFC 3. dφl - Dokument ::..

 V p°edchozφm dφle jsme si °ekli, ₧e data by jsme m∞li uklßdat do t°φdy dokumentu, proto₧e se starß o jejich inicializaci, mazßnφ, uklßdßnφ a naΦφtßnφ. V tomto dφle si °ekneme jak. 

VÜechny tyto funkce jsou vlastn∞ provßd∞ny t°emi virtußlnφmi funkcemi, kterΘ se volajφ, kdy₧ je t°eba vytvo°it nov² dokument, nebo jeho data ulo₧it, Φi smazat. 

Funkce OnNewDocument() je volßna v₧dy, kdy₧ se vytvß°φ nov² dokument. M∞li by jste do nφ dßvat veÜkerΘ inicializace sv²ch dat. (To neplatφ pro pomocnΘ prom∞nnΘ.) V tΘto ukßzkovΘ aplikaci (z minulΘho dφlu) je vφcemΘn∞ zbyteΦnß funkce, tak₧e ji jen vypφÜi jak nßm ji vygeneroval AppWizard.

BOOL CMfcDoc::OnNewDocument()

{

Nejd°φve se zavolß funkce p°edka, pro p°φpad, ₧e by n∞co d∙le₧itΘho d∞lala. To by jste m∞li d∞lat skoro u vÜech virtußlnφch funkcφ nebo funkcφ reagujφcφch na zprßvy, pokud chcete, aby vßm aplikace sprßvn∞ fungovala. Samoz°ejm∞ n∞kdy je nutnΘ toto volßnφ odmazat, proto₧e p°edek d∞lß n∞co co nechceme, ale to budete d∞lat a₧ budete MFC rozum∞t trochu vφce ne₧ te∩.

if (!CDocument::OnNewDocument())

return FALSE;

 

// TODO: add reinitialization code here

// (SDI documents will reuse this document)

Pokud byla ·sp∞Ün∞ provedena veÜkerß inicializace vrßtφme TRUE. Pokud se n∞co nepovedlo, vra¥e FALSE. To zp∙sobφ, ₧e aplikace zobrazφ dialog s upozorn∞nφm, ₧e se nezda°ilo vytvo°it dokument.

return TRUE;

}

Druhou funkcφ je DeleteContents(). Tuto funkci vßm AppWizard nevygeneruje, tak₧e ji musφte p°idat pomocφ ClassWizardu. (Postup p°idßvßnφ virtußlnφch funkcφ byl ukßzßn v minulΘm dφle.) Funkce DeleteContents se starß o smazßnφ dat dokumentu p°ed vytvo°enφm novΘho dokumentu. Tj. kdy₧ aplikaci °eknete, ₧e chcete vytvo°it nov² dokument nejd°φve se volß funkce DeleteContents pro smazßnφ star²ch dat dokumentu a potΘ funkce OnNewDocument pro nastavenφ dat na v²chozφ hodnoty. V naÜem p°φkladu ve funkci DeleteContents vyprazd≥uje pole Φar pomocφ funkce RemoveAll Üablony t°φdy CArray.

void CMfcDoc::DeleteContents()

{

// TODO: Add your specialized code here and/or call the base class

Zavolßme funkci pro smazßnφ obsahu t°φdy dynamickΘho pole s Φßrami.

cary.RemoveAll();

A op∞t volßme funkci p°edka.

CDocument::DeleteContents();

}

T°etφ a poslednφ funkce Serialize se volß, kdy₧ chcete svoje data ulo₧it nebo naΦφst. Jako sv∙j parametr vßm p°edß referenci na objekt t°φdy CArchive. Ten slou₧φ pro vlastnφ uklßdßnφ a naΦφtßnφ. M∙₧ete si jej p°edstavit jako nßstroj pro prßci s otev°en²m souborem. MFC samoz°ejm∞ nabφzφ t°φdy pro p°φmou prßci se soubory, ale k t∞m se dostaneme a₧ n∞kdy pozd∞ji. Pro zaΦßtek je prßce s t°φdou CArchive ·pln∞ dostaΦujφcφ a umφ ulo₧it vÜechny zßkladnφ typy prom∞nn²ch a libovolnou MFC t°φdu, kterß je potomkem CObject, jako je nap°φklad CPoint, CRect a dalÜφ. Samoz°ejm∞ pokud si ud∞lßte svΘho potomka t°φdy CObject a p°idßte mu n∞jakΘ prom∞nnΘ, tak tyto prom∞nnΘ ulo₧it neumφ. Aby to um∞la, musφte u tΘto pod∞d∞nΘ t°φdy upravit jejφ virtußlnφ funkci Serialize stejn²m zp∙sobem jako by to byla funkce Serialize dokumentu. 

void CMfcDoc::Serialize(CArchive& ar)

{

Nßsledujφcφ t°i prom∞nnΘ jsou pomocnΘ.

int pocet,i;

LINE l;

Zda uklßdßme nebo naΦφtßme zjistφme volßnφm funkce CArchive::IsStoring(), kterß vrßtφ TRUE, kdy₧ uklßdßme a FALSE, kdy₧ naΦφtßme. Existuje inverznφ funkce CArchive::IsLoading().

if (ar.IsStoring())

{

// TODO: add storing code here

Zjistφme poΦet Φar v dokumentu a ulo₧φme jej do prom∞nnΘ pocet.

pocet = cary.GetSize();

Ulo₧φme obsah prom∞nnΘ pocet do souboru. Provedeme to pomocφ p°etφ₧enΘho operßtoru <<. VÜimn∞te si sm∞ru Üipek. Kdy₧ uklßdßme musφ ukazovat sm∞rem doleva (do objektu CArchive) a kdy₧ naΦφtßme tak opaΦn²m sm∞rem.

ar << pocet;

Te∩ nßsleduje uklßdßnφ jednotliv²ch Φar. V cyklu v₧dy nejd°φve ulo₧φme prvnφ bod Φßry a potom druh². Ka₧d² bod je reprezentovßn dvojφcφ sou°adnic X a Y, ale proto₧e je reprezentovßn t°φdou CPoint se kterou umφ CArchive pracovat, tak se o to nemusφme starat.

for (i=0; i<pocet; i++)

{

ar << cary[i].first;

ar << cary[i].second;

}

}

else

{

Tady je k≤d pro naΦφtßnφ. NaΦφtat musφme v p°esn∞ stejnΘm po°adφ jako jsme uklßdali. Pokud bychom po°adφ nedodr₧eli, dostaneme v tom lepÜφm p°φpad∞ nesmyslnß data, ale daleko pravd∞podobn∞ji nßm spadne aplikace. Stejn² v²sledek bude mφt pokus o Φtenφ vφce dat ne₧ jsme ulo₧ili. Tak₧e pokud n∞kdy budete modifikovat uklßdacφ a naΦφtacφ funkci potΘ co jste s nφ u₧ n∞jakß data ulo₧ili a nechcete o n∞ p°ijφt, tak nejd°φve upravte uklßdacφ Φßst, aplikaci spus¥e a naΦt∞te svß data a ulo₧te je v novΘm formßtu. Potom bez nebezpeΦφ m∙₧ete upravit i naΦφtacφ Φßst. Jin²m mo₧n²m °eÜenφm je na zaΦßtek v₧dy ulo₧it verzi souboru a podle tΘ pak data naΦφtat.

// TODO: add loading code here

Nejd°φve naΦteme poΦet Φar. (VÜimn∞te si sm∞ru Üipek. U uklßdßnφ to bylo << a u naΦφtßnφ je to >>.)

ar >> pocet;

for (i=0; i<pocet; i++)

{

Do pomocnΘ prom∞nnΘ naΦteme nejd°φve prvnφ a potΘ druh² bod Φßry.

ar >> l.first;

ar >> l.second;

P°idßme Φßru do pole. Pro Φßru m∙₧eme pou₧φt jen jednu pomocnou prom∞nnou, proto₧e CArray si vytvß°φ kopii dat.

cary.Add(l);

}

}

}

A to je pro dneÜek vÜe. P°φÜt∞ se podφvßme na menu, panel nßstroj∙ a stavov² °ßdek.

Zdrojov² k≤d si m∙₧ete stßhnout zde.

<<2. dφl    4.dφl>>