[C++]genummerde objecten

Pagina: 1
Acties:

  • De_Delph
  • Registratie: Juni 2002
  • Niet online
Ik ben bezig met een project waarin ik een x aantal objecten van het type TEdit wil creëeren om ze later te kunnen doorzoeken op een bepaalde property. Ik dacht slim te zijn door de pointers naar deze objecten in een list te zetten en wilde zo een loopje maken:

code:
1
2
3
4
5
for(i=0: i<=x: i++)
{
   TEdit *Edit;
   list.push_back(*Edit);
}


Hoe krijg ik het echter voor elkaar om een volgnummer achter '*Edit' te zetten?

You can't drive your house, but you can sleep in your car!


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17:52

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik snap je vraag niet echt, daarnaast ben je nu bogus waarden in je list aan het stoppen aangezien je je Edit variabele niet initialiseert. Ook snap ik niet waarom je Edit dereferencet aangezien je juist pointers in de lijst wilt hebben, niet de daadwerkelijke objecten waar die pointers naar wijzen

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.


  • De_Delph
  • Registratie: Juni 2002
  • Niet online
.oisyn schreef op donderdag 27 oktober 2005 @ 17:15:
Ik snap je vraag niet echt, daarnaast ben je nu bogus waarden in je list aan het stoppen aangezien je je Edit variabele niet initialiseert. Ook snap ik niet waarom je Edit dereferencet aangezien je juist pointers in de lijst wilt hebben, niet de daadwerkelijke objecten waar die pointers naar wijzen
Misschien had ik er bij moeten vertellen dat ik nogal n00bish ben op C++ niveau :P

Ik probeer van TEdit 100 objecten aan te maken. Daar moeten waardes in komen die een user kan wijzigen. Die waardes moeten wel worden gecontroleerd, en dat kan ook via TEdit->Text==goede waarde.
Mijn probleem is dat ik niet weet hoe ik objecten met een volgnummer aanmaak! Bv Edit1, Edit2, Edit3 enz.

[ Voor 24% gewijzigd door De_Delph op 27-10-2005 17:21 ]

You can't drive your house, but you can sleep in your car!


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Om kort te zijn: dat kan niet. Stel dat je Edit1, Edit2, ..., EditN gemaakt hebt. Om er een lijst van te maken, zul je expliciet ze aan een lijst toe moeten voegen, zoals:
code:
1
2
3
4
list.push_back(Edit1);
list.push_back(Edit2);
...
list.push_back(EditN);


Als je dat niet wilt, dan zul je moeten gaan bedenken of je soms de creatie en initialisatie van de elementen van de lijst uniform kan doen. Dan kan je dat in een loop verwerken:

code:
1
2
3
4
5
6
7
8
for(i=0; i <n; i++)
{
    TEdit *Edit = new TEdit(...);
     Edit->do_something();
     Edit->do_something2();

     list.push_back(Edit);
}

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:58
Als ik TEdit zie, dan denk ik aan VCL.
Als ik dan ook nog eens C++ zie, en VCL, dan is het C++ Builder.

Ik dacht -nu, ik ben het zeker- dat een 'container control' (zoals bv een form) een Controls property (oid) had, die alle controls die op die 'control' staan bevat.
Dat kan je dus gebruiken.

https://fgheysels.github.io/


  • De_Delph
  • Registratie: Juni 2002
  • Niet online
whoami schreef op donderdag 27 oktober 2005 @ 17:27:
Als ik TEdit zie, dan denk ik aan VCL.
Als ik dan ook nog eens C++ zie, en VCL, dan is het C++ Builder.

Ik dacht -nu, ik ben het zeker- dat een 'container control' (zoals bv een form) een Controls property (oid) had, die alle controls die op die 'control' staan bevat.
Dat kan je dus gebruiken.
Ik had wel wat duidelijker mogen zijn idd :/ Maar je hebt gelijk, het is C++ Builder 6 en TEdit is idd een VCL component. Maar nu snap ik jou even niet meer? Ligt waarschijnlijk aan mij though :/

Ik wilde eerst via het even OnCreate gewoon een lijstje.push.back(this) gebruiken, maar ik kon geen OnCreate vinden :S

[ Voor 12% gewijzigd door De_Delph op 27-10-2005 17:37 ]

You can't drive your house, but you can sleep in your car!


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:58
Ik snap eigenlijk totaal niet wat je met die TEdits wil doen ?
Je wil die dan toch ergens op je form gaan tonen ?

https://fgheysels.github.io/


  • De_Delph
  • Registratie: Juni 2002
  • Niet online
whoami schreef op donderdag 27 oktober 2005 @ 17:42:
Ik snap eigenlijk totaal niet wat je met die TEdits wil doen ?
Je wil die dan toch ergens op je form gaan tonen ?
Dat is wel de bedoeling ja! Zeg 100 TEdits tonen, en elke TEdit moet wel in een listje ge'push_back()'ed zijn.

You can't drive your house, but you can sleep in your car!


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:58
Die TEdits zitten trouwens dus zowiezo al in de Controls property van de control waar ze op staan (Panel, Form, whatever).

Die Controls property is een array, dus je kan ze mbhv die index gaan aanspreken.

[ Voor 34% gewijzigd door whoami op 27-10-2005 17:49 ]

https://fgheysels.github.io/


Verwijderd

Ik snap het probleem misschien niet helemaal maar:

kun je niet iets met een linked list? dus een struct of klasse (die erft van Tedit) waarin er een pointer is naar het volgende object in de list (als je andersom de lijst wil doorlopen misschien ook een pointer naar het vorige object). je hoeft dan alleen een pointer te hebben naar het begin van de lijst en de "volgende" van de laatste in de list is NULL. Doorlopen van zo'n lijst is een simpele while loop.

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

ik zou nooit een klasse laten erven van een andere om er dan een linked list van te maken...

list<TEdit*> moet al genoeg doen...

ASSUME makes an ASS out of U and ME


Verwijderd

Ik denk dat ik weet wat je wilt:
C++:
1
2
3
4
5
6
std::list<TEdit *> editLijstje;
for(int i=0; i<100; ++i) {
  TEdit* edt = new TEdit(this); // hier ga ik ervan uit dat je bijv in de constructor van een form deze code zet.
  edt->Visible = true;
  editLijstje.push_back(edt);
}

Of bedoel je heel wat anders?

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

Verwijderd schreef op donderdag 27 oktober 2005 @ 18:31:
Ik denk dat ik weet wat je wilt:
C++:
1
2
3
4
5
6
std::list<TEdit *> editLijstje;
for(int i=0; i<100; ++i) {
  TEdit* edt = new TEdit(this); // hier ga ik ervan uit dat je bijv in de constructor van een form deze code zet.
  edt->Visible = true;
  editLijstje.push_back(edt);
}

Of bedoel je heel wat anders?
Yikes. Exception safety? Leaks? Raw pointers... Wat als new throwed na 55 keer? Oh well, misschien zeur ik, maar dit soort dingen zorgen voor veel problemen later.

  • De_Delph
  • Registratie: Juni 2002
  • Niet online
okay nog even ter verduidelijking (ik krijg een hoop feedback, dank daarvoor!):
Dit is een stukje van de H-file
code:
1
2
3
4
5
6
__published:    // IDE-managed Components
        TEdit *Edit1;
        TEdit *Edit2;
        TEdit *Edit3;
        TEdit *Edit4;
        void __fastcall FormCreate(TObject *Sender);


Dit is de functie waar het allemaal om gaat:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        lijstje.push_back(Edit1);
        lijstje.push_back(Edit2);
        lijstje.push_back(Edit3);
        lijstje.push_back(Edit4);
        list<TEdit*>::iterator i;
        int z=0;
        for(i=lijstje.begin();i!=lijstje.end();i++)
        {
                (*i)->Text=z;
                z++;
        }


Edit1 geeft nu 0 weer, Edit2 geeft 1 weer, enz.
Ik wil de push_back()'s in een loopje hebben, anders typ ik me helemaal wezenloos (bij honderd TEdit's) plus dat het dan minder uitbreidbaar is.

You can't drive your house, but you can sleep in your car!


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
En dat kan dus niet (daar heb je een vorm van meta-programming voor nodig). Maar waarschijnlijk heeft jouw IDE de componenten al in een of andere lijst gezet, zoals al door enkelen eerder in dit topic opgemerkt.

[ Voor 15% gewijzigd door Infinitive op 27-10-2005 18:47 ]

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


  • De_Delph
  • Registratie: Juni 2002
  • Niet online
whoami gaf daar een voorbeeld van ja, alleen weet ik niet hoe ik dat in de praktijk zou moeten uitvoeren. Hoe doorloop je die array?

You can't drive your house, but you can sleep in your car!


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:58
Eh, zoals je gelijk welke andere array overloopt.
Heb je die property trouwens al eens bekeken ? 'k Ben er vrijwel zeker van dat er een voorbeeldje bij staat in de help.

https://fgheysels.github.io/


  • De_Delph
  • Registratie: Juni 2002
  • Niet online
whoami schreef op donderdag 27 oktober 2005 @ 20:07:
[...]


Eh, zoals je gelijk welke andere array overloopt.
Heb je die property trouwens al eens bekeken ? 'k Ben er vrijwel zeker van dat er een voorbeeldje bij staat in de help.
Ik bedoelde meer: welke property moet ik zijn?

You can't drive your house, but you can sleep in your car!


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:58
[TLG]Delphi schreef op donderdag 27 oktober 2005 @ 20:43:
[...]

Ik bedoelde meer: welke property moet ik zijn?
Zie de help zeg.
Ik heb trouwens de exacte naam al vernoemd.

https://fgheysels.github.io/


  • De_Delph
  • Registratie: Juni 2002
  • Niet online
whoami schreef op donderdag 27 oktober 2005 @ 21:15:
[...]


Zie de help zeg.
Ik heb trouwens de exacte naam al vernoemd.
Mijn spijt (en dank) is groot, ik zat even te slapen :) Dank iedereen voor het snel en begripvol reageren op deze toch wel n00bish vraag (geloof ik)

You can't drive your house, but you can sleep in your car!

Pagina: 1