[C++] De juiste afbeelding selecteren met Borland Builder

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
Ik heb een applicatie met zeg maar 6 verschillende 'lampjes', dit zijn plaatjes die ik uit en aan zet.

Dit kan door middel van Form1->Plaatje1->Visible = 0;

Maar nu wil ik hier een functie voor maken.

Iets als dit:

code:
1
2
3
void changeLed(int led, bool status) {
       Form->Plaatje1->Visible = status;
}


Dit werkt voor Plaatje1 maar ik zou het dus graag op en manier willen doen van:

code:
1
2
3
void changeLed(int led, bool status) {
       Form->Plaatje{led}->Visible = status;
}


Is dit mogelijk?

Acties:
  • 0 Henk 'm!

Verwijderd

VCL bied een methode om componenten te vinden op basis van hun naam: FindComponent.

Ik ben eigenlijk alleen bekend met Borland Delphi, maar ik denk dat het zoiets wordt in C++ Builder:

code:
1
2
3
4
5
6
7
void changeLed(int led, bool status) {
       TComponent component = Form->FindComponent("Plaatje" + IntToStr(led));

        if (component != null) {
            (TWinControl)component->Visible = status;
        }
}

Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
Naar zoiets had ik al het idee om te zoeken maar kon de juiste termen niet vinden om er uit eindelijk bij te recht te komen.

In ieder geval bedankt, hier kan ik denk ik wel mee verder.

Acties:
  • 0 Henk 'm!

  • Snake
  • Registratie: Juli 2005
  • Laatst online: 07-03-2024

Snake

Los Angeles, CA, USA

Of steek je 6 plaatjes in een array?

Going for adventure, lots of sun and a convertible! | GMT-8


Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
Misschien ook nog een optie..

code:
1
2
3
4
5
6
7
        TComponent * component; 

        component = Form->FindComponent("Plaatje" + IntToStr(led));

        if (component != NULL) {
            (TWinControl)component->Visible = status;
        }


Hierop krijg ik de error dat Visible geen member is van TComponent, moet ik deze dan nog definiëren of iets omdat het om een TImage gaat?

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Ik denk dat je haakjes verkeerd staan:

C:
1
((TWinControl)component)->Visible = status;

Acties:
  • 0 Henk 'm!

  • donzz
  • Registratie: Maart 2006
  • Laatst online: 09-09 23:12
of je maakt er 6 if's van, of een switch met 6 elementen :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void changeLed(int led, bool status) 
{
  switch ( led )
  {
    case 1 : 
             Form->Plaatje1->Visible = status;
             break;
    case 2 :
             Form->Plaatje2->Visible = status;
             break;
    .
    .
    .
    default : 
             break;
  }
}

alles kan kapot; beter dat ik het nu test dan dat er straks iemand komt klagen


Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
Ja de switch had ik zo en zo wel kunnen bedenken.

Maar het is gelukt met wat hulp van google:

code:
1
2
3
4
5
void changeLed(int led, int status) {
        TComponent * component = Form->FindComponent("Image" + IntToStr(led));

        static_cast<TImage*>(component)->Visible = status;
}


Op deze manier definieer je dus dat component een TImage is en dus member Visible heeft. (denk ik ;))

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

donzz schreef op woensdag 07 oktober 2009 @ 10:42:
of je maakt er 6 if's van, of een switch met 6 elementen :)
Ja, want dat is natuurlijk veel mooier.... 8)7

De enige nette en onderhoudbare oplossing is hierboven al gegeven door Snake: zet de componenten in een array en gebruik daar gewoon de index van. Objecten aanspreken op hun naam die je bovendien nog eens opbouwt uit variabelen is gewoon ranzig. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Black-Xjuh
  • Registratie: Oktober 2002
  • Laatst online: 14-04 10:23
Hoe kan ik de 7 TImages, Plaatje0 t/m 6 in een array krijgen dan? Want dat zou verder ook perfect zijn.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Black-Xjuh schreef op woensdag 07 oktober 2009 @ 15:25:
Hoe kan ik de 7 TImages, Plaatje0 t/m 6 in een array krijgen dan? Want dat zou verder ook perfect zijn.
De TImages zullen ook ergens aangemaakt en aan het form toegevoegd moeten worden, als je ze gewoon op die plek ook in een array, of andere collectie stopt, kun je ze later makkelijk weer aan de hand van de index ophalen.

Al vind ik de manier met FindComponent ook niet zo heel erg fout, alleen je hebt natuurlijk wel de kans dat je straks plaatje 8 hebt waar je als naam per ongeluk Platje8 gebruikt in plaats van Plaatje8. Het is dus foutgevoeliger, aangezien het niet compile-time gecontroleerd word of je naamgeving klopt.. Je zult natuurlijk wel wat meer fout-controle toe moeten voegen.

[ Voor 30% gewijzigd door Woy op 07-10-2009 15:57 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • donzz
  • Registratie: Maart 2006
  • Laatst online: 09-09 23:12
NMe schreef op woensdag 07 oktober 2009 @ 12:04:
[...]

Ja, want dat is natuurlijk veel mooier.... 8)7

...
Niet mooier, wel leesbaarder. En daarbij, het gaat om 6/7 elementen. Waar hebben we het dan helemaal over?
Je moet het natuurlijk precies zo moeilijk maken als je zelf wil, maar mijn mening is dat wanneer iemand anders je code leest, het met een switch sneller duidelijk is wat je doet. Daarbij is het ook nog eens makkelijker te implementeren. :)

alles kan kapot; beter dat ik het nu test dan dat er straks iemand komt klagen


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

donzz schreef op donderdag 08 oktober 2009 @ 10:29:
[...]


Niet mooier, wel leesbaarder.
En ononderhoudbaarder. Want als je een aanpassing moet maken, moet je er nu ineens 6 doen. En dat leesbaarder vind ik persoonlijk maar onzin. Jouw 12 regels code zijn helemaal niet leesbaarder dan die ene regel van FindComponent()

[ Voor 22% gewijzigd door .oisyn op 08-10-2009 10:34 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Springuin
  • Registratie: Juli 2002
  • Laatst online: 11-09 20:13
Mijn voorkeursmethode:
code:
1
2
3
4
5
6
7
// declaratie (veronderstel dat het type component heet):
component plaatjes[7] = {Form->Plaatje0, Form->Plaatje1, enzovoort... };
// Vervolgens:
void changeLed(int led, bool status) 
{
   plaatjes[led]->Visible = status;
}

Eventueel kun je de grootte van de plaatjes array vastzetten met een define of const en dan nog een check op de waarde van led doen en een exception-achtig iets gooien als het misgaat.

[ Voor 25% gewijzigd door Springuin op 08-10-2009 10:44 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Springuin schreef op donderdag 08 oktober 2009 @ 10:42:
Mijn voorkeursmethode:
code:
1
2
3
4
5
6
7
// declaratie (veronderstel dat het type component heet):
component plaatjes[7] = {Form->Plaatje0, Form->Plaatje1, enzovoort... };
// Vervolgens:
void changeLed(int led, bool status) 
{
   plaatjes[led]->Visible = status;
}

Eventueel kun je de grootte van de plaatjes array vastzetten met een define of const en dan nog een check op de waarde van led doen en een exception-achtig iets gooien als het misgaat.
Waarom component als je weet dat het plaatjes zijn? En heten die in de VCL niet TImage (en TComponent) in jouw geval? :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Springuin
  • Registratie: Juli 2002
  • Laatst online: 11-09 20:13
Ik wist niet precies wat het type van Form->Plaatje0 was dus ik heb het voor het voorbeeld even component genoemd. Verder geen specifieke bijbedoelingen. Als Form->Plaatje0 een TImage pointer is krijg je dus dit:
C:
1
2
3
4
5
6
7
8
9
10
11
12
// declaratie
const unsigned int aantalplaatjes = 7;
TImage * plaatjes[aantalplaatjes] = {Form->Plaatje0, Form->Plaatje1, enzovoort... };
// Vervolgens:
void changeLed(unsigned int led, bool status) 
{
   if (led>=aantalplaatjes) {
        // foutmelding oid
        return;
   }
   plaatjes[led]->Visible = status;
}

[ Voor 0% gewijzigd door Springuin op 08-10-2009 14:47 . Reden: Springuin is niet zo thuis in Borland C++ builder... ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

TImage*

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1