Thread View: be.comp.programming
9 messages
9 total messages
Started by TRAX
Tue, 20 May 2003 18:47
serieus probleem in borland builder
Author: TRAX
Date: Tue, 20 May 2003 18:47
Date: Tue, 20 May 2003 18:47
38 lines
2774 bytes
2774 bytes
Ik heb een form en dat gebruikt een object van de klasse opties om waarden in variabelen te steken (de klasse heeft een default constructor). Hetzelfde object zou moeten kunnen worden aangepast in een andere form. Nu weet ik dat door de headerfile van de eerste of de tweede form te includen je dat kan doen, maar dat geldt enkel voor objecten die in de desbetreffende headerfile gedeclareerd zijn, niet ine de cpp file met methoden, wat bij mij het geval is. In mijn hoofdscherm worden allerlei waarden in variabelen, afkomstig uit het optie object, gestopt die enkel in de cpp file ervan zijn gedeclareerd, om praktische redenen (anders moet ik beginnen met vectoren te referencen om alle fucnties tot die waarden toegang te geven, enz..) Bovendien kan een object niet ge�nitialiseerd worden in de declaratie van een klasse (header file), anders was het probleem al lang opgelost. Hoe zou ik dit het beste kunnen oplossen? Hier is wat ik wil doen: In form1 (hoofdscherm, geen Midiparent) (form1.cpp) opties * optieset; optieset= new opties; rij=optieset->geefwaarde1(); kol=optieset->geefwaarde2(); In form2: (form 2.cpp) //form1.h include helpt niet, object wordt gedeclareerd in de cpp file, niet in de h trackbar->position=optieset->geefwaarde3(); //aangezien hij niet weet dat ik in form1.cpp optieset declareer en initialiseer dmw default constructor kan =form1->optieset->geefwaarde3(); dus niet Ik hoop dat iemand de uitleg een beetje snapt, ik kan het ook niet simpeler uitleggen en ik hoop dat er een oplossing voor te vinden is. alvast bedankt! -- stijn.verspeet@pandora[delete.this].be
Re: serieus probleem in borland builder
Author: Roel Schroeven
Date: Tue, 20 May 2003 21:35
Date: Tue, 20 May 2003 21:35
63 lines
3844 bytes
3844 bytes
TRAX wrote: > Ik heb een form en dat gebruikt een object van de klasse opties om > waarden in variabelen te steken (de klasse heeft een default > constructor). Hetzelfde object zou moeten kunnen worden aangepast in > een andere form. Nu weet ik dat door de headerfile van de eerste of > de tweede form te includen je dat kan doen, maar dat geldt enkel voor > objecten die in de desbetreffende headerfile gedeclareerd zijn, niet > ine de cpp file met methoden, wat bij mij het geval is. In mijn > hoofdscherm worden allerlei waarden in variabelen, afkomstig uit het > optie object, gestopt die enkel in de cpp file ervan zijn > gedeclareerd, om praktische redenen (anders moet ik beginnen met > vectoren te referencen om alle fucnties tot die waarden toegang te > geven, enz..) Als een klasse (of een functie, of een variabele, of whatever) in meer dan ��n source file gebruikt wordt, moet de gedefinieerd worden in een header file. Het *kan* natuurlijk anders, zoveel vrijheid geeft C++ wel, maar dat is gefoefel en slecht programmeren. > Bovendien kan een object niet ge�nitialiseerd worden in de declaratie > van een klasse (header file), anders was het probleem al lang > opgelost. Dat hoeft ook niet. > In form1 (hoofdscherm, geen Midiparent) > (form1.cpp) > opties *optieset; > optieset= new opties; > rij=optieset->geefwaarde1(); > kol=optieset->geefwaarde2(); Ik zou een nieuwe unit maken, met de klassedefinitie van TOpties (of hoe dat ook heet bij jou) in de header van die unit. Include die header in je beide forms. In de klassedefinitie van form1 zet je dan opties *optieset (ik gebruik dan meestal TOpties *m_Optieset; ik heb graag dat ik gemakkelijk overal het verschil kan zien tussen lokale variabelen en member variables) en op de aangewezen plaats, vermoedelijk in de constructor van form1 optieset = new opties; rij = optieset->geefwaarde1(); kol = optieset->geefwaarde2(); > In form2: (form 2.cpp) > //form1.h include helpt niet, object wordt gedeclareerd in de cpp file, >> niet in de h De header file van de nieuwe unit includen (C++Builder heeft daar trouwens een menucommando voor, in het File-menu; 'Include unit header' of zo iets). Dan moet je ook nog op een of andere manier de pointer naar de opties doorgeven; hoe je dat doet hangt er van af hoe je form2 cre�ert. form1->optieset->... zal wel lukken als je form1.h includeert, maar dan moet je optieset wel public zetten. -- "Codito ergo sum" Roel Schroeven http://roelschroeven.net
Re: serieus probleem in borland builder
Author: TRAX
Date: Tue, 20 May 2003 21:50
Date: Tue, 20 May 2003 21:50
56 lines
2789 bytes
2789 bytes
hmm, blijkbaar kan het inderdaad niet anders zonder gefoefel nee, maar dan
moet ik die vector ook declareren in de h file, daar geeft hij geen fouten :
in de header file bij public:
std::vector< std::vector<TImage*> > pictabel(rij,
std::vector<TImage*>(kol));
pas de probl�me hier, ik vul de waarden op dmv een methode op het object
optieset: (bij formcreate):
void __fastcall TFrmhoofd::FormCreate(TObject *Sender)
{
optieset = new opties;
rij=optieset->geefrij();
kol=optieset->geefkolom();
bezig=false;
maar als ik aan de vector kom geeft hij weer een foutje:
void TFrmhoofd::kaartenzetten()
{
for (int rij = 0; rij < pictabel.size(); rij++)
{
for (int kol = 0; kol < pictabel[rij].size(); kol++)
{
TPicture *picture;
picture= new TPicture;
picture->LoadFromFile("pictures\\jaja.jpg");
TImage *Image;
Image = new TImage(this);
Image->Picture=picture;
Image->Parent = this;
Image->Left = 3+(1.1*Image->Width*kol);
Image->Top = 3+(1.2*Image->Height*rij);
Image->Tag = (rij << 16) | kol;
Image->Width = 60;
Image->Height = 120;
Image->Stretch=true;
Image->Visible=true;
Image->Cursor=crHandPoint;
Image->OnClick=imgklik;
pictabel[rij][kol] = Image;
}
}
}
op elk gebruik van de vector krijg ik:
[C++ Error] frmpairs.cpp(103): E2294 Structure required on left side of .
or .*
[C++ Error] frmpairs.cpp(105): E2235 Member function must be called or its
address taken
[C++ Error] frmpairs.cpp(105): E2062 Invalid indirection
Re: serieus probleem in borland builder
Author: Roel Schroeven
Date: Wed, 21 May 2003 07:46
Date: Wed, 21 May 2003 07:46
75 lines
3583 bytes
3583 bytes
TRAX wrote:
> hmm, blijkbaar kan het inderdaad niet anders zonder gefoefel nee, maar dan
> moet ik die vector ook declareren in de h file, daar geeft hij geen fouten :
> in de header file bij public:
> std::vector< std::vector<TImage*> > pictabel(rij,
> std::vector<TImage*>(kol));
Als je zoiets in een klassedefinitie zet, denkt de compiler dat het geen
initialisatie is van een variabele (dat kan ook niet in een
klassedefinitie), maar een declaratie van een functie. Maak er van
std::vector< std::vector<TImage*> > pictabel;
zodat de vector gekend is, en zet in de constructor van die klasse
pictabel.assign(rij, std::vector<TImage*>(kol));
>
> pas de probl�me hier, ik vul de waarden op dmv een methode op het object
> optieset: (bij formcreate):
>
> void __fastcall TFrmhoofd::FormCreate(TObject *Sender)
> {
> optieset = new opties;
> rij=optieset->geefrij();
> kol=optieset->geefkolom();
>
>
>
> bezig=false;
>
> maar als ik aan de vector kom geeft hij weer een foutje:
> void TFrmhoofd::kaartenzetten()
> {
>
>
> for (int rij = 0; rij < pictabel.size(); rij++)
> {
> for (int kol = 0; kol < pictabel[rij].size(); kol++)
> {
> TPicture *picture;
> picture= new TPicture;
> picture->LoadFromFile("pictures\\jaja.jpg");
>
> TImage *Image;
> Image = new TImage(this);
> Image->Picture=picture;
> Image->Parent = this;
> Image->Left = 3+(1.1*Image->Width*kol);
> Image->Top = 3+(1.2*Image->Height*rij);
> Image->Tag = (rij << 16) | kol;
> Image->Width = 60;
> Image->Height = 120;
> Image->Stretch=true;
> Image->Visible=true;
> Image->Cursor=crHandPoint;
> Image->OnClick=imgklik;
> pictabel[rij][kol] = Image;
> }
> }
> }
> op elk gebruik van de vector krijg ik:
> [C++ Error] frmpairs.cpp(103): E2294 Structure required on left side of .
> or .*
> [C++ Error] frmpairs.cpp(105): E2235 Member function must be called or its
> address taken
> [C++ Error] frmpairs.cpp(105): E2062 Invalid indirection
>
>
--
"Codito ergo sum"
Roel Schroeven
Re: serieus probleem in borland builder
Author: TRAX
Date: Wed, 21 May 2003 11:47
Date: Wed, 21 May 2003 11:47
25 lines
2206 bytes
2206 bytes
Roel Schroeven wrote: > TRAX wrote: > >> hmm, blijkbaar kan het inderdaad niet anders zonder gefoefel nee, >> maar dan moet ik die vector ook declareren in de h file, daar geeft >> hij geen fouten : in de header file bij public: >> std::vector< std::vector<TImage*> > pictabel(rij, >> std::vector<TImage*>(kol)); > > Als je zoiets in een klassedefinitie zet, denkt de compiler dat het > geen initialisatie is van een variabele (dat kan ook niet in een > klassedefinitie), maar een declaratie van een functie. Maak er van > > std::vector< std::vector<TImage*> > pictabel; > > zodat de vector gekend is, en zet in de constructor van die klasse > > pictabel.assign(rij, std::vector<TImage*>(kol)); > >> bedankt! een heel domme vraag, waar vind ik de constructor van mijn klasse (t'is een form) of moet ik die zelf nog schrijven, zo ja, hoe?
Re: serieus probleem in borland builder
Author: TRAX
Date: Wed, 21 May 2003 12:02
Date: Wed, 21 May 2003 12:02
41 lines
2459 bytes
2459 bytes
Dit staat in de h file van het form:
std::vector< std::vector<TImage*> > pictabel;
En bij formcreate hander (denk dat je dat bedoelde) staat:
std::vector< std::vector<TImage*> > pictabel;
Ik krijg geen enkele fout, maar als ik dan een nieuw spel begin komen de
kaartjes niet meer op de form te staan (met de methode kaartenzetten, wordt
aangeropen bij klik op menu item):
void TFrmhoofd::kaartenzetten()
{
for (int rij = 0; rij < pictabel.size(); rij++)
{
for (int kol = 0; kol < pictabel[rij].size(); kol++)
{
TPicture *picture;
picture= new TPicture;
picture->LoadFromFile("pictures\\jaja.jpg");
TImage *Image;
Image = new TImage(this);
Image->Picture=picture;
Image->Parent = this;
Image->Left = 3+(1.1*Image->Width*kol);
Image->Top = 3+(1.2*Image->Height*rij);
Image->Tag = (rij << 16) | kol;
Image->Width = 60;
Image->Height = 120;
Image->Stretch=true;
Image->Visible=true;
Image->Cursor=crHandPoint;
Image->OnClick=imgklik;
pictabel[rij][kol] = Image;
}
}
}
Re: serieus probleem in borland builder
Author: Roel Schroeven
Date: Wed, 21 May 2003 12:02
Date: Wed, 21 May 2003 12:02
40 lines
2609 bytes
2609 bytes
TRAX wrote:
> Roel Schroeven wrote:
>
>>TRAX wrote:
>>
>>
>>>hmm, blijkbaar kan het inderdaad niet anders zonder gefoefel nee,
>>>maar dan moet ik die vector ook declareren in de h file, daar geeft
>>>hij geen fouten : in de header file bij public:
>>>std::vector< std::vector<TImage*> > pictabel(rij,
>>>std::vector<TImage*>(kol));
>>
>>Als je zoiets in een klassedefinitie zet, denkt de compiler dat het
>>geen initialisatie is van een variabele (dat kan ook niet in een
>>klassedefinitie), maar een declaratie van een functie. Maak er van
>>
>>std::vector< std::vector<TImage*> > pictabel;
>>
>>zodat de vector gekend is, en zet in de constructor van die klasse
>>
>>pictabel.assign(rij, std::vector<TImage*>(kol));
>>
>>
> bedankt!
> een heel domme vraag, waar vind ik de constructor van mijn klasse (t'is een
> form) of moet ik die zelf nog schrijven, zo ja, hoe?
Als ik een nieuwe form maak, wordt de constructor gemaakt voor mij:
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
Je kan hem eventueel ook zelf maken, ofwel die code in de OnCreate van
de form zetten.
--
"Codito ergo sum"
Roel Schroeven
Re: serieus probleem in borland builder
Author: TRAX
Date: Wed, 21 May 2003 12:20
Date: Wed, 21 May 2003 12:20
41 lines
2403 bytes
2403 bytes
Dit staat in de h file van het form:
std::vector< std::vector<TImage*> > pictabel;
En bij formcreate hander staat:
std::vector< std::vector<TImage*> > pictabel;
Ik krijg geen enkele fout, maar als ik dan een nieuw spel begin komen de
kaartjes niet meer op de form te staan (met de methode kaartenzetten, wordt
aangeropen bij klik op menu item):
void TFrmhoofd::kaartenzetten()
{
for (int rij = 0; rij < pictabel.size(); rij++)
{
for (int kol = 0; kol < pictabel[rij].size(); kol++)
{
TPicture *picture;
picture= new TPicture;
picture->LoadFromFile("pictures\\jaja.jpg");
TImage *Image;
Image = new TImage(this);
Image->Picture=picture;
Image->Parent = this;
Image->Left = 3+(1.1*Image->Width*kol);
Image->Top = 3+(1.2*Image->Height*rij);
Image->Tag = (rij << 16) | kol;
Image->Width = 60;
Image->Height = 120;
Image->Stretch=true;
Image->Visible=true;
Image->Cursor=crHandPoint;
Image->OnClick=imgklik;
pictabel[rij][kol] = Image;
}
}
}
Re: serieus probleem in borland builder
Author: Roel Schroeven
Date: Wed, 21 May 2003 12:55
Date: Wed, 21 May 2003 12:55
18 lines
2020 bytes
2020 bytes
TRAX wrote: > Dit staat in de h file van het form: > std::vector< std::vector<TImage*> > pictabel; > > En bij formcreate hander staat: > std::vector< std::vector<TImage*> > pictabel; Dat is twee keer hetzelfde? Ergens in de code moet je ook de tabel de juiste grootte geven: pictabel.assign(...) zoals in mijn vorige post staat. -- "Codito ergo sum" Roel Schroeven
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads