• Viernes 4 de Octubre de 2024, 13:35

Autor Tema:  Generar DBEdit en tiempo de ejecución  (Leído 4710 veces)

avefenix1810

  • Miembro activo
  • **
  • Mensajes: 74
    • Ver Perfil
Generar DBEdit en tiempo de ejecución
« en: Jueves 21 de Julio de 2011, 22:27 »
0
Hola a todos

Trabajando con mi base de datos (encuesta familiar), llegue al punto donde tengo que mostrar los datos de cada registro en pantalla. Pues bien me gustaria poder ver en pantalla todos los datos de cada persona encuestada y llego al tema en que hay que mostrar los parientes que viven con la persona (esposa, hijo, hija, abuela, etc.), y como no todas las familias tienen la misma cantidad de integrantes mi pregunta es la siguiente: ¿se puede ver usando DBEdit?... creo que debería haber un forma de "generar" de acuerdo a la cantidad de parientes los DBEdit, es decir, ¿en tiempo de ejecucion?

Gracias por su ayuda.  :gracias:

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re:Generar DBEdit en tiempo de ejecución
« Respuesta #1 en: Miércoles 3 de Agosto de 2011, 04:17 »
0
Relativamente fácil.
Código: [Seleccionar]
TDBEdit *EditDinamico;
 EditDinamico = new TDBEdit(this);
 try{
  EditDinamico->Name="MiEdit1"; //Importante
  EditDinamico->Parent = this; //MUY IMPORTANTE
  EditDinamico->Left = 20; //Si no especificas posición... entonces dónde lo veo?
  EditDinamico->Top = 150;
 }
 catch(...){
  EditDinamico = NULL;
 }

Y pon atención a los nombres que le asignes a cada control. Podria ocurrir una tragedia con la memoria :scream:

:suerte:

avefenix1810

  • Miembro activo
  • **
  • Mensajes: 74
    • Ver Perfil
Re:Generar DBEdit en tiempo de ejecución
« Respuesta #2 en: Jueves 4 de Agosto de 2011, 04:37 »
0
Gracias TRod por el dato, voy a aplicarlo  :gracias:

avefenix1810

  • Miembro activo
  • **
  • Mensajes: 74
    • Ver Perfil
Re:Generar DBEdit en tiempo de ejecución
« Respuesta #3 en: Viernes 5 de Agosto de 2011, 17:30 »
0
Hola TRod

Hice lo que me indicaste, aunque no se si lo hice bien...  :think:

Como necesito agregar los datos de un nucleo familiar, lo primero que hago es ingresar los datos del jefe de familia, por ejemplo

Nombre             Apellido
Jose             Perez                  (aca tengo un boton)     Agregar otro

Pues bien... puse el código que me indicaste en el botón AGREGAR OTRO, cosa de que al apretar el botón se genere otro DBEdit, justo debajo de los anteriores, para ingresar los nuevos datos....  pero, NO ME RESULTO.

Me arroja lo siguiente:
[C++ Error] posicion.cpp(54): E2451 Undefined symbol 'TDBEdit'
[C++ Error] posicion.cpp(54): E2451 Undefined symbol 'EditDinamico'
[C++ Error] posicion.cpp(55): E2303 Type name expected
[C++ Error] posicion.cpp(55): E2379 Statement missing ;

¿ Podrías indicarme cual es el error?... Gracias

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re:Generar DBEdit en tiempo de ejecución
« Respuesta #4 en: Viernes 5 de Agosto de 2011, 21:56 »
0
 :yes: Disculpa. Omiti un detalle.
Debemos recordar que no todos los componentes VCL se encuentran definidos en vcl.h.
Incluye la cabecera:
#include <DBCtrls.hpp>
 :ball:

avefenix1810

  • Miembro activo
  • **
  • Mensajes: 74
    • Ver Perfil
Re:Generar DBEdit en tiempo de ejecución
« Respuesta #5 en: Lunes 8 de Agosto de 2011, 17:25 »
0
Gracias nuevamente TRod. Logré que funcionara, pero solo me permite agregar un TDBEdit, si aprieto nuevamente en botón arroja error ya que se esta creando un nuevo TDBEdit con el mismo nombre.

No se si estoy en lo correcto, pero creo que para cada TDBEdit nuevo que se quiera agregar, debo tener un boton con los nuevos datos,... la verdad no sé... voy a probar que resulta de eso.

 :gracias:

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re:Generar DBEdit en tiempo de ejecución
« Respuesta #6 en: Martes 9 de Agosto de 2011, 03:58 »
0
Así es. Por eso te mencione antes que hay que tener cuidado al definir los nombres (Name) de cada control creado.
 :think:
Creo que hay más trasfondo en este tema.

Puedes "jugar" un poco con la propiedad Name.

AnsiString NombreCualquiera = "MiControl";
Control->Name = NombreCualquiera;

Ahora bien, la solución más común en estos casos es utilizar una variable global que funcione como contador de controles:

int contador=0;
... <resto de tu codigo>
...
AnsiString NombreCualquiera = "MiControl";
Control->Name = NombreCualquiera + IntToStr(contador);
contador++;
.... <resto de tu codigo>

Eso va a provocar que el nombre del control sea distinto cada vez que mandes a llamar el evento.

Bien. Ahora surge el problema de las coordenadas en pantalla para posicionar cada control creado.
Ese trabajo sucio te lo dejo a ti. :kicking: ya que eso depende mucho del tipo de interfaz que estas diseñando en tu programa.
Y no olvides encerrar las intrucciones con la sentencia "try/catch". Los métodos de excepciones no son de broma. Funcionan muy bien a la hora de las metidas de pata de programador/usuario.

... y hasta ahí todo bien... pero ahora te toparas con el problema de como acceder a cada control que creaste.
Esperame. La solución te la posteo en unos momentos. Estoy un poco oxidado en programación :losiento: jejeje

TRod

  • Miembro MUY activo
  • ***
  • Mensajes: 108
  • Nacionalidad: mx
    • Ver Perfil
Re:Generar DBEdit en tiempo de ejecución
« Respuesta #7 en: Martes 9 de Agosto de 2011, 05:12 »
0
Para acceder a los DBEdit creados dinámicamente, irremediablemente tendras que hacer uso del método "FindComponent()"

TDBEdit *UnEditDinamico;
UnEditDinamico = (TDBEdit*)FindComponent("NombreMiControl");


Donde "NombreMiControl" es el nombre del componente al que deseas acceder a su contenido.

Te espera un poco de trabajo sucio. :lightsabre:

 :suerte:

avefenix1810

  • Miembro activo
  • **
  • Mensajes: 74
    • Ver Perfil
Re:Generar DBEdit en tiempo de ejecución
« Respuesta #8 en: Martes 9 de Agosto de 2011, 17:10 »
0
Gracias TRod... me queda super claro el tema.

Con respecto al posicionamiento eso ya lo tenia contemplado usando un par de variables (int posx, posy) puedo posicionar los elementos donde desee. También había pensado en variar un numero que acompañara al nombre del componente, pero no me atreví a hacerlo, ya que no sabia si concatenandolo funcionaría, pero por lo que dices .... si se puede  :jumpie:
Lo que señalas en el último post no lo sabia... voy a probar que sale de eso.

Muchas gracias. Estaba probando de todo y ya estaba un poco frustrado porque no me salia nada. Nuevamente.... GRACIAS  :gracias:


PD: Quiero utilizar componentes de Office en mi aplicación... ¿sabes algo de eso, o de algún tutorial que pueda leer?
« última modificación: Martes 9 de Agosto de 2011, 17:15 por avefenix1810 »