[ vko @ 02.02.2010. 15:30 ] @
Radim U borlandu
treba da postavim x komponenti (u mom sluchaju Label-a) na formu

TLabel *ime_labela = ne TLabel; ok... ali ako mi treba nekoliko komponenti a u razlichitim trenucima x se menja

muchim se vec dva dana, a hitno mi je
hvala
[ X Files @ 02.02.2010. 16:13 ] @
Mozes koristiti niz pointera tipa TLabel (ako znas koliko ces otprilike imati tih labela):
TLabel *pNizLabela[10];
... i kasnije kreiras dinamicki po zemlji, dodeljujes osobine, dogadjaje:
pNizLabela[0] = new ...


Malo napredniji nacin bi bio koriscenjem listi, recimo STL listi, na primer /netestirano/:
--- H ---
Code:

// ...
#include <vector>
using namespace std;
// ...
public:
   std::vector<TLabel*> VektorLabela;
// ...


--- CPP ---
Code:

// ...
#include <vector>
using namespace std;
// ...
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
   VektorLabela.push_back( new TLabel(this) );
   VektorLabela.push_back( new TLabel(this) );

   VektorLabela[0]->Parent = this;
   VektorLabela[0]->Left = 50;
   VektorLabela[0]->Top = 50;
   VektorLabela[0]->Caption = "Tekst 1";

   VektorLabela[1]->Parent = this;
   VektorLabela[1]->Left = 300;
   VektorLabela[1]->Top = 300;
   VektorLabela[1]->Caption = "Tekst 2";
}
// ...


Jedinstveni vektor za sve komponente, ne samo za TLabel bi se mogao ovako kreirati:
std::vector<TComponent*> VektorKomponenti;



... a trebalo bi da mozes upotrebiti i TList iz samog VCL-a.

Ima vise nacina, na tebi je da procenis sta ti najbolje odgovara.
[ vko @ 02.02.2010. 21:19 ] @
evo probao sam ovako
Code:
{
int i,n=10;
TLabel *label[n];
for(i=0;i<=n;i++)
{
label[i] = new TLabel(this);
label[i]->Parent=Form1;
label[i]->Top=50*i;
label[i]->Left=50;
label[i]->Caption="Text";
}

prijavljije greshku Constant expression required

a ovako radi
Code:
{
int i;
TLabel *label[10];
for(i=0;i<=n;i++)
{
label[i] = new TLabel(this);
label[i]->Parent=Form1;
label[i]->Top=50*i;
label[i]->Left=50;
label[i]->Caption="Text";
}
[ drki89 @ 02.02.2010. 21:22 ] @
Niz zahteva konstantan izraz kao argument. Probaj sa:
Code:

const int n=10;
.
.
.
TLabel *label[n];


Ili probaj sa dinamickim alociranjem prostora za niz pokazivaca.
[ vko @ 02.02.2010. 21:28 ] @
u tom sluchaju necu moci da menjam broj napravljenih labela pa mi dodje label[n] isto kao i label[10]
[ drki89 @ 02.02.2010. 21:34 ] @
Posto ti se broj x menja u toku izvrsenja programa mozes da definises pokazivac na niz pokazivaca, pa ces dinamicki moci da povecavas i smanjujes broj pokazivaca na labele.

Code:

int n;
Tlabel **label;
label = new Tlabel*[n];

for(int i=0;i<=n;i++) {
   label[i] = new TLabel(this);
   label[i]->Parent=Form1;
   label[i]->Top=50*i;
   label[i]->Left=50;
   label[i]->Caption="Text";
}


[Ovu poruku je menjao drki89 dana 02.02.2010. u 22:48 GMT+1]

[Ovu poruku je menjao drki89 dana 02.02.2010. u 22:48 GMT+1]
[ vko @ 02.02.2010. 22:08 ] @
Dosadan sam i sam sebi, ali me interesije zashto prijavljuje greshi pro izlazku iz programa sa kodom koji si napisao (drki89)
Invalid pointer operation
[ drki89 @ 02.02.2010. 22:16 ] @
Mislis sve odradi kako treba i onda na kraju prijavi gresku, ili nece da radi? Nisam proveravao kod.
[ vko @ 02.02.2010. 22:25 ] @
Radi kako bi i trebalo da radi, greshku prijavljuje pri napushtanju programa
tj na click dugmeta za exit u kome se nalazi samo Close();
[ drki89 @ 02.02.2010. 22:34 ] @
Nisam siguran sta bi moglo da bude problem... Mozda nisi izvrsio dealokaciju kako treba. Treba da prodjes kroz niz i dealociras svaki pokazivac iz niza i na kraju da dealociras pokazivac label.
Code:

for(int i=0;i<n;i++) delete label[i];
delete [] label;
label = 0;