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

Incapsulare CRectTracker & CLineTracker

Post by mesajflaviu » 13 Jul 2010, 15:03

Am incercat in cateva feluri ( fara succes ) sa fac o clasa CMultiTracker care sa contina obiecte de tip CRectTracker si CLineTracker , ca apoi sa o pot folosi intr-un CView de exemplu ... imi puteti spune ( principial vorbind ) cum as putea sa incapsulez intr-un CObArray de exemplu doua tipuri de obiecte ( CRectTracker si CLineTracker ) , pentru ca mai apoi sa am acces bineinteles la metodele fiecaruia in parte ?



User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Incapsulare CRectTracker & CLineTracker

Post by Ovidiu Cucu » 13 Jul 2010, 16:10

Daca am mai multe tipuri de obiecte din clase ce deriva din CObject, no problem le poti pune de-a valma intr-un CObArray.
Mai tarziu, afli de ce tip e fiecare cu CObject::IsKindOf.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Incapsulare CRectTracker & CLineTracker

Post by Ovidiu Cucu » 14 Jul 2010, 11:38

M-am uitat azi mai cu atentie atat la CRectTracker din MFC cat si la acel CLineTracker (de la Codeproject, nu-i asa?) si surprize... nici una nu deriva din CObject.
No problem, inca le mai poti pune intr-un CArray sau CPtrArray, iar pentru recunoastere folosesti type_info sau dynamic_cast.
Nu uita sa faci enable la RTTI.

Vezi si articolasul Verificarea tipului la runtime.

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

Re: Incapsulare CRectTracker & CLineTracker

Post by Andreas » 14 Jul 2010, 18:34

mesajflaviu:
Am incercat in cateva feluri ( fara succes ) sa fac o clasa CMultiTracker care sa contina obiecte de tip CRectTracker si CLineTracker , ca apoi sa o pot folosi intr-un CView de exemplu ...
ceva de genul

Code: Select all

class CMultiTracker: public CRectTracker, public CLineTracker
{

	//....
};
am vazut ca se compileaza, deci ma gandesc ca ajustata coresunzator ar trebui sa mearga...

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Incapsulare CRectTracker & CLineTracker

Post by Ovidiu Cucu » 14 Jul 2010, 21:59

Deacord Andreas, de compilat ceva gen

Code: Select all

class StrutoCamila : public Strut, public Camila /* ... */
se compileaza.

Problema e ca, daca vrei sa cumperi un strut (cu pene, cioc si face oua) si nu o camila (cu cocoase, bot si da lapte) iar cineva iti arata un card de strutocamile, pe care dihanie o alegi?

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

Re: Incapsulare CRectTracker & CLineTracker

Post by Andreas » 15 Jul 2010, 11:53

Ovidiu, din quote-ul lui reiese ca a vrut o strutocamila...si zicea ca nu se poate...am aratat ca se poate...
apoi, daca asta nu i-a mers, a zis ca vrea "incapsulare" in CObArray :wacko:...cand colo e "containerala"...

oricum din ce mi se pare mie prietenul nostru incearca sa faca un fel de designer cu toolbox si controale reutilizabile, sau cel putin asta ar fi tinta...
parerea mea este ca, ori folosesti CLineTracker si iti faci propriul rect tracker(din 8 ClineTracker) si le faci sa fie mereu "unite", si geometric sa compuna mereu un patrat, ori folosesti doar CRectTracker...
pe urma tracker trebuie folosit pentru vizualizare/redimensionare/pozitionare nu pentru serializare...pentru serializare folosesti direct proprietatile controalelor, pentru ca de exemplu ai background(culoare sau imagine), de unde mai iei din tracker asa ceva, deci nu are rost sa serializezi o parte din proprietati din tracker(pozitie, dimensiune) si altele din obiect...

bine ca exista totusi CRectTracker in MFC, ca in .NET n-am vazut asa ceva si a trebuit sa reinventez....

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

Re: Incapsulare CRectTracker & CLineTracker

Post by mesajflaviu » 15 Jul 2010, 12:03

M-am gandit sa folosesc o clasa de baza CShapeTracker de exemplu , din care sa deriv CLineTracker si CRectTracker , iar metodele pe care va trebui sa le folosesc pentru ambele figuri sa le fac virtuale ... in acest fel cred ca pot avea acces mai usor la metodele fiecarei clase in parte ... acum muncesc la asta . Cat despre clasa CLineTracker , am adaptat-o de pe http://www.codeguru.com . ( nu mai stiu articolul , dar il caut ) .

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

Re: Incapsulare CRectTracker & CLineTracker

Post by mesajflaviu » 15 Jul 2010, 14:19

Clasa CLineTracker folosita in proiect : CLineTracker

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

Re: Incapsulare CRectTracker & CLineTracker

Post by mesajflaviu » 15 Jul 2010, 14:29

oricum din ce mi se pare mie prietenul nostru incearca sa faca un fel de designer cu toolbox si controale reutilizabile, sau cel putin asta ar fi tinta...
Proiectelul trebuie sa poata desena dreptunghiuri si linii pe un CScrollView , iar in cazul cand liniile se termina in interiorul dreptunghiurilor , iar acel dreptunghi daca se misca , sa duca linia o data cu el ... de aceea mi-am facut un CRectTracker propriu ( un fel de copie a celui original ) .

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Incapsulare CRectTracker & CLineTracker

Post by Ovidiu Cucu » 15 Jul 2010, 19:03

Eu zic sa lasi in pace CRectTraker-ul din MFC chiar daca te mai inspiri pe ici pe colo din el si sa-ti faci propriile tale clase, una abstracta de baza sa-i zicem CShape din care derivi CLine, CRectangle, CEllipse si de ce-i mai avea nevoie.
Daca vrei sa le bagi mai apoi intr-un CObArray cum ai pus problema in OP, derivezi CShape din CObject.

// Andreas, te rog sa nu te superi pe mine.
// Mai discutam, mai radem, mai glumim... Cat "nu parasim incinta" cred ca-i OK. ;)

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

Re: Incapsulare CRectTracker & CLineTracker

Post by Andreas » 15 Jul 2010, 19:53

@Ovidiu
hmm...chiar nu inteleg ce's cu atentionari de genul asta...cu atat mai mult in cazul de fata
dar te rog sa intelegi ca orice ai gandi ca as fi putu face in afara regulii, altii si poate chiar si tu au si facut-o pe site-ul asta...
hmm...wrong

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Incapsulare CRectTracker & CLineTracker

Post by Ovidiu Cucu » 16 Jul 2010, 00:39

Andreas wrote:@Ovidiu
hmm...chiar nu inteleg ce's cu atentionari de genul asta...cu atat mai mult in cazul de fata
dar te rog sa intelegi ca orice ai gandi ca as fi putu face in afara regulii, altii si poate chiar si tu au si facut-o pe site-ul asta...
hmm...wrong
[ Off-topic ]

Erau doar scuze la raspunsul cu StrutoCamila : public Strut, public Camila (si-ar mai fi) pentru ca l-am considerat a little bit too harsh.

O "atentionare" ar fi aratat cu totul altfel. ;)

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, 08:21

mesajflaviu wrote:M-am gandit sa folosesc o clasa de baza CShapeTracker de exemplu , din care sa deriv CLineTracker si CRectTracker , iar metodele pe care va trebui sa le folosesc pentru ambele figuri sa le fac virtuale ... in acest fel cred ca pot avea acces mai usor la metodele fiecarei clase in parte ...
O idee excelenta si cat se poate de normala. SporT! :)
Andreas wrote:hmm...chiar nu inteleg ce's cu atentionari de genul asta...cu atat mai mult in cazul de fata
Scuze ca intervin in discutie, dar cred ca inteleg foarte clar ce a spus Ovidiu. Ovidiu, se referea "metaforic" la faptul ca cu aceea abordare de derivari publice... lucrurile se complica inutil. Nici vorba de atac sau atentionare. :)
Ideea cu cele doua mosteniri publice nu mi se pare una inspirata.
Pentru situatia data, si eu sunt adeptul unei clase abstracte, derivata din CObject (a.i. sa ma ajute si la serializare) si clase cu formele concrete.

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

Re: Incapsulare CRectTracker & CLineTracker

Post by mesajflaviu » 16 Jul 2010, 09:47

Apropo de serializare , poate fiindca nu am derivat acea clasa de baza CShapeTracker din CObject , acum am urmatoarea problema la serializare : cu toate ca am facut o metoda virtuala in clasa de baza ca apoi sa implementez serializarea fiecarui obiect in parte , la incarcarea fisierului salvat am urmatoarea problema :

Code: Select all

//CObjectNetMapDoc.h

CArray<CShapeTracker*,CShapeTracker*> m_ShapeTracker;

//CObjectNetMapDoc.cpp

void CObjectNetMapDoc::Serialize(CArchive& ar)
{
	if (ar.IsStoring())
	{
		// TODO: add storing code here
	}
	else
	{
		// TODO: add loading code here
	}
          TRACE1("\n %d \n",m_ShapeTracker.GetSize()); // m_ShapeTracker.GetSize() == 0 !!!
	for(int i = 0;i < m_ShapeTracker.GetSize();++i)m_ShapeTracker[i]->Serialize(ar);
}
de salvat salveaza fiecare obiect in parte , dar la incarcare , numarul obiectelor m_ShapeTracker este 0 ... cum pot rezolva aceasta problema ?
Last edited by mesajflaviu on 16 Jul 2010, 10:08, edited 1 time in total.

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, 10:02

In primul rand, acel for ar trebui sa fie in blocul de incarcare (else).
Trebuie sa te asiguri ca obiectele tale sunt incarcate in metoda ta de serializare. Apoi, daca vezi ca ti se incarca datele ok, sa verifici ca ele ajung in containerul tau ce-l folosesti intern ( si in GetSize() ).

Post Reply