Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > Lazarus, FreePascal, Kylix, etc.
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 26-10-2015
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Varios Frames en un Formulario

Estimado, creo que este tema aplica no solo para Lazarus, pero ya que mi intención es una aplicación desarrollada en Lazarus para Linux (Raspbian) lo agrego aquí.

Tengo una formulario principal, con 2 TPanel, con la propiedad Align alTop y alClient respectivamente.
Además otro TFrame, con algunos componentes previamente configurado (Tedit, TLabe, etc.)

En tiempo de ejecución se realiza una consulta a una BD, y se creen tantos frames (previamente configurado) como registros devuelva la consulta, todos estos creados uno al lado del otro en el Panel del formulario principal.

Todos los frames creados deben ser independientes, ya que cada edit y label se cargará con los datos del query.

Como hago esto??

Saludos
Responder Con Cita
  #2  
Antiguo 26-10-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Creas el frame y lo "empotras" en un contenedor

Código Delphi [-]
var
  AFrame: TFrame;
begin
  AFrame := TFrame.Create(Self); // asumiendo self el form
  AFrame.Parent := Self; // parent indica en donde se va a visualizar un control. 
end;

Tambien podrias poner por ej. AFrame.Parent := Panel1, AFrame.Parent := GroupBox1, etc. Siempre y cuando sea un contendedor
Responder Con Cita
  #3  
Antiguo 26-10-2015
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Eso me funciona perfecto, pero tengo problemas con la posición, ya que la cantidad depende de los registros, y con ese código quedan todos en la misma posición... uno sobre otro.
La idea es que se distribuyan automaticamente dentro del contenedor... en mi caso un TPanel.
Estuve probando con Align := alleft, pero solo me quedan en una fila.

Quizás una solución es crear Paneles en runtime, en base al ancho del panel contender y el ancho del frame, e ir asignado el parent según los frames que existan previamente creados...
Es un poco engorroso... Alguna idea más sencilla??

Saludos.
Responder Con Cita
  #4  
Antiguo 26-10-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Si obvio, algun tipo de Align tenes que usar, sino te quedan uno encima de otro

Que tipo de layout queres crear? Uno abajo de otro?

Yo meteria un TScrollBox (asi se llamaba no?) y los iria metiendo todos los frames en ese scrollbox con Align = alTop

Te deberia quedar asi:

---Frame 1---
///////////////
//////////////
--Fin Frame 1---
---Frame ---
///////////////
//////////////
--Fin Frame 2---
Responder Con Cita
  #5  
Antiguo 26-10-2015
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
Por el tamaño del Frame me quedaría perfecto en filas y columnas... es decir, puede que quepan 3 o 4 por fila, y quizás 5 o 6 filas, pero todo esto depende del tamaño-resolución donde se ejecute l aplicación.
Otra cosa, como puedo eliminar todos los Frame en runtime??

Saludos.
Responder Con Cita
  #6  
Antiguo 26-10-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
En ves de un panel usa un TGridPanel para crear un layout fila/columnas

Si, agregalos a una lista asi no perdes la referencia al Frame
Responder Con Cita
  #7  
Antiguo 26-10-2015
mjjj mjjj is offline
Miembro
 
Registrado: mar 2007
Posts: 652
Poder: 18
mjjj Va por buen camino
No encontré ese componente en Lazarus 0.9
Estoy utilizando align en alTop, funciona, pero no es como quisiera...

Tengo otro problema, resulta que no puedo borrar los frames creados... adjunto el código

Código Delphi [-]
///   borrar todos los frames creados
for I := 0 to form1.ComponentCount -1 do
if form1.Components[i].ClassNameIs('TFrame1') then
(form1.Components[i] as TFrame1).Destroy;


for i :=1 to 3 do
begin
  frame := TFrame1.Create(nil);
  frame.Name:= 'frame'+inttostr(i);
  frame.Edit1.text := inttostr(i);
  frame.Parent := panel2;
  frame.Align:= altop;

  end

Espero me puedan ayudar.
Saludos
Responder Con Cita
  #8  
Antiguo 26-10-2015
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Varios puntos:

1. Por que preguntar si un objeto es tal clase utilizando strings? No es mejor hacer algo asi

Código Delphi [-]
  EsTFrame1 := UnFrame is TFrame1;

2. No recorras los componentes del form, recorre los controles ya que los frames los creaste en tiempo de ejecucion

3. La sentencia de destruccion:

a. No hace falta que castees a TFrame1 para llamar al metodo destroy
b. No uses destroy explicitamente, usa Free siempre que es mas seguro
c. No estas eliminando la referencia de la lista en cuestion. Lo mas correcto seria
d. Ahora que recuerdo, al eliminar de la lista hay que recorrerla en sentido inverso

Código Delphi [-]
///   borrar todos los frames creados
for I := form1.ControlCount - 1 downto 0 do
begin
  if form1.Controls[i] is TFrame1 then
  begin
    form1.Controls[i].Free;
    form1.Controls.Delete(i); // eliminarlo de la lista
  end;
end;

Con respecto a que el layout no es el esperado no puedo ayudarte mucho mas . Una pena que lazarus no tenga un componente tipo TGridPanel

Última edición por AgustinOrtu fecha: 26-10-2015 a las 17:34:52.
Responder Con Cita
  #9  
Antiguo 26-10-2015
t-edson t-edson is offline
Registrado
NULL
 
Registrado: oct 2015
Posts: 8
Poder: 0
t-edson Va por buen camino
Para ubicar los Frames en filas y columnas solo tienes que ajustar sus coordenadas:

Código Delphi [-]
  
  x:= (idx mod 5) * ancho;
  y:= (idx div 5) * alto;

donde "idx" es la cantidad de frames que estás insertando. Para este caso se crearán filas de 5 elementos.
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
Edición de formulario con varios campos vicens22 Desarrollo en Delphi para Android 0 19-12-2013 19:13:02
Ayuda relaciones de varios a varios TQueries j_flores3000 SQL 7 22-11-2008 21:43:40
Un formulario principal y varios secundarios en una aplicación noob OOP 6 25-09-2008 19:53:43
Linkar varios botones sobre un mismo formulario mieltxo HTML, Javascript y otros 5 25-01-2008 21:59:40
Varios forms, frames y un Data Module gluglu Varios 1 07-04-2005 19:28:51


La franja horaria es GMT +2. Ahora son las 03:02:24.


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