Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Lazarus, FreePascal, Kylix, etc. (https://www.clubdelphi.com/foros/forumdisplay.php?f=14)
-   -   Varios Frames en un Formulario (https://www.clubdelphi.com/foros/showthread.php?t=89264)

mjjj 26-10-2015 14:47:40

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

AgustinOrtu 26-10-2015 15:07:31

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

mjjj 26-10-2015 15:32:29

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.

AgustinOrtu 26-10-2015 15:36:23

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---

mjjj 26-10-2015 15:45:38

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.

AgustinOrtu 26-10-2015 16:09:07

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

mjjj 26-10-2015 16:36:50

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

AgustinOrtu 26-10-2015 17:30:16

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

t-edson 26-10-2015 23:11:15

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.


La franja horaria es GMT +2. Ahora son las 17:08:19.

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