• Sábado 14 de Diciembre de 2024, 18:36

Autor Tema:  Guardar Componentes Creados En Tiempo De Ejecución  (Leído 4214 veces)

boheme

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Guardar Componentes Creados En Tiempo De Ejecución
« en: Miércoles 28 de Junio de 2006, 09:57 »
0
Hola a todos, os expongo mi problema:

Estoy creando una aplicación que permite al usuario crear e insertar en el formulario componentes en tiempo real (simplificando, imaginad que el usuario puede insertar en un área de trabajo botones, etiquetas, etc).

El usuario puede arrastrar y mover esos componentes al lugar que quiera, y el programa debe guardar la configuración de componentes, para que la próxima vez que arranque el prgrama los botones creados en tiempo real sigan ahí.

La información la voy guardando en un vector de estructuras, y cada estructura guarda información del tipo de elemento, posición (X,Y), tag y alguna información más dependiendo del tipo de elemento.

Mi pregunta es: ¿Cómo guardo ese vector de estructuras en disco, sabiendo que cada estructura puede tener un tamaño diferente?

Gracias, un saludo.

jesusH

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #1 en: Miércoles 28 de Junio de 2006, 13:57 »
0
Almacenalo en una base de datos y después lo recupera

boheme

  • Miembro activo
  • **
  • Mensajes: 28
    • Ver Perfil
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #2 en: Viernes 30 de Junio de 2006, 10:41 »
0
We, gracias, eso será básicamente lo que haga.

Un saludo!  :hola:

miguel16

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #3 en: Martes 15 de Agosto de 2006, 05:59 »
0
alguien puede decrime por favor.. como puedo agregar controloes en tiempo de ejecucion.?? por ejemplo kiero que al hacer clic se agreguen en mi formulario, la cantidad de labels que yo kiera eso es lo que necesito por favor ayudenme.. es imporante..  :)

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #4 en: Martes 15 de Agosto de 2006, 22:32 »
0
Brevemente, es algo asi:
  TLabel * L;
   L = new TLabel(this);
   L->Name = "MiEtiqueta";
   L->Caption = "Hola, como estas?";
  L->Parent = Label1->Parent; //Label1 ya existe.

Para su posterior manipulación:
 TLabel *Control;
 Control = (TLabel*) FindComponent("MiEtiqueta");
 Control->Caption = "cambio";
saludos.

miguel16

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #5 en: Miércoles 16 de Agosto de 2006, 22:38 »
0
:)  muchas gracias.. me funciona.. todo correctamente.. solo que no se porque pones this.. a que se debe eso???.. por favor si me lo podieras explicar estaria agradecido.. muchas gracias..

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #6 en: Jueves 17 de Agosto de 2006, 22:56 »
0
La palabra reservada "this" la entiendo como un parametro oculto que el compilador usa para que tu puedas llamar a propiedades y metodos de un objeto sin necesidad de hacer referencia -escrita o sintactica- del mismo.
Es decir, si tu escribes [color=clBlack;] dentro del cuerpo de una función miembro del objeto [Form1], se interpreta que [Color] es propiedad de [Form1] y te evitas escribir]...
Lo que hago con el parametro [this] es "anclar" el componente al Objeto Form1; sustituye this con Form1 y dara el mismo resultado;
escribe [this->] y se enlistan todos los miembros del objeto en cuestion...

Quiza no sea así en verdad, ya que no soy programador experto. Espero haber sido claro, y si no, como dijo cierto Maestro cuando ya no podia explicarnos el resultado de un planteamiento matemático:
  "... es palabra del Señor...  amen..." :whistling:


            SALUDOS :hola:

Vatoicc

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #7 en: Viernes 18 de Agosto de 2006, 00:05 »
0
Segun lo que yo vi en clase de programacion, this es un puntero a la misma clase.

Código: Text
  1.  
  2. void Form1::CualquierFuncion(TObject *Sender) //o cualquier otro parametro
  3. {
  4.    TLabel * L;
  5.    L = new TLabel(this);    
  6. }
  7.  
  8.  

al poner this dentro de una funcion de la clase Form1 estas apuntando a Form1

Código: Text
  1.  
  2. void OtraClase::CualquierFuncion(TObject *Sender) //o cualquier otro parametro
  3. {
  4.    TLabel * L;
  5.    L = new TLabel(this);    
  6. }
  7.  
  8.  

en esa funcion de OtraClase, estas apuntando a OtraClase.

Y sobre el codigo que puso TRod

Código: Text
  1.  
  2.  Brevemente, es algo asi:
  3. TLabel * L;
  4. L = new TLabel(this);
  5. L->Name = "MiEtiqueta";
  6. L->Caption = "Hola, como estas?";
  7. L->Parent = Label1->Parent; //Label1 ya existe.
  8.  
  9.  

no es necesario tener declara Label1, pues puedes usar como Parent a Form1
Código: Text
  1.  
  2.    L->Parent = Form1;
  3.    //o
  4.    L->Parent = this;
  5.  
  6.  
La paranoia es una vision mas sutil de la vida

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #8 en: Viernes 18 de Agosto de 2006, 03:04 »
0
Una curiosidad:

Si cambias L por MiEtiqueta, en las siguientes sentencias lo puedes seguir llamando como L?

miguel16

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #9 en: Sábado 19 de Agosto de 2006, 15:54 »
0
;)  MUCHISIMAS GRACIAS A TODOS SEGUN HE PODIDO ENTENDER.. THIS LO QUE AHCE ES DARME UNA REFERENCIA DE LA CLASE  ACTUAL.. NUEVAMENTE MUCHAS GRACIAS... !!!  :)

Vatoicc

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #10 en: Sábado 19 de Agosto de 2006, 20:54 »
0
Para Max_D

No se esta cambiando L por MiEtiqueta, recuerta que Name es una propiedad de TLabel.
Si te fijas cuando pones un nuevo componente en tiempo de diseño, builder automaticamente te escribe un puntero a tu objeto con el mismo nombre que la propiedad name.

y respondiendo a tu pregunta, no es que puedas seguirlo llamando L en las siguientes sentencias, DEBES llamarlo L, puesto que te marcaria el error de que no existe un objeto MiEtiqueta.

Con practica se entiende mejor, pues lo punteros siempren causan un dolor de cabeza, pero comprendiendolos bien, te sacan de problemas con mas facilidad
La paranoia es una vision mas sutil de la vida

Max_D

  • Miembro MUY activo
  • ***
  • Mensajes: 117
    • Ver Perfil
    • http://sitioteca.spaces.live.com/
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #11 en: Domingo 20 de Agosto de 2006, 20:40 »
0
Creo que ya entendi porque es asi. Gracias  :smartass:

miguel16

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #12 en: Sábado 26 de Agosto de 2006, 03:58 »
0
hola a todos ahora que he podido crear controles en tiempo de ejecucion puedo controlar sus propiedades.. pero como hago para controlar sus eventos??.. por ejemplo creo 5 botones y kiero q al hacer clic en uno de ellos me aparezca por ejemplo no se un mensaje.. lo q necesito es saber como controlo los eventos de los objetos creados en tiempo de ejecucion.. por faor agradecere su ayuda.. :D

Vatoicc

  • Miembro activo
  • **
  • Mensajes: 65
    • Ver Perfil
Re: Guardar Componentes Creados En Tiempo De Ejecución
« Respuesta #13 en: Domingo 27 de Agosto de 2006, 00:17 »
0
Pues es relativamente facil, si ya pudiste crear objetos en tiempo de ejecucion, y manipular sus propiedades, pues ya lo tienes.

Te puedes auxiliar de un TActionList para declarar las funciones, o por ejemplo si la funcion que ocupas es de OnMouseDownd, que lleva mas parametros aparte del Sender, tendras que declarar esa funcion manualmente.
O hacer un pequeño truco.
Pon un Conponente, el que sea, que tenga el evento que quieres manejar, vete a la pestaña de eventos en el inspector de objetos, y colocate en el evento (ej OnMouseDown), escribe un nombre para la funcion (ej FuncionTemporar), da un enter para que builder la declare automaticamente y escribe el codigo que quieras que realize. Despues de eso, puedes borrar el componente, pues ya no se ocupa, y la funcion ya queda declarada.

Despues de eso, en la parte del codigo donde creas tu objeto en tiempo de ejecucion, asignale la funcion que declaraste, y ya...
Código: Text
  1.  
  2. void __fastcall TForm1::FuncionTemporal(TObject *Sender,
  3.       TMouseButton Button, TShiftState Shift, int X, int Y)
  4. {
  5.    //Esta es la funcion que vas a asignar a tu objeto creado en tiempo
  6.    //de ejecucion
  7.    //Pon el codigo que quieras
  8.    ShowMessage( "funcion temporal" );
  9. }
  10. //---------------------------------------------------------------------------
  11.  
  12. void __fastcall TForm1::FormCreate(TObject *Sender)
  13. {
  14.    //Aqui es donde creas el objeto en tiempo de ejecucion
  15.    TLabel *Prueba = new TLabel(this);
  16.    Prueba->Parent = this;
  17.    Prueba->Caption = "vatoicc";
  18.    Prueba->OnMouseDown = FuncionTemporal;
  19. }
  20. //---------------------------------------------------------------------------
  21.  
  22.  

Eso funciona para todos los componentes, incluso los que pones en tiempo de diseño.

te adjunto un ejemplo con un TButton y un TLabel
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.
La paranoia es una vision mas sutil de la vida