Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Vector de componentes (https://www.clubdelphi.com/foros/showthread.php?t=74142)

odiseeus 01-06-2011 12:38:44

Vector de componentes
 
quisiera saber si se puede hacer un vector de componentes, :confused: me haré entender mejor.
normalmente uno tiene tantos componentes como vaya colocando, pero si yo quiero que se hagan tantos componentes como fueran necesarios segun datos ingresados...
Ejemplo:
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
... Sucesivamente

pero se puede hacer de alguna manera que quedara como:

TLabel Label[10];

en este caso serian 10 Label, pero entonces se crearían según necesidad de los datos a ingresar como:

TLabel Label[variable];

aunque con las variables se puede usar el new, no se si se pueda algo parecido con las formas, no se si la idea que tengo se pueda realizar, o lo mas aproximado posible.

Gracias!

Ñuño Martínez 01-06-2011 13:18:47

Leo la siguiente frase:
Cita:

Empezado por odiseeus (Mensaje 402158)
aunque con las variables se puede usar el new, no se si se pueda algo parecido con las formas

Si me quedara sólo con ella, respondería que lo que te pasa es que todavía no sabes programar en C++ porque no has comprendido los conceptos de clase, tipo, objeto, objeto de clase, variable, referencia y puntero. Te recomendaría que te olvides por un tiempo de Builder y te empapases con un buen libro de programación en C++ (te recomiendo autores como Herbert Schildt y Luís Joyanes, y los libros de la editorial Anaya pero ojo sólo los de los años noventa, porque los últimos no me gustan nada). Aun así te propongo una posible solución.

Por lo que sé, Builder también usa VCL, por lo que debería funcionar algo así (ojo, que lo hago de memoria y no tengo Builder para probarlo, de hecho nunca lo he usado así que no estoy seguro de cómo define los métodos y las propiedades):
Código:

/* Añadir un label al formulario. */
  int MiFormulario::AnnadeLabel (char *TextoLabel)
  {
    TLabel *Objeto;

  // Ahora no recuerdo cuál es el método para añadir componentes a un TForm,
  // y no me apetece buscarlo.
    this->addComponent (Objeto = new TLabel (this));
  // Voy a suponer que usa un patrón "get/set" para las propiedades.
    Objeto->setCaption (TextoLabel);
    Objeto->setParent (this->PanelDeEtiquetas);
    Objeto->Tag = this->CuentaElementos++;
  // Ya no recuerdo cómo es la clase string, pero esto debería funcionar.
    Objeto->setName ((string)("etiqueta") + itostr (Objeto->Tag));
    return Objeto->Tag;
  }

En principio no necesitas almacenar las referencias en ningún lugar, y que la clase TForm incluye la capacidad de almacenarlas por ti y eliminará los objetos cuando corresponda.

Si necesitas obtener un objeto concreto, accede a la lista de componentes de TForm (supongo que en Builder también lo implementan) y busca por nombre o por Tag.

[edito] Acaba de ocurrírseme que puedes usar realloc.

escafandra 01-06-2011 21:10:01

Pongamos un ejemplo sencillo:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TLabel* L = new TLabel(this); // Creamos y asignamos el Owner
    L->Left = 0;
    L->Top = 0;
    L->Caption = "Label";
    L->Parent = this; // Asignamos el Parent
}

AOwner: Se encargará de destruir el nuevo componente.
Parent: La ventana donde se mostrará el nuevo componente.

Puede interesarte que la VCL tiene también la Clase TList, una clase para manejar arrays de punteros.

Saludos.

odiseeus 06-06-2011 10:47:33

la verdad no me deja nada claro, mejor dicho, como seria el metodo para crear n cantidad de componentes Edit segun sea necesario... un componente dinamico, gracias!

ejemplo: si necesitara tomar los nombres de ciudades visitadas y en componente Edit ingresaran una cantidad, ejemplo 6 a continuacion mostrara 6 componenetes Edit para ingresar en cada uno un nombre de ciudad, y en la siguiente ejecucion fueran 8 mostrara los 8 componentes necesarios, pero que no haya necesidad de hacerlos uno a uno si depronto se llegan a necesitar mas o menos no sea problema!...gracias por la colaboracion!

ecfisa 06-06-2011 11:08:04

Hola.

No entendí bien lo que preguntaste en tu primer mensaje. Pero ahora, luego de leer el segundo, me parece que es lo que te contesto escafandra.

Por ejemplo:
Código:

void __fastcall TForm1::CrearEdits(int Cant)
{
 for(int i=0;i < 10; i++) {
    TEdit *TE = new TEdit(this);
    TE->Left = 8;
    TE->Top = i*30+20;
    TE->Name = "Edit"+IntToStr(i+1);
    TE->Parent = this;
  }
}


Ejemplo de llamada que crea 10 TEdit:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  CrearEdits(10);
}

Si no es eso, realmente no interpreto que buscas hacer.

Saludos.

odiseeus 06-06-2011 11:21:40

que pena no haberme hecho entender bien desde un principio, pero es exactamente como lo explicaste ecsifa... muchas gracias!... completamente útil tu colaboración!... Gracias!

odiseeus 06-06-2011 11:46:24

que pena preguntar tanto, pero después de varios y distintos intentos a lo cual no he podido, como se hace para eliminar o destruir los mismos componentes creados en la explicación anterior? gracias.

escafandra 06-06-2011 11:53:13

Cita:

Empezado por odiseeus (Mensaje 402714)
que pena preguntar tanto, pero después de varios y distintos intentos a lo cual no he podido, como se hace para eliminar o destruir los mismos componentes creados en la explicación anterior? gracias.

Quizás no leíste detenidamente mi mensaje:
Cita:

Empezado por escafandra (Mensaje 402242)
Pongamos un ejemplo sencillo:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TLabel* L = new TLabel(this); // Creamos y asignamos el Owner
    L->Left = 0;
    L->Top = 0;
    L->Caption = "Label";
    L->Parent = this; // Asignamos el Parent
}

AOwner: Se encargará de destruir el nuevo componente.
Parent: La ventana donde se mostrará el nuevo componente.

Resumo: si al crear el nuevo componente lo creas con el parámetro AOwner como el formulario contenedor, será éste el que se encargue de la destrucción cuando el formulario se destruya.

Saludos.

odiseeus 07-06-2011 10:17:41

ok el owner se encarga eliminar los componentes al terminar la ejecución del formulario! (entendido)... pero si se crean en tiempo de ejecución, como destruyo esos mismos en tiempo de ejecución?, sin ser necesario finalizar el formulario. gracias!

ecfisa 07-06-2011 14:22:58

Hola odiseeus.

Una forma puede ser:
Código:

...
TObjectList *ObjLst = new TObjectList;

void __fastcall TForm1::CrearEdits(int Cant)
{
 for(int i=0;i < 10; i++) {
    TEdit *TE = new TEdit(this);
    TE->Left = 8;
    TE->Top = i*30+20;
    TE->Name = "Edit"+IntToStr(i+1);
    TE->Parent = this;
    ObjLst->Add(TE);
  }
}

void __fastcall TForm1::btnCrearClick(TObject *Sender)
{
  CrearEdits(10);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnLiberarClick(TObject *Sender)
{
  ObjLst->Free();
}
...

Saludos.

odiseeus 08-06-2011 06:31:26

nuevamente mil gracias! ecfisa, siempre he dicho que es grandioso tener un conocimiento, pero realmente ingenioso es saberlo trasmitir!... y en este foro si que lo saben hacer!.. mil gracias de nuevo!.. éxitos!

odiseeus 09-06-2012 22:50:13

hola de nuevo, una preguntas mas, si quiero acceder a una de las propiedades de los Edit creados en el ejemplo anterior, como seria, pues no puedo colocar ej:

Código:

Edit1->Text = "texto1";
Edit2->Text = "texto2";
...
//n cantidad de Edit creados.... como se hace?

espero haberme explicado bien, Gracias :)

ecfisa 09-06-2012 23:45:27

Hola odiseeus.

Podes acceder por el método FindComponent, por ejemplo:
Código:

void __fastcall TForm1::Button1Click(TObject *Sender) {

/* Forma 1 (recomendada) */
TEdit *e2 = static_cast<TEdit*>(FindComponent("Edit2"));
  e2->Text = "Texto 2";
  e2->Color = clMoneyGreen;

/* Forma 2 */
TEdit *e1 = ((TEdit*)FindComponent("Edit1"));
  e1->Text = "Texto 2";
  e1->Color = clSkyBlue;

/* a una propiedad */
((TEdit*)FindComponent("Edit3"))->Cursor = crHandPoint;
}

Saludos.


La franja horaria es GMT +2. Ahora son las 06:54:31.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi