Toon posts:

[C++ Builder] checkbox vraag*

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik heb een form met 20 checkboxen CheckBox1 t/m CheckBox2 nou moet ik die uitlezen op het moment dat ik op een button klik en de waarde true or false opslaan in een string. Ik zat aan iets te denken met een for loop

void __fastcall TForm3::btnOpslaanClick(TObject *Sender)
{

String sData;

for (i1;i2 < 21; i2++)
{
if (CheckBox[i2]->Checked)
sData += "1";
else
sData += "0";
}
}

maar dit werkt natuurlijk niet. heeft iemand een idee hoe ik dit wel voor elkaar krijg.

btw. ik wil niet gewoon 20 keer onderelkaar die opdracht uitvoeren.

  • whoami
  • Registratie: December 2000
  • Nu online
Een form heeft een collection object Controls oid.
Die Controls kun je dus gaan overlopen en idere keer checken of de huidige control een TCheckBox is. Is het een CheckBox, dan ga je die verwerken:

code:
1
2
3
4
5
6
7
8
for( int i = 0; i < this.Controls.Count; ++ )
{

   if( this.Controls[i] is TCheckBox )
   {
        // do some stuff....
   }
}


Hoe jij ertoe komt om CheckBox[i] te gebruiken is mij een raadsel.....

Ik heb bovenstaande code niet getest ofzo, en ik ben ook niet zeker of BCB een 'is' operator kent, maar ik denk wel dat je genoeg tips hebt gekregen om verder te kunnen. ;) Die Controls collectie bestaat in ieder geval.

[ Voor 22% gewijzigd door whoami op 20-02-2003 11:55 ]

https://fgheysels.github.io/


  • Dikkie
  • Registratie: Oktober 2000
  • Laatst online: 09:11
code:
1
2
3
4
5
6
7
8
9
10
11
12
for (i = 0; i < 20 ; i++)
{
     if (CheckBox[i]->Checked)
     {
          sData += "1";
     }
     else
     {
          sData += "0";
     }
}
}

  • whoami
  • Registratie: December 2000
  • Nu online
dikkiedik schreef op 20 February 2003 @ 11:55:
code:
1
2
3
4
5
6
7
8
9
10
11
12
for (i = 0; i < 20 ; i++)
{
     if (CheckBox[i]->Checked)
     {
          sData += "1";
     }
     else
     {
          sData += "0";
     }
}
}


Sorry, maar dit is een nietszeggende reply. Iedereen kan wat code tikken, post minstens uitleg bij die code. (Trouwens, zolang je die CheckBox array niet declareert en opvult, zal het niet werken).

https://fgheysels.github.io/


Verwijderd

Topicstarter
maar nu is het probleem nog neit opgelost want ik moet nog steeds kunnen zeggen
is Object Checked maar dat kan nu dus nog steeds niet want ik kan niet zoiets als

if (CheckBox[i]->Checked)

gebruiken, of zie ik dit verkeerd?

[ Voor 7% gewijzigd door Verwijderd op 20-02-2003 12:14 ]


  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 20 February 2003 @ 12:13:
maar nu is het probleem nog neit opgelost want ik moet nog steeds kunnen zeggen
is Object Checked maar dat kan nu dus nog steeds niet want ik kan niet zoiets als

if (CheckBox[i]->Checked)

gebruiken, of zie ik dit verkeerd?



Maar wat bedoel jij toch de hele tijd met die CheckBox[i]?

Zoals jij het aangeeft, is dat een array, en gaat ie het element op positie i nemen. Die array heb jij niet. Je moet dat niet zien als CheckBox1 of CheckBox2 ofzo.

Wat je kunt doen is:
code:
1
2
3
4
5
6
if(Controls[i] is TCheckBox )
{

  TCheckBox(Controls[i]).Checked = true;

}

https://fgheysels.github.io/


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Zoals whoami zegt werkt het niet zoals bij VB of php dat het zomaar een array wordt en ook variable variablen bestaan niet.

Loop zoals whoami voorsteld alle controls op je form af en kijk of ze TCheckBox zijn. Of gebruik de functie FindComponent om aan de hand van de naam de juiste CheckBox te krijgen.

We adore chaos because we like to restore order - M.C. Escher


  • Belgar
  • Registratie: Januari 2002
  • Laatst online: 17-08 22:31

Belgar

Archmaster ranzige code..

Kleine aanvulling. zet de checkboxes op een 'Panel'. Deze heeft ook de collectie en kan wat doelgerichter werken. Bovendien wordt het onderhoud wat makkelijker. Ook kun je de checkboxes plaatsen in een object array en toch een loop gebruiken.

Nog effiecienter is mischien een centrale functie aan OnChange te hangen en de array 'realtime' aanpassen.. ligt eraan wat het gebeuren moet doen.

...Als het maar werkt


Verwijderd

Topicstarter
miss kan ik het iets duidelijker maken. Ik kan het op de volgende manier doen

code
----------------------------------------------------------------
{
String sData;

{
if (CheckBox1->Checked)
{
sData += "1";
}
else
{
sData += "0";
}
}
{
if (CheckBox2->Checked)
{
sData += "1";
}
else
{
sData += "0";
}
}

enz. (t/m CheckBox20)

Maar dit is nogal omslachtig, het meot korter kunnen. Sorry als ik onduidelijk was.

  • whoami
  • Registratie: December 2000
  • Nu online
Wel, check alle bovenstaande replies.
Ik denk dat men het al duidelijk gemaakt heeft hoe je het kan doen. Heb je nu al eens in de help gekeken naar die Controls property? Heb je al gekeken hoe je at runtime het classtype van een object kunt bepalen? Weet je hoe je moet casten?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Nee, ik weet niet wat casten is . Ik ben pas een half jaartje met C++ bezig. Dus ik d8 miss kan iemand mij hier een duidelijk antwoord geven. het spijt me dat ik al die termen niet ken. :'(

  • whoami
  • Registratie: December 2000
  • Nu online
Verwijderd schreef op 20 februari 2003 @ 13:53:
Nee, ik weet niet wat casten is . Ik ben pas een half jaartje met C++ bezig. Dus ik d8 miss kan iemand mij hier een duidelijk antwoord geven. het spijt me dat ik al die termen niet ken. :'(


Doe dan misschien even minstens de moeite om de help te gebruiken die in BCB zit, die is zo uitgebreid.

Ik heb reeds in m'n voorbeeldje getoond hoe je moet casten:
code:
1
TCheckBox(Controls[i])

bv.

Kijk ook in de help eens naar de informatie over TForm::Controls of TPanel::Controls.
Kijk hoe je daar kunt doorloopen, kijk hoe je kunt nagaan of een bepaalde Control van het type TCheckBox ed....

Het antwoord is hier bijna kant en klaar reeds gegeven in dit topic.

https://fgheysels.github.io/


  • Belgar
  • Registratie: Januari 2002
  • Laatst online: 17-08 22:31

Belgar

Archmaster ranzige code..

als je het aantal geklikte checkboxes wil weten even wat pseudo:

functie MijnOnChange
if 'checked' (wordt uitgezet)
maak unchecked
aantal -1
else (wordt aangezet)
aantal +1
maak checked
endif

[ Voor 7% gewijzigd door Belgar op 20-02-2003 14:12 . Reden: buttons = checkboxes ]

...Als het maar werkt


Verwijderd

Topicstarter
Belgar schreef op 20 February 2003 @ 14:10:
als je het aantal geklikte checkboxes wil weten even wat pseudo:

functie MijnOnChange
if 'checked' (wordt uitgezet)
maak unchecked
aantal -1
else (wordt aangezet)
aantal +1
maak checked
endif
Het is niet de bedoeling hoeveel er aangeklikt zijn maar welke (welk nummer 1 t/m20). Anders had dat inderdaad gewerkt.

En btw ik ben al de heletijd in de help aan het zoeken maar kan daar niks nuttigs uithalen met mijn kennis.

  • whoami
  • Registratie: December 2000
  • Nu online
Kijk eens naar de code die ik hier al gepost heb.
Sorry, maar ik ga je niet bij het handje nemen.
Die code looped gewoon door alle controls, kijkt of ze van het type CheckBox zijn, en dan kan je iets doen. Wat dat iets is , laat ik aan jou over

https://fgheysels.github.io/


  • Xplosive
  • Registratie: April 2000
  • Laatst online: 12:18
Verwijderd schreef op 20 februari 2003 @ 13:48:
miss kan ik het iets duidelijker maken. Ik kan het op de volgende manier doen

code
----------------------------------------------------------------
{
String sData;

{
if (CheckBox1->Checked)
{
sData += "1";
}
else
{
sData += "0";
}
}
{
if (CheckBox2->Checked)
{
sData += "1";
}
else
{
sData += "0";
}
}

enz. (t/m CheckBox20)

Maar dit is nogal omslachtig, het meot korter kunnen. Sorry als ik onduidelijk was.
Als je het sneller wil doen moet je een array van checkboxen maken, dit kan volgens mij alleen runtime.
In de H file definieer je dan een pointer naar een checkbox , dus :
TCheckbox *checkbox[20];

In de c file kan je dan de checkboxen alsvolgt aanmaken:
checkbox[t] = new TCheckbox;
Vervolgens kan je heel makkelijk met een loop functie (door whoami gepost) alle checkboxen op true of false controleren.

  • whoami
  • Registratie: December 2000
  • Nu online
Die array moet je niet meer maken, aangezien die al bestaat, nl. de Controls collectie.
Als je dan nog eens alle checkboxen die je wilt doorlopen op een panel zet, dan hoef je slechts de Controls collectie van dat panel te doorlopen, zodat het nog wat sneller gaat. (Zie ook de post van Belgar)

https://fgheysels.github.io/


Verwijderd

Dit probleem kan voor een beginnend programmeur toch wel lastig zijn. Maar met onderstaand voorbeeld moet je er wel uit kunnen komen.
Plaats een button op een form.
Met deze button gaan we 20 checkboxes toevoegen.
Bij het onclick event van de button plaatsen we de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        TCheckBox *cbx;
        for(int i=1;i<=20;i++)
        {
                cbx = new TCheckBox(this);
                cbx->Name = "CheckBox" + IntToStr(i);
                this->InsertControl(cbx);
                cbx->Left = 250;
                cbx->Top = (i-1) * 20;
        };

}

Op zich zal dit niet al te veel moeilijkheden bezorgen.

Middels een 2e knop gaan we in op het daadwerkelijke probleem, casten en de controls/components array.

Bij de onclick van de tweede button plaatsen we de code:
code:
1
2
3
4
5
6
7
8
void __fastcall TForm1::Button2Click(TObject *Sender)
{
        String S = "";
        for(int i=0;i < this->ComponentCount;i++)
                if(dynamic_cast<TCheckBox *>(this->Components[i]) != NULL)
                        S += (dynamic_cast<TCheckBox *>(this->Components[i])->Checked) ? "1" : "0";
        ShowMessage(S);
}

Het maakt trouwens niet uit of je de checkboxes design- of runtime hebt toegevoegd want beiden worden gevonden mits op de juiste wijze aan de owner toegewezen.
We lopen via de components array van het form omdat we op die manier ook alle componenten, en dus controls, van eventuele childcontrols van hetzelfde form doorlopen.
We kijken of we het component kunnen casten naar een TCheckBox en als dit kan dan kijken we of de checkbox is gechecked. Zo ja, dan voegen we een 1 toe en zo niet dan een 0.

[ Voor 12% gewijzigd door Verwijderd op 22-02-2003 00:10 ]


Verwijderd

Topicstarter
Heel erg bedankt hvdberg het werkt perfect, en btw bedankt voor je begrip.
Pagina: 1