Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-06-2011
odiseeus odiseeus is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 31
Poder: 0
odiseeus Va por buen camino
Talking Vector de componentes

quisiera saber si se puede hacer un vector de componentes, 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!
Responder Con Cita
  #2  
Antiguo 01-06-2011
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Leo la siguiente frase:
Cita:
Empezado por odiseeus Ver Mensaje
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine

Última edición por Ñuño Martínez fecha: 01-06-2011 a las 13:30:30.
Responder Con Cita
  #3  
Antiguo 01-06-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
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.
Responder Con Cita
  #4  
Antiguo 06-06-2011
odiseeus odiseeus is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 31
Poder: 0
odiseeus Va por buen camino
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!

Última edición por odiseeus fecha: 06-06-2011 a las 10:53:18.
Responder Con Cita
  #5  
Antiguo 06-06-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 06-06-2011 a las 11:11:10.
Responder Con Cita
  #6  
Antiguo 06-06-2011
odiseeus odiseeus is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 31
Poder: 0
odiseeus Va por buen camino
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!
Responder Con Cita
  #7  
Antiguo 06-06-2011
odiseeus odiseeus is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 31
Poder: 0
odiseeus Va por buen camino
Red face

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.
Responder Con Cita
  #8  
Antiguo 06-06-2011
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.197
Poder: 20
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por odiseeus Ver Mensaje
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 Ver Mensaje
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.
Responder Con Cita
  #9  
Antiguo 07-06-2011
odiseeus odiseeus is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 31
Poder: 0
odiseeus Va por buen camino
Question

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!
Responder Con Cita
  #10  
Antiguo 07-06-2011
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #11  
Antiguo 08-06-2011
odiseeus odiseeus is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 31
Poder: 0
odiseeus Va por buen camino
Smile

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!
Responder Con Cita
  #12  
Antiguo 09-06-2012
odiseeus odiseeus is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 31
Poder: 0
odiseeus Va por buen camino
Post

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
Responder Con Cita
  #13  
Antiguo 09-06-2012
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Cantidad de -A- en un vector luisito2011 Varios 9 13-05-2011 08:27:46
vector con timage einarcito Gráficos 1 20-09-2008 16:31:53
Guardar en un archivo el vector de componentes de una form Majo Varios 33 19-02-2004 19:28:51
Liberar un vector... Tanix PHP 6 28-08-2003 09:36:36
un vector de checkbox superhopi OOP 3 07-05-2003 16:42:34


La franja horaria es GMT +2. Ahora son las 01:58: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
Copyright 1996-2007 Club Delphi