Ir al contenido



Foto

Mostrar GroupBox varias veces

Groupbox Loop Arreglo Citas Duda

  • Por favor identifícate para responder
2 respuestas en este tema

#1 omanzano04

omanzano04

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 12 mayo 2019 - 02:07

Hola buen día. Ya hice búsquedas por todo el foro y en otros y no logré encontrar algo similiar a lo que estoy haciendo, por ello pido de sus ayuda por favor.

Quiero hacer que en una pantalla se muestren las citas regresarás y las que están a tiempo.

Lo que hice fue que en un form puse un groupbox y sobre este puse label hora, label Paciente, label Doctor y me gustaría que este groupbox se duplique n veces de acuerdo a la cantidad de citas claro que en las propiedades caption de cada label se actualice la información por cita.

Ejemplo práctico no codigo por qué no tengo la pc a la mano y soy nuevo en delphi.
Cantidad de citas 5

Groupbox1
1 10:30 Oscar Manzano Doctor Javier Palacios

Cómo hay más citas el mismo Groupbox se duplique pero con la información de la otra cita
Groupbox1
2 11:30. Alejandro Pérez. Doctor Enrique Bermúdez

Y así en un loop que sea detenido por las citas extraídas desde la base de datos.

Espero me puedan ayudar y de antemano muchas gracias
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.260 mensajes
  • LocationArgentina

Escrito 12 mayo 2019 - 09:35

¡Bienvenido a Delphi Access omanzano04! Espero que esta comunidad se convierta en tu 2do hogar.

 

Espero que sepas disculpar, pero he movido tu hilo a un foro más apropiado, ya que tu duda no es de Base de Datos sino de Delphi.

 

Creo entender tu problema. Necesitas crear tantos groupbox como citas tengas almacenadas en la base de datos.

 

Es posible crear GroupBox, y/o cualquier otro componente, en tiempo de ejecución. Lo importante es tener presente quien será el control/componente que lo almacenará y en la forma en como se dispondrá dentro de éste y por sobre todo considerar la posibilidad de que la cantidad supere el espacio visual disponible.

 

Hay varias formas de realizar esto. Y puede que no necesariamente exista una única "mejor". Detallo mi propuesta por pasos:

 

1. Crea un Frame y poner en éste lo que contendrá la info de cada cita. En tu caso sería un GroupBox con unos labels. Puedes darle el diseño a tu gusto. El Frame, visualmente actúa como un Formulario pero en escencia es una plantilla y fue pensado justamente para usarse como una. La idea es crear esta plantilla y poner tantas como uno necesita.

Para crear un frame: File -> New -> Other. En la pestaña Delphi Files selecciona VCL Frame. Por último presiona en aceptar.

 

2. Una vez que ya tengas diseñado tu Frame "plantilla" a gusto (y guardado) Ve al formulario/control/componente en el que deseas visualizar tus citas.Agrega en éste un TScrollBox. Dale el tamaño, alineación y ubicación que requieras. Este control será en donde se vayan creando y visualizando tus frames. ¿Porqué el TScrollBox? Este componente te permitirá generar una barra de desplazamiento en cuanto la cantidad de items que disponga sea mayor que la capacidad de visualización. Configura el resto de las propiedades como requieras para que se adapte a tu diseño y necesidades.

 

3. Por último crear los frames.

Tradicionalmente uno crea los frames yendo a la paleta de componentes "Standard" y luego seleccionando el tipo de frame de la lista, y por último haciendo clic en el control "contenedor". Pero necesitamos en este caso que sea en tiempo de ejecución.

 

Antes que nada, ve a la sección "uses" del form, y agrega el nombre de la unidad que se corresponde al frame. Al añadir la unidad podremos hacer uso de cualquier cosa que tenga definida.

 

Para crear nuestra plantilla hacemos algo como esto:


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var frm: TFrame2;
  3. var i: integer;
  4. begin
  5. for i := 1 to 10 do
  6. begin
  7. frm := TFrame2.Create(ScrollBox1);
  8.  
  9. frm.Name := 'frm' + IntToStr(i);
  10. frm.GroupBox1.Caption := 'Cita: ' + IntToStr(i);
  11.  
  12. frm.Parent := ScrollBox1;
  13. frm.Align := alTop;
  14. end;
  15. end;

Este es un ejemplo muy burdo. Observa que primero creo, le asigno el nombre (fundamental que sea único), le asigno un padre (el ScrollBox en este ejemplo) y por simple comodidad hago que se alinee dentro del ScrollBox con el valor "alTop". Con esto consigo que se vaya haciendo una pila, y estará el último frame creado arriba, y el primero en la base (al final).

 

Notarás que en el Create() le paso como parámetro el ScrollBox también. Con esto le indico quién será el dueño. El dueño y el Padre (Owner y Parent, en inglés) no son lo mismo. Dueño hace sentido de pertenencia de creación y destrucción de los objetos, mientras que el de Parentesco (Padre) hace referencia al objeto que lo contiene visualmente.

En ocasiones, en la mayoría de las situaciones, el dueño y padre es el mismo, pero no siempre esto será así. Puede incluso que no se le designe Dueño, pasándole como parámetro el valor nil que significa nulo.

El hacer que el dueño sea nulo hace que seamos nosotros mismos, como programadores, quienes asumamos el control y responsabilidad de indicar cuando liberar los objetos creados. Ten presente que todo ocupa memoria, lo que se crea, en algún momento se tiene que liberar. Al darle un dueño, le indicamos a ese componente (el ScrollBox en este ejemplo) que cuando se libere, haga el trabajo de liberar los controles que le pertenecen.

Notarás que el siguiendo este ejemplo, el Form es el máximo dueño y padre de todo lo que se disponga en él.

 

Si quisieramos liberar nuestras propias creaciones, a nuestro conveniencia, y en cuanto quisieramos lo ideal es tener nuestra propia lista de componentes. Para ello tenemos a TOjectList y/o ComponentList que nos facilita el trabajo. El primero es el más genérico, y está pensado para almacenar objetos. Mientras que el segundo es específico para objetos de la clase TComponent, que es la clase base de la cual heredan todos los componentes visuales.

 

Dejo una muestra para que estudies como sería en el caso de una creación en la cual nosotros somos dueños:


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var frm: TFrame2;
  3. var i: integer;
  4. begin
  5. lista := TcomponentList.Create;
  6.  
  7. for i := 1 to 10 do
  8. begin
  9. frm := TFrame2.Create(nil);
  10.  
  11. frm.Name := 'frm' + IntToStr(i);
  12. frm.GroupBox1.Caption := 'Cita: ' + IntToStr(i);
  13.  
  14. frm.Parent := ScrollBox1;
  15. frm.Align := alBottom;
  16.  
  17. lista.Add(frm);
  18. memo1.Lines.Add('Agregando #' + IntToStr(i))
  19. end;
  20.  
  21. memo1.Lines.Add('Cantidad total: ' + IntToStr(lista.Count))
  22. end;
  23.  
  24. procedure TForm1.Button2Click(Sender: TObject);
  25. var i: integer;
  26. var frm: TFrame2;
  27. begin
  28. for i := lista.Count - 1 downto 0 do
  29. begin
  30. lista[i].Free;
  31. memo1.Lines.Add('liberando #' + IntToStr(i));
  32. end;
  33. memo1.Lines.Add('Cantidad restante: ' + intToStr(lista.Count));
  34. end;

Donde lista es una variable que está definida en el form:


delphi
  1. TForm1 = class(TForm)
  2. ScrollBox1: TScrollBox;
  3. Button1: TButton;
  4. Button2: TButton;
  5. Memo1: TMemo;
  6. procedure Button1Click(Sender: TObject);
  7. procedure Button2Click(Sender: TObject);
  8. private
  9. { Private declarations }
  10. public
  11. { Public declarations }
  12. lista: TComponentList;
  13. end;

Sugiero que busques en el foro sobre creación de objetos en tiempos de ejecución, y frames. Es un tema ya discutido ampliamente. Y si eres nuevo con Delphi te recomendaría que pases a nuestros foros de Manuales y Tutoriales. Encontrarás mucho material que te será de ayuda para ir aprendiendo. Pero por sobre todo recomiendo la lectura de un libro que si bien parecerá ya algo anticuado por ser de una versión vieja de Delphi, sus bases siguen sólidas. Lo que cambiará será el nombre de alguna que otra propiedad y de algunas clases. El libro es el mundialmente conocido "La Cara Oculta de Delphi 4". Está disponible libre al público para descarga en muchos sitios.

 

Y por supuesto, puedes seguir preguntando aquí. No es ninguna molestia en ayudar.

Espero que se me haya entendido. Comentanos tus avances, y dudas.

 

Saludos,


  • 0

#3 omanzano04

omanzano04

    Newbie

  • Miembros
  • Pip
  • 4 mensajes

Escrito 14 mayo 2019 - 10:45

¡Bienvenido a Delphi Access omanzano04! Espero que esta comunidad se convierta en tu 2do hogar.

Espero que sepas disculpar, pero he movido tu hilo a un foro más apropiado, ya que tu duda no es de Base de Datos sino de Delphi.

Creo entender tu problema. Necesitas crear tantos groupbox como citas tengas almacenadas en la base de datos.

Es posible crear GroupBox, y/o cualquier otro componente, en tiempo de ejecución. Lo importante es tener presente quien será el control/componente que lo almacenará y en la forma en como se dispondrá dentro de éste y por sobre todo considerar la posibilidad de que la cantidad supere el espacio visual disponible.

Hay varias formas de realizar esto. Y puede que no necesariamente exista una única "mejor". Detallo mi propuesta por pasos:

1. Crea un Frame y poner en éste lo que contendrá la info de cada cita. En tu caso sería un GroupBox con unos labels. Puedes darle el diseño a tu gusto. El Frame, visualmente actúa como un Formulario pero en escencia es una plantilla y fue pensado justamente para usarse como una. La idea es crear esta plantilla y poner tantas como uno necesita.
Para crear un frame: File -> New -> Other. En la pestaña Delphi Files selecciona VCL Frame. Por último presiona en aceptar.

2. Una vez que ya tengas diseñado tu Frame "plantilla" a gusto (y guardado) Ve al formulario/control/componente en el que deseas visualizar tus citas.Agrega en éste un TScrollBox. Dale el tamaño, alineación y ubicación que requieras. Este control será en donde se vayan creando y visualizando tus frames. ¿Porqué el TScrollBox? Este componente te permitirá generar una barra de desplazamiento en cuanto la cantidad de items que disponga sea mayor que la capacidad de visualización. Configura el resto de las propiedades como requieras para que se adapte a tu diseño y necesidades.

3. Por último crear los frames.
Tradicionalmente uno crea los frames yendo a la paleta de componentes "Standard" y luego seleccionando el tipo de frame de la lista, y por último haciendo clic en el control "contenedor". Pero necesitamos en este caso que sea en tiempo de ejecución.

Antes que nada, ve a la sección "uses" del form, y agrega el nombre de la unidad que se corresponde al frame. Al añadir la unidad podremos hacer uso de cualquier cosa que tenga definida.

Para crear nuestra plantilla hacemos algo como esto:


delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var frm: TFrame2;
  3. var i: integer;
  4. begin
  5. for i := 1 to 10 do
  6. begin
  7. frm := TFrame2.Create(ScrollBox1);
  8.  
  9. frm.Name := 'frm' + IntToStr(i);
  10. frm.GroupBox1.Caption := 'Cita: ' + IntToStr(i);
  11.  
  12. frm.Parent := ScrollBox1;
  13. frm.Align := alTop;
  14. end;
  15. end;

Este es un ejemplo muy burdo. Observa que primero creo, le asigno el nombre (fundamental que sea único), le asigno un padre (el ScrollBox en este ejemplo) y por simple comodidad hago que se alinee dentro del ScrollBox con el valor "alTop". Con esto consigo que se vaya haciendo una pila, y estará el último frame creado arriba, y el primero en la base (al final).

Notarás que en el Create() le paso como parámetro el ScrollBox también. Con esto le indico quién será el dueño. El dueño y el Padre (Owner y Parent, en inglés) no son lo mismo. Dueño hace sentido de pertenencia de creación y destrucción de los objetos, mientras que el de Parentesco (Padre) hace referencia al objeto que lo contiene visualmente.
En ocasiones, en la mayoría de las situaciones, el dueño y padre es el mismo, pero no siempre esto será así. Puede incluso que no se le designe Dueño, pasándole como parámetro el valor nil que significa nulo.
El hacer que el dueño sea nulo hace que seamos nosotros mismos, como programadores, quienes asumamos el control y responsabilidad de indicar cuando liberar los objetos creados. Ten presente que todo ocupa memoria, lo que se crea, en algún momento se tiene que liberar. Al darle un dueño, le indicamos a ese componente (el ScrollBox en este ejemplo) que cuando se libere, haga el trabajo de liberar los controles que le pertenecen.
Notarás que el siguiendo este ejemplo, el Form es el máximo dueño y padre de todo lo que se disponga en él.

Si quisieramos liberar nuestras propias creaciones, a nuestro conveniencia, y en cuanto quisieramos lo ideal es tener nuestra propia lista de componentes. Para ello tenemos a TOjectList y/o ComponentList que nos facilita el trabajo. El primero es el más genérico, y está pensado para almacenar objetos. Mientras que el segundo es específico para objetos de la clase TComponent, que es la clase base de la cual heredan todos los componentes visuales.

Dejo una muestra para que estudies como sería en el caso de una creación en la cual nosotros somos dueños:

delphi
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var frm: TFrame2;
  3. var i: integer;
  4. begin
  5. lista := TcomponentList.Create;
  6.  
  7. for i := 1 to 10 do
  8. begin
  9. frm := TFrame2.Create(nil);
  10.  
  11. frm.Name := 'frm' + IntToStr(i);
  12. frm.GroupBox1.Caption := 'Cita: ' + IntToStr(i);
  13.  
  14. frm.Parent := ScrollBox1;
  15. frm.Align := alBottom;
  16.  
  17. lista.Add(frm);
  18. memo1.Lines.Add('Agregando #' + IntToStr(i))
  19. end;
  20.  
  21. memo1.Lines.Add('Cantidad total: ' + IntToStr(lista.Count))
  22. end;
  23.  
  24. procedure TForm1.Button2Click(Sender: TObject);
  25. var i: integer;
  26. var frm: TFrame2;
  27. begin
  28. for i := lista.Count - 1 downto 0 do
  29. begin
  30. lista[i].Free;
  31. memo1.Lines.Add('liberando #' + IntToStr(i));
  32. end;
  33. memo1.Lines.Add('Cantidad restante: ' + intToStr(lista.Count));
  34. end;

Donde lista es una variable que está definida en el form:

delphi
  1. TForm1 = class(TForm)
  2. ScrollBox1: TScrollBox;
  3. Button1: TButton;
  4. Button2: TButton;
  5. Memo1: TMemo;
  6. procedure Button1Click(Sender: TObject);
  7. procedure Button2Click(Sender: TObject);
  8. private
  9. { Private declarations }
  10. public
  11. { Public declarations }
  12. lista: TComponentList;
  13. end;

Sugiero que busques en el foro sobre creación de objetos en tiempos de ejecución, y frames. Es un tema ya discutido ampliamente. Y si eres nuevo con Delphi te recomendaría que pases a nuestros foros de Manuales y Tutoriales. Encontrarás mucho material que te será de ayuda para ir aprendiendo. Pero por sobre todo recomiendo la lectura de un libro que si bien parecerá ya algo anticuado por ser de una versión vieja de Delphi, sus bases siguen sólidas. Lo que cambiará será el nombre de alguna que otra propiedad y de algunas clases. El libro es el mundialmente conocido "La Cara Oculta de Delphi 4". Está disponible libre al público para descarga en muchos sitios.

Y por supuesto, puedes seguir preguntando aquí. No es ninguna molestia en ayudar.
Espero que se me haya entendido. Comentanos tus avances, y dudas.

Saludos,


Antes que nada muchas gracias por resolver mis dudas, pondré a practica sus consejos y más adelante le comento y comento lo que hice para apoyar a alguien que quizás tiene la misma duda que yo.

Si me lo permite me gustaría hacerle otra consulta, mi base la hice en firebird y eh leído distintas formas de conectarse y extraer información entonces me gustaría preguntar lo siguiente:

1 Cual sería la mejor opción de conectarme a mi base de datos eh leído varías pero me gustaría saber la opinión de ustedes, FireDac es la que mas recomiendan

2 cuáles serían los componentes que debo agregar a mi data modul por ejemplo database, dataset, mencionó estos por qué en los videos tutoriales siempre los usan pero no en todos por eso quisiera saber cuáles son los que debo usar.

3 tendrás un ejemplo de cómo puedo consultar el número de citas y guardarlo en una variable y sobre ello empezar a realizar la práctica, eh leído que debo conectarme a la base ejecutar consulta y cerrar la conexión pero no identifico el código, con un ejemplo entiendo muy rápido.

Por último, me gustaría que los datos de conexión por ejemplo servidor, usuario y contraseña se guarden en un archivo Ini, mi duda es como le digo a delphi que use esa conexión en el data modul si en el datamodul ya agregue otro elemento que se conecto a la base.

Quizás no debería hacer tantas preguntas y mejor ponerme a leer el libro, entiendo si nadie responde quizás no fue claro.de antemano muchas gracias por el apoyo.
  • 0