🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: be.comp.programming
9 messages
9 total messages Started by TRAX Tue, 20 May 2003 18:47
serieus probleem in borland builder
#5222
Author: TRAX
Date: Tue, 20 May 2003 18:47
38 lines
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
#5224
Author: Roel Schroeven
Date: Tue, 20 May 2003 21:35
63 lines
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
#5044
Author: TRAX
Date: Tue, 20 May 2003 21:50
56 lines
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
#5045
Author: Roel Schroeven
Date: Wed, 21 May 2003 07:46
75 lines
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
#5046
Author: TRAX
Date: Wed, 21 May 2003 11:47
25 lines
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
#5047
Author: TRAX
Date: Wed, 21 May 2003 12:02
41 lines
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
#5048
Author: Roel Schroeven
Date: Wed, 21 May 2003 12:02
40 lines
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
#5049
Author: TRAX
Date: Wed, 21 May 2003 12:20
41 lines
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
#5050
Author: Roel Schroeven
Date: Wed, 21 May 2003 12:55
18 lines
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