Avatar billede heyn Nybegynder
13. april 2007 - 10:58 Der er 9 kommentarer og
1 løsning

Hvordan opretter jeg et array af objekter.

Hej Eksperter

Jeg anvender c++Builder.
Jeg ønsker at oprette et array af labels i min form.
Problemet er at disse skal orettes runtime, og jeg kan ikke forud hvor mange der skal oprettes.

Har nogle en ide der peger i den rigtige retning?

Mvh Christian
Avatar billede heyn Nybegynder
13. april 2007 - 11:01 #1
Jeg vil altså oprette et array indeholdende pointere til objekter af klassen TLabel.
Avatar billede intel4004 Novice
13. april 2007 - 11:58 #2
Nu har jeg ikke arbejdet så meget med Borland C++ og Borland specifikke klasser. Men jeg mindes der var noget som hed en TList som man kunne bruge til et sådan formål.

Men i C++ generelt er der også andre metoder:

unsigned int antal_tlabels = 20;
TLabel* tlabels = new TLabel [antal_tlabels];

Du har nu dynamisk oprettet et array tlabels med 20 TLabels.

Mvh Intel4004
Avatar billede intel4004 Novice
13. april 2007 - 12:02 #3
Derefter skal de TLabels sikkert tilføjes en eksisterende TForm på en eller anden måde. Men jeg som sagt ikke så meget inde i Borland C++.
Avatar billede heyn Nybegynder
13. april 2007 - 13:37 #4
Jeg prøvede

unsigned int antal_tlabels = 20;
TLabel* tlabels = new TLabel[antal_tlabels];

Fejl: Default konstrukter findes ikke.
Kom i tanke om at normalt anvender 'this' altså<<.

unsigned int antal_tlabels = 20;
TLabel* tlabels = new TLabel(this)[antal_tlabels];

Fejl: Kan ikke omskrive TLabel til TLabel*

I mine øjne syntes det syntes at være noget med new og typer.
Avatar billede heyn Nybegynder
13. april 2007 - 13:39 #5
P.s. Man tildeler TLabel en form ved at redigere label->parent.
Avatar billede heyn Nybegynder
13. april 2007 - 14:18 #6
Du nævner at du ikke anvender Borland.
Hvilke andre grafiske compilere findes der, som man kan udvikle win-formularer med?
Avatar billede intel4004 Novice
13. april 2007 - 15:20 #7
Sorry jeg roddede lidt rundt det med pointer typen:

int i = 0;
unsigned int antal_tlabels = 20;
TLabel** tlabels = new TLabel* [antal_tlabels];

for (i = 0; i < antal_tlabels; i++)
{
  tlabels[i] = new TLabel(this);
}

Og herefter skulle det virke...

Mvh Intel4004
Avatar billede intel4004 Novice
13. april 2007 - 15:25 #8
Og til dit andet spørgsmål ang. C++ og udvikling af GUI-applikationer så kunne du evt kigge på wxwidgets (www.wxwidgets.org). Det er fuld framework/library til udvikling af GUI flader i C++ (det kan faktisk også meget andet, eksempelvis er der også et tråd-library). En af styrkerne er at det er platform uafhængigt (GUI virker på windows, linux, MAC). Jeg er ikke sikker på om Borland Runtime er det?

Mvh Intel4004
Avatar billede heyn Nybegynder
13. april 2007 - 18:22 #9
HURRA - Det virker.
Jeg er ikke helt sikker på om jeg forstår det med **. Jeg må undersøge det nærmere.

Ang. Widgets: Det ser spændende ud. Vil overveje det.

God weekend fra Christian.
Avatar billede intel4004 Novice
13. april 2007 - 21:49 #10
Jeg forstod heller ikke ** engang. Nu bruger jeg tit ***.

En variabel af type TLabel** er en pointer til en pointer til en TLabel. Kan også forstås som et array af pointere til TLabel.

Den første linie:
TLabel** tlabels = new TLabel* [antal_tlabels];

...allokerer plads plads til et vis antal af pointere til TLabel (en pointer skal jo også bruge plads). Vi har altså lavet et array af pointere. I C/C++ bruger man tit en pointer (med kun en enkelt *) til at lave dynamisk arrays. Man peger et sted i hukommelsen (element nummer 0) og derfra "offset'er" man så med et indeks (element nummer 1, 2 osv.) Hvert offset vil faktisk flytte sig det rigtige antal bytes i hukommelsen udfra pointer typen. Du har sikkert hørt at adressen på første element er selve array'ets navn. Det er det samme som intet offset overhovedet. Hele array'et ligger i et stort samlet område i hukommelsen.

Løkken:
for (i = 0; i < antal_tlabels; i++)
{
  tlabels[i] = new TLabel(this);
}

...sørger for at allokere de egentlige objekter.

Linien i løkken kunne også skrives som:
*(tlabels + i) = new TLabel(this); //her bruges "de-refference operatoren".

En anden sjov regel:

(*(*(tlabels + m))).parent
er det samme som
(*(tlabels + m))->parent
er det samme som
tlabels[m]->parent

Men ok - jeg har virkelig også fjollet meget rundt i de pointere i C :)

Mvh Intel4004

Tak for point
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester