Sunteți pe pagina 1din 6

9.

Arhitectura document/view

ncepnd cu MFC 2.0 (MFC Microsoft Foundation Calsses, colecie de


clase predefinite, disponibile n Visual C++) s-a introdus acest tip de arhitectur
a aplicaiilor Windows. ntr-o aplicaie de tip document/view, datele aplicaiei
sunt reprezentate printr-un obiect document, iar vizualizrile acestor date sunt
reprezentate printr-unul sau mai multe obiecte view. Obiectele document i
view lucreaz mpreun pentru a procesa intrrile utilizatorului i pentru a afia
reprezentrile textuale sau grafice ale datelor rezultate. Clasele de baza pentru
acest tip de arhitectur sunt CDocument i CView. MFC suport doua tipuri de
aplicaii document/view: I) SDI (Simple Document Interface) n care se poate
deschide doar un singur document la un moment dat ; II) MDI (Multiple
Document Interface) care permite utilizatorului sa aib deschise la un moment
dat doua sau mai multe documente.
Arhitectura document/afiare permite separarea funciilor pentru
salvarea/restaurarea datelor de funciile pentru vizualizarea acestora. Clasa
CDocument a aplicaiei implementeaz funciile corespunztoare serializri
datelor n/i dintr-un fiier de pe hard-disc. Clasa CView permite afiarea datelor
i editarea acestora.
Serializarea reprezint procesul de transformare a unei structuri de date
ntr-un flux liniar de bii, iar procesul invers, de recuperare a structurii de date
dintr-un flux de bii poart numele de deserializare. Serializarea este folosit
pentru: I) stocarea unei structuri de date ntr-o memorie persistent (stocarea
sub forma de fiier pe hard-disc); II) transferul unei structuri de date (prin
conexiunile unei reele).
n general, o clas care suport serializarea este derivat din clasa CObject
a bibliotecii de clase MFC. La nivelul clasei COject este definit o funcie
membru virtual numit Serialize() avnd urmtoarea signatur:

virtual void Serialize(CArchive& ar);

n MFC scrierea i citirea de date ntr-un i dintr-un fiier se realizeaz


prin intermediul unui obiect care poart numele de arhiv i care este o instan
a clasei CArchive. Fiecare funcie Serialize() implementat ntr-o clas are ca i
parametru o referin ctre o instan a unei astfel de arhive. Fiecare arhiv
conine o referin ctre un fiier i, pe msur ce obiectele sunt incluse n ea,
va avea grij s ataeze fiierului irul de bii corespunztor. ntr-o aplicaie
construit pe baza arhitecturii document-view, clasa document va conine
funcia Serialize() care va fi apelat ori de cte ori este necesar salvarea sau
ncrcarea ntr-un fiier (de exemplu, ca rspuns la comenzile `Open' sau `Save'
din meniul `File'). Implementarea corect a acestei funcii pentru a realiza
stocarea i recuperarea tuturor obiectelor coninute n document depinde strict
de programator.
Pentru a putea folosi avantajele arhitecturii document/view, trebuie
efectuai urmtorii pai:
1. Utilizarea AppWizard-ului pentru crearea unui schelet de aplicaie SDI;
2. Declararea obiectelor necesare pentru stocarea datelor n cadrul clasei
CDocument;
3. Completarea funciei OnNewDocument() a clasei CDocument pentru
iniializarea unui nou document;
4. Suprascrierea funciei DeleteContents() din clasa CDocument care permite
tergerea datelor corespunztoare documentului anterior;
5. Completarea funciei Serialize() a clasei CDocument pentru a salva i ncrca
datele documentului;
6. Completarea funciei OnDraw() a clasei CView pentru a afiarea coninutului
documentului curent;
7. Clasei CView i se adaug codul necesar pentru a permite utilizatorului s
editeze datele documentului curent.

Aplicaia urmtoare folosete arhitectura document/view pentru


salvarea/ncrcarea i editare unui ir de caractere n/dintr-un fiier de pe hard-
disc.

Declararea obiectelor n cadrul clasei CDocument


Datele aplicaiei P3 sunt un ir de caractere, iar pentru prelucrarea acestora se
utilizeaz clasa CString din MFC. Se va aduga o dat membru cu numele
stringinout n cadrul clasei document CP3Doc. Modificatorul de acces folosit
pentru acest membru este public.

Completarea funciei OnNewDocument()


Cnd se creeaz un nou document, se apeleaz funcia OnNewDocument() a
clasei document, care permite aplicaiei posibilitatea de a iniializa noul
document. n cazul aplicaiei dezvoltate OnNewDocument() va iniializa irul
de caractere cu denumirea "new string".

Funcia OnNewDocument complet este:

BOOL CP3Doc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;

// TODO: add reinitialization code here


// (SDI documents will reuse this document)
stringinout="new string";
UpdateAllViews(NULL);
return TRUE;
}

Apelul funciei UpdateAllViews() permite actualizarea imaginii afiate.

Completarea funciei Serialize


Funcia Serialize() a clasei CDocument este locul n care sunt ncrcate datele
documentului sau care permite salvarea acestor date. Parametrul pe care l
primete funcia este un obiect CArchive, care poate serializa mai multe tipuri
de date, inclusiv clase de genul CString. Pentru salvarea datelor folosind
obiectul CArchive ataat fiierului se utilizeaz operatorul <<. Pentru a ncrca
date din arhiv, se folosete operatorul >>. Ambii operatori sunt suprancrcai
n clasa CArchive astfel nct se pot salva i ncrca multe tipuri de date fr
nici o problem.
n cadrul funciei Serialize(), apelul funciei UpdateAllViews() realizat
dup ncrcarea documentului, permite actualizarea imaginii afiate.
void CP3Doc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: add storing code here
ar<<stringinout;
}
else
{
// TODO: add loading code here
ar>>stringinout;
UpdateAllViews(NULL);
}
}

Completarea funciei OnDraw()


Funcia OnDraw() din clasa CView are rolul de a afia(desena) coninutul
documentului curent n cadrul ferestrei aplicaiei. Modul de afiare depinde de
tipul datelor i de dorina programatorului. n cazul aplicaiei prezentate,
imaginea afiat este coninutul irului de caractere stringinout.
void CP3View::OnDraw(CDC* pDC)
{
CP3Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
pDC->TextOut(30, 30, pDoc->stringinout);

Adugarea codului pentru editarea irului de caractere


Pentru a putea modifica irul de caractere trebuie creat o caset de dialog cu un
control de tip EditBox care s permit preluarea unui nou sir. Se adaug la
aplicaie o nou resurs de tip CDialog, care se editeaz prin adugarea unui
control de tip EditBox. Clasa ce va "sta n spatele" ferestrei de dialog are
numele CDialogstring, iar pentru aceast clas se adaug o dat membru de tip
CString, cu numele m_string, n care se va prelua string-ul tastat.

void CP3View::Onmodifica()
{
// TODO: Add your command handler code here

CP3Doc* pDoc = GetDocument();

CDialogstring dialog;
int result = dialog.DoModal();
if( result = = IDOK)
pDoc->stringinout=dialog.m_string;
Invalidate();
}

Apelul funciei Invalidate(); permite actualizarea imaginii afiate.

S-ar putea să vă placă și