Costruzione di una classe derivata da TAG

Trasformare una qualunque classe precedente in tag è molto semplice; consideriamo il caso della classe DocumentSize, in uso da molti anni in Colibrì; nella dichiarazione della classe DocumentSize (DocumentSize.h) é stato sufficiente affermare la sua discendenza da TAG  ed aggiungere alla fine la macro  __use_tag_funcs.

class AFX_EXT_CLASS DocumentSize :public TAGS::TAG
	{
	public:
		DocumentSize();
		~DocumentSize();
	        bool SetPixelSize(int px, int py);
		bool SetSize(float dx, float dy, int um = unit_default);
		bool GetSize(float *dx, float *dy, int um = unit_default);
		bool GetPixelSize(int *dx, int *dy);
		DOC_AREA *Area();
		bool GetResolutions(float *resx, float *resy, int um = unit_default);
		int GetNearX(float x);
		int GetNearY(float y);
		bool GetNearPixel(PointF p_mm, Point *pxl);
		bool GetPixelPos(Point pxl, PointF *fp, int um = unit_default);
		\details le dimensioni dei pixel sono l'inverso delle risoluzioni h e v
		bool GetPixelSize_mm(PointF *px_size);
		bool Valid();
		bool Rotate(float angle);
		bool operator == (DocumentSize &sz);
>
		__use_tag_funcs
		__use_private_struct
	};

La dichiarazione :public TAGS::TAG indica la presenza dell’interfaccia TAG.  La macro __use_tag_funcs posta alla fine della classe indica la presenza delle funzioni virtuali Read, Write e New, che dovranno essere scritte nel file sorgente cpp della classe;

Modifiche nel file DocumenSize.cpp: Nella funzione del costruttore è stata aggiunta la macro _tag_register  per la registrazione della classe nell’applicazione; la stringa, che  definisce l’id assegnato, può essere una qualunque sequenza alfanumerica, ma è opportuno assegnargli un valore mnemonico;

	DocumentSize::DocumentSize()
	{
  	  $_init
	  _tag_register(L"DocSize");
	}

Aggiunta delle funzioni virtuali:  le funzioni Read e Write erano già presenti in DocSize, e non sono state modificate; La funzione New è stata aggiunta mediante una macro in testa al codice sorgente. Di seguito si riporta il frammento di codice relativo alle due funzioni:

	BEGIN_READ
	{
		fd->Read(&_$str->um);
		fd->Read(&_$str->area.dx);
		fd->Read(&_$str->area.dy);
		fd->Read(&_$str->area.dx_mm);
		fd->Read(&_$str->area.dy_mm);
		_calc_resolution(_$str);
	}
	END_READ
	BEGIN_WRITE
	{
	        fd->Write(_$str->um);
	        fd->Write(_$str->area.dx);
	        fd->Write(_$str->area.dy);
	        fd->Write(_$str->area.dx_mm);
	        fd->Write(_$str->area.dy_mm);
	}
	BEGIN_WRITE

	

Le macro BEGIN_READ .. END_READBEGIN_WRITE .. END_WRITE corrispondono alle classiche funzioni di lettura e scrittura della classe su file, e si rimanda all’articolo specifico sulla progettazione delle classi di Colibri.

La macro _new_tag_func è stata inserita dopo il blocco di dichiarazioni posto  in testa al file DocumentSize.cpp e definisce la funzione New() della classe

#define CURRENT_REVISION 2					
#define CLASS_NAME_STR    DocumentSize_STR	
#define CLASS     DocumentSize 

__new_tag_func

Con queste modifiche la classe potrà ora essere inserita in una tag_list; notare che le modifiche non ne hanno alterato l’utilizzabilità con i precedenti metodi, hanno però  aggiunto le nuove funzionalità richieste per l’utilizzo come tag.

Pages: 1 2 3 4
Skip to toolbar