OWL Doc/View lyhykäisesti:


OWL Doc/View lyhykäisesti

Timo & Vesa Lappalainen -96

Tehdään Doc/View pohjainen ohjelma, joka piirtää suorakulmion ikkunaan. Ensimmäisessä vaiheessa piirretään aina vakiokokoinen suorakulmio. Esimerkillä demonstroidaan View luokan toimintaa yksinkertaisimmillaan. Seuraavassa vaiheessa liitetään View luokka omaan Doc luokkaan jolla luetaan suorakulmion koko tiedostosta.

Vakiokokoinen suorakulmio

1.
Luo AppExpertillä projekti. Tässä vaiheessa projekti voi olla joko MDI tai SDI tyyppinen. Anna projektin nimeksi vaikka Rect. Oletusarvoilla AppExpert luo luokan TRectEditView, joka on assosioitu TFileDocument luokan kanssa. TEditView luokan avulla voi esim. editoida tekstitiedostoja. Tässä esimerkissä ei tätä luokkaa tarvita mutta se voidaan jättää projektiin toistaiseksi. Muuta myös projektin compiler defines _OWLPCH -> _OWLALLPCH. Tämä pienentää precompiled headers - tiedoston kokoa.
2.
Lisää projektiin ClassExpertillä TWindowView luokasta peritty oma luokka. Anna sille nimeksi vaikka TRectView.
3.
Lisää TRectView tiedostoon vaikka TRectView Implementation kohdan alapuolelle määrittelyt:
		//{{DOC_VIEW}}
		DEFINE_DOC_TEMPLATE_CLASS(TFileDocument, TRectView, TRectTemplate);
		//{{DOC_VIEW_END}}
		
		//{{DOC_MANAGER}}
		TRectTemplate RectTemplate("Rect Files", "*.*", 0, "rect", 
		                dtAutoDelete | dtUpdateDir | dtOverwritePrompt);
		//{{DOC_MANAGER_END}}
4.
Lisää ClassExpertillä TRectView:lle virtuaalimetodin Paint käsittelijä (mene ko. luokan kohdalle ja valitse oikean puoleisesta ruudusta Virtual Functions ja etsi tämän alta Paint metodi ja hiiren oikealla napilla Add handler).
5.
Lisää Paint -metodiin rivit:
		TRect Rect(50,50,200,200);
		dc.Rectangle(Rect);
6.
Käännä ja aja ohjelma. Valitse File/New ja Rect Files. Näyttöön pitäisi ilmestyä suorakulmio.
Edellisestä. esimerkistä ei vielä ole paljoakaan iloa, koska se ei lue mitään tiedostosta.

Oma dokumentti

1.
Lisää ClassExpertillä TFileDocumentista peritty luokka TRectDocument.
2.
Lisää käsin TRectDocumentin .h:hon (mene ClassExpertissä ko. luokan kohdalle ja valitse hiiren oikealle näppäimellä Edit Header)
		protected:
		  TRect Rect;
		public:
		  const TRect &GetRect();
3.
Lisää käsin TRectDocumentin rakentajaan TFileDocument(parent) perään
		,Rect(20,20,100,100)
4.
ja lisää GetRect käsittelijä:
		const TRect &TRectDocument::GetRect()
		{
		  return Rect;
		}
5.
Lisää TRectView:n sisältävän tiedoston alkuun: #include "rctdcmnt.h" (tai mikä lieneekään)
6.
Vaihda ensimmäisessä vaiheessa tehdyn RectDoc:n määrittely:
		DEFINE_DOC_TEMPLATE_CLASS(TRectDocument, TRectView, TRectTemplate);
7.
Vaihda samalla myös tarkentimen *.* tilalle *.rct.
8.
Vaihda TRectView:n Paint metodin sisällöksi:
		TWindowView::Paint(dc, erase, rect);
		TRectDocument *RectDoc=TYPESAFE_DOWNCAST(Doc,TRectDocument);
		dc.Rectangle(RectDoc->GetRect());
9.
Käännä ja aja ohjelma. Muista valita tiedoston avauksessa alempi vaihtoehto dokumentin tyypille (Rect Files *.rct). Näyttöön pitäisi ilmestyä TRectDocumentin rakentajassa luotu 80x80 suorakulmio.
Esimerkkimme ei vieläkään lue tiedostosta mitään mutta nyt voidaan helposti lisätä TRectDocumenttiin käsittelijät.

Tiedoston käsittely

1.
Lisää ClassExpertillä ensin TRectDocumenttiin virtuaalimetodi Open.
2.
Editoi Open käsittelijän sisällöksi:
		{ 
		  TInStream* is = InStream(ofRead);
		  if (!is) return false;
		
		  *is >> Rect;
		
		  delete is; // En tieda pitääkö/saako tuhota!
		
		  SetDirty(false);
		
		  return true;
		}
3.
Editoi GetRect sisällöksi:
		{
		  static TRect errRect(0,0,50,50);
		  if (!IsOpen() && !Open(ofRead | ofWrite)) return errRect;
		  return Rect;
		}
4.
Luo tiedosto eka.rct, joka sisältää esimerkiksi rivin:
		(50,50,200,200)
5.
Käännä ja aja ohjelma. Muista valita tiedoston avauksessa alempi vaihtoehto dokumentin tyypille (Rect Files *.rct). Näyttöön pitäisi ilmestyä eka.rct:ssä määritelty suorakulmio tai jos valitaan New tiedosto, GetRect:ssä määritelty (avaus epäonnistui) suorakulmio.
Tämän jälkeen voi hommaa lähteä kehittämään. Nyt voi turvallisesti luoda projektin vaikka uudelleen MDI:nä ja lisätä käsin äsken luodut TRectView ja TRectDocument tiedostot projektiin (muista ajaa rescan).