Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Frames creados dinamicamente no se ven (https://www.clubdelphi.com/foros/showthread.php?t=72778)

duilioisola 11-03-2011 11:03:50

Frames creados dinamicamente no se ven
 
Hola a todos!

Tengo un formulario que tiene un panel llamado PNLFiltro.
Tengo un Frame llamado FRMFiltro que tiene un Label y unos Edits para rellenar los parámetros de filtrado.

Debo crear dinámicamente tantos filtros como índices tenga.

El problema es que los crea, pero no se ven.

Este es el procedimiento que utilizo para crearlos.

Código Delphi [-]
procedure TFMConsultaLotes.EFTipoLoteChange(Sender: TObject);
var
  tsCodigo, tsTitulo, tsIDIndice : TStrings;
  i : integer;
  aFiltro : TFRMFiltro;
begin
  inherited;
  ETituloTipoLote.Text := DMMain.DameTituloTipoLote(EFTipoLote.Text);

  {Aqui debe cargar los filtros}
  tsCodigo := TStringList.Create;
  tsTitulo := TStringList.Create;
  tsIDIndice := TStringList.Create;
  try
     DMMain.RellenaIndices(EFTipoLote.Text, tsCodigo, tsTitulo, tsIDIndice);
// ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** *****
// ***** AQUI EMPIEZA LO IMPORTANTE ** ***** ***** ***** ***** ***** *****
     //Primero borro los filtros anteriores
     with PNLFiltro do
     begin
        // La segunda vez pasa por aquí, por lo que se que se crean los frames
        for i := 0 to ComponentCount - 1 do
           if (Components[i] is TFRMFiltro) then
              Components[i].Free;
     end;

     // Ahora creo los frames con los filtros
     for i := 0 to tsCodigo.Count - 1 do
     begin
        aFiltro := TFRMFiltro.Create(PNLFiltro);
        aFiltro.CargaCampos(tsTitulo[i], StrToIntDef(tsIDIndice[i], 0));
        aFiltro.Align := alTop;
         // He probado con estas opciones, pero no reacciona
        aFiltro.Visible := True;
        aFiltro.Show;
        aFiltro.BringToFront;
     end;
     // Esto tampoco soluciona el problema
     PNLFiltro.Repaint;
// ***** AQUI TERMINA LO IMPORTANTE ** ***** ***** ***** ***** ***** *****
// ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** ***** *****
  finally
     tsCodigo.Free;
     tsTitulo.Free;
     tsIDIndice.Free;
  end;
end;

Ñuño Martínez 11-03-2011 12:02:41

Creo que no los dibuja porque no les dices dónde tienen que dibujarse. Le dices qué componente es el propietario ("Owner") en el constructor, pero después tienes que asignar la propiedad "Parent", que es donde dibujará el TFrame. Asumiendo que lo vas a dibujar en el mismo objeto que lo contiene, sería:
Código Delphi [-]
    aFiltro.parent := PNLFiltro;

El "Owner" únicamente se encarga de mantener al objeto, de destruirlo cuando convenga, pero no de dibujarlo.

duilioisola 11-03-2011 13:39:12

Es verdad!
Gracias Ñuñu... nunca lo hubiera adivinado...
Además, si creas más de uno, le debes asignar un nombre.

Al final queda así:

Código Delphi [-]
procedure TFMConsultaLotes.EFTipoLoteChange(Sender: TObject);
var
  tsCodigo, tsTitulo, tsIDIndice : TStrings;
  i : integer;
  aFiltro : TFRMFiltro;
begin
  inherited;
  ETituloTipoLote.Text := DMMain.DameTituloTipoLote(EFTipoLote.Text);

  {Aqui debe cargar los filtros}
  tsCodigo := TStringList.Create;
  tsTitulo := TStringList.Create;
  tsIDIndice := TStringList.Create;
  try
     DMMain.RellenaIndices(EFTipoLote.Text, tsCodigo, tsTitulo, tsIDIndice);
     //Primero borro los filtros anteriores
     with PNLFiltro do
     begin
        for i := ComponentCount - 1 downto 0 do
           if (Components[i] is TFRMFiltro) then
              Components[i].Free;
     end;

     // Ahora creo los frames con los filtros
     for i := 0 to tsCodigo.Count - 1 do
     begin
        // Creo una nueva instancia del Frame.
        // Se crea con un nombre generico y sin Parent
        aFiltro := TFRMFiltro.Create(PNLFiltro);
        // Cambio el nombre porque todos se crean con el mismo.
        aFiltro.Name := 'FRMFiltro'+IntToStr(i + 1);
        // Asigno Parent, para que se vea en este panel
        aFiltro.Parent := PNLFiltro;
        // Lo ubico en la ultima linea del panel
        aFiltro.Top := PNLFiltro.Height;
        // Lo alineo al Top, para que quede pegado al anterior
        aFiltro.Align := alTop;
        aFiltro.CargaCampos(tsTitulo[i], StrToIntDef(tsIDIndice[i], 0));
     end;
  finally
     tsCodigo.Free;
     tsTitulo.Free;
     tsIDIndice.Free;
  end;
end;


La franja horaria es GMT +2. Ahora son las 16:18:44.

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