Incapsulare CRectTracker & CLineTracker

Intrebari legate de programarea cu biblioteci precum MFC, ATL, WTL si GDI+.
mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Incapsulare CRectTracker & CLineTracker

Post by mesajflaviu » 16 Jul 2010, 10:35

Multimea elementelor m_ShapeTracker este tot zero si in blocul else ( am verificat asta ) , iar serializarea merge prin fiecare obiect derivat din cel de baza , dar am putut verifica doar la salvarea datelor ...



Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: Incapsulare CRectTracker & CLineTracker

Post by Viorel » 16 Jul 2010, 10:40

Dacă obiectele ar fi derivate din CObject şi s-ar folosi macrodefiniţiile speciale DECLARE_DYNAMIC şi IMPLEMENT_DYNAMIC, iar m_ShapeTracker ar fi de tipul CObArray sau CTypedPtrArray<CObArray>, atunci m_ShapeTracker.Serialize(ar) sau ar << m_ShapeTracker şi ar >> m_ShapeTracker ar trebui să funcţioneze.

În caz contrar cred că urmează să serializezi colecţia manual. Mai întîi serializezi dimensiunea. Apoi serializezi fiecare element în parte, precedat de un cod care să precizeze tipul acestuia -- CLineTracker sau CRectTracker etc. La deserializare ştergi toate elementele din colecţie şi citeşti noua dimensiune a colecţiei, apoi organizezi un ciclu care citeşte codul, creează cu new obiectul corespunzător, execută Serialize pentru acest obiect şi îl adaugă la colecţie.

User avatar
Andreas
Membru
Membru
Posts: 117
Joined: 09 Nov 2008, 12:13
Judet: Timiş
Location: Timisoara

Re: Incapsulare CRectTracker & CLineTracker

Post by Andreas » 16 Jul 2010, 12:08

Ovidiu, imi cer scuze, nu m-am prins ca a fost o autocritica...
Am spus-o deja, nu am avut nici cea mai mica intentie de a sugera ca trebuie facuta o "strutocamila", am raspuns doar ca este posibil...
Insa ce vad este ca tot strutocamila a iesit: CLineTracker era deja "importata" din alt proiect, iar CRectTracker la fel, pentru ca CShapeTracker este adevarata strutocamila...spun asta pentru ca s-a combinat tracker-ul cu shape-ul cand, imho, trebuiesc separate...de fapt asta am si spus la un moment dat: tracker-ul este pentru
CRectTracker
CRectTracker does not have a base class.

The CRectTracker class allows an item to be displayed, moved, and resized in different fashions. Although the CRectTracker class is designed to allow the user to interact with OLE items by using a graphical interface, its use is not restricted to OLE-enabled applications. It can be used anywhere such a user interface is required.
....
si shape-ul deseneaza obiecte

referitor la problema cu container-ul, subscriu la ce a spus Viorel, asta am si folosit dar in C#, numarul de elemente din container trebuie serializat primul, pe urma trebuie serializat si "tipul"(in C# este serializat by default), iar restul sunt proprietatile obiectelor...

dar de fapt MFC-ul nu este chiar asa de sarac, si are o solutie foarte eleganta pentru problema noastra care concureaza .NET-ul, adica COleDocument care are container propriu si la serializeaza face ce a spus Viorel...

exemplu:CONTAINER Sample: Visual Editing Container Application

mai trebuie facut un ActiveX care sa stie sa deseneze in device context-ul propriu ce forma dorim si cam atat...

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Incapsulare CRectTracker & CLineTracker

Post by mesajflaviu » 16 Jul 2010, 12:40

O sa incerc solutiile propuse de voi pentru serializare . Am o nelamurire : aceasta este definitia clasei CShapeTracker :

Code: Select all

class CShapeTracker  
{
public:
	virtual void Serialize(CArchive& ar) = 0;
	virtual int GetType() = 0;
	virtual BOOL Track(CWnd *pWnd, CPoint point,CWnd* pWndClipTo) = 0;
	virtual BOOL TrackRubberBand(CWnd* pWnd, CPoint point) = 0;
	virtual BOOL SetCursor(CWnd* pWnd, UINT nHitTest) const = 0;
	virtual int HitTest(CPoint point) const = 0;
	virtual void Draw(CDC* pDC) const = 0;
	CShapeTracker();
	virtual ~CShapeTracker();

};
de ce unele metode au trebuit declarate const , iar altele nu ? Mentionez ca am incercat ca metodele const sa le fac simple si nu merg , si viceversa . Cand trebuie declarate const , si cand nu ?

User avatar
zlatomir
Membru++
Membru++
Posts: 282
Joined: 04 Jul 2009, 23:59
Location: Arad
Contact:

Re: Incapsulare CRectTracker & CLineTracker

Post by zlatomir » 16 Jul 2010, 12:58

Functiile const sunt cele care nu modifica valorile membrilor (decat ale celor declarati cu keyword-ul "mutable")

Ai grija daca schimbi const sa schimbi si la definitie si la declaratie, pentru ca pentru compiler urmatoarele doua functii sunt doua functii distincte:

Code: Select all

virtual void Draw(CDC* pDC) const;
virtual void Draw(CDC* pDC);

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: Incapsulare CRectTracker & CLineTracker

Post by Silviu Ardelean » 16 Jul 2010, 13:13

Flaviu, vad ca nu ai derivat CShapeTraker din CObject.
Mai multe detalii, gasesti aici. :)

User avatar
Andreas
Membru
Membru
Posts: 117
Joined: 09 Nov 2008, 12:13
Judet: Timiş
Location: Timisoara

Re: Incapsulare CRectTracker & CLineTracker

Post by Andreas » 16 Jul 2010, 14:21

referitor la derivare din CObject, poate ca Flavius a derivat clasele care implementeaza CShapeTracker din CObject...
oricum din cate stiu DECLARE_SERIAL(class) nu merge intr-o clasa abstracta...

cred ca exista o confuzie intre modul de functionare a Serialize din CObject si operatorii <<, >>: Serialize "stie" daca se face loading sau storing deci nu trebuie obligatoriu pus in if/else...operatorii, clar, e unul pentru fiecare caz...
apoi foarte important pentru Serialize obiectele trebuie sa fie deja alocate(pentru storing e evident), si asta se uita de regula in la loading...interesant este ca operatorii <<, >> functioneaza altfel adica pentru ca stocheaza default si tipul(asta obligand sa nu se foloseasca Serialize impreuna cu operatorii), nu are nevoie de alocare prealabila a obiectelor, fiind capabile sa le creeze dinamic...
astea fiind spuse, Flavius in cazul folosirii lui Serialize pentru loading aloca obiectele mai intai in container si pe urma fa serializarea...pentru test foloseste un singur tip (line sa rect) sa vezi daca merge...daca ramai pe ideea asta trebuie sa adaugi "tipul" by hand in arhiva...
diferentele astea le-a spus deja Viorel, eu doar le-am subliniat cum am inteles...
folosirea operatorilor ar merita tot efortul, pare-se nu e doar chestie de gust...COleDocument are implementare diferita a metodei Serialize care functioneaza la fel ca si operatorii,creeaza dinamic obiectele CDocItem in functie de tipul din arhiva...

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Incapsulare CRectTracker & CLineTracker

Post by mesajflaviu » 19 Jul 2010, 14:37

Cred ca am intrat pe un drum infundat : ca sa pot desena liniile o data cu dreptunghiurile , trebuie ca intr-o metoda interna clasei CRectTracker2 sa am acces la elementele tabloului cu elemente CSharpTracker ( si , de fapt la elementele clasei CLineTracker ) , care apartine clasei document . Bun , am obtinut un pointer la clasa document :

Code: Select all

// ShapeTracker.h
class CShapeTracker
{
};

Code: Select all

// RectTracker2.h
class CRectTracker2 : public CShapeTracker
{
};

Code: Select all

// LineTracker.h
class CLineTracker : public CShapeTracker
{
};

Code: Select all

// ObjectNetMapDoc.h
class CObjectNetMapDoc : public CDocument
{
...
...
	CArray<CShapeTracker*,CShapeTracker*> m_ShapeTracker;
};

Code: Select all

BOOL CRectTracker2::TrackHandle(int nHandle, CWnd* pWnd, CPoint point,CWnd* pWndClipTo)
{
	///*//////////////////////////////////////////////////
	CMDIFrameWnd* pMDIFrame = (CMDIFrameWnd*)AfxGetMainWnd();
	CFrameWnd* pFrameWnd = (CFrameWnd*)pMDIFrame->MDIGetActive();
	CObjectNetMapDoc* pDoc = (CObjectNetMapDoc*)pFrameWnd->GetActiveView();
	TRACE1("\n %d \n",pDoc->m_ShapeTracker.GetSize());
	//////////////////////////////////////////////////*/
...
...
...
}
, dar cand testez numarul de elemente a tabloului pDoc->m_ShapeTracker , acesta este intotdeauna 1 , indiferent cate dreptunghiuri / linii am pe ecran . As putea avea acces la elementele tabloului pDoc->m_ShapeTracker , din interiorul clasei CRectTracker ?

mesajflaviu
Membru++
Membru++
Posts: 687
Joined: 10 Sep 2008, 21:40
Judet: Cluj

Re: Incapsulare CRectTracker & CLineTracker

Post by mesajflaviu » 05 Aug 2010, 21:21

Viorel wrote:Dacă obiectele ar fi derivate din CObject şi s-ar folosi macrodefiniţiile speciale DECLARE_DYNAMIC şi IMPLEMENT_DYNAMIC, iar m_ShapeTracker ar fi de tipul CObArray sau CTypedPtrArray<CObArray>, atunci m_ShapeTracker.Serialize(ar) sau ar << m_ShapeTracker şi ar >> m_ShapeTracker ar trebui să funcţioneze.

În caz contrar cred că urmează să serializezi colecţia manual. Mai întîi serializezi dimensiunea. Apoi serializezi fiecare element în parte, precedat de un cod care să precizeze tipul acestuia -- CLineTracker sau CRectTracker etc. La deserializare ştergi toate elementele din colecţie şi citeşti noua dimensiune a colecţiei, apoi organizezi un ciclu care citeşte codul, creează cu new obiectul corespunzător, execută Serialize pentru acest obiect şi îl adaugă la colecţie.
Am reusit sa serializez CShapeTracker cu a doua metoda . Multumesc tuturor !

Post Reply