Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Agregar objetos a un GridPanel en tiempo de ejecución (https://www.clubdelphi.com/foros/showthread.php?t=57641)

Luis Abraham 23-06-2008 18:35:52

Agregar objetos a un GridPanel en tiempo de ejecución
 
Hola Foro!

Desde hace algunos días he estado tratando de generar una "tabla" de botones usando un GridPanel pero desgraciadamente no he dado con el clavo de como hacerlo en tiempo de ejecución.

Hasta ahora solo he podido aumentar el numero de columnas y filas así como modificar sus tamaños en tiempo de ejecución, pero lo mas importante, que es crear los botones o cualquier otro objeto en sus celdas, no lo he podido hacer.

Por desgracia la ayuda del Delphi 2007 deja mucho que desear y no trae documentación al respecto, tampoco he encontrado información en Internet, así que si alguien ya pasó por esto y encontró como hacerlo le agradecería muchísimo que me echarla la mano.

Lo que me agrada mucho del GridPanel son sus propiedades de resize, pero no estoy cerrado a usar este componente solamente, así que si alguien sabe de alguna otra forma alternativa de hacerlo pues también sera bienvenida.

Gracias de antemano y un saludo para todos!

coso 23-06-2008 19:24:37

hola. Prueba esto a ver si te sirve...

Código Delphi [-]
...
  public
    { Public declarations }
    obj : array of TButton;
    idx : integer;
...

procedure TForm1.Button1Click(Sender: TObject);
var
        cnt : integer;
begin
        SetLength(obj,idx+1);
        try
        obj[idx] := TButton.Create(self);
        obj[idx].Name := 'boton'+inttostr(idx);
        obj[idx].Parent := self;
        obj[idx].Left := (sender as TButton).Left + 10;
        obj[idx].Top  := (sender as TButton).Top + 10;
        obj[idx].Width := (sender as TButton).Width;
        obj[idx].Height := (sender as TButton).Height;
        obj[idx].Caption := Obj[idx].Name;
        obj[idx].Visible := true;
        obj[idx].Enabled := true;
        obj[idx].OnClick := (sender as TButton).OnClick;
        ShowMessage(obj[idx].Caption);
        inc(idx);
        except
        raise exception.Create('error creando nuevo boton');
        end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
        SetLength(obj,1);
        idx := 0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
        i : integer;
begin
        for i := idx - 1 to 0 do
        obj[i].free;

        setlength(obj,0);
end;

es probable, no obstante, que haya maneras mas elegantes.

saludos

PD : releyendo, vi que es un 'GridPanel' y no un 'Panel'. :confused: No conozco ese componente asi que quiza este codigo no te sirva. Bueno, igualmente te lo dejo por si sí lo hace :D

Luis Abraham 25-06-2008 04:27:12

Hola coso, muchas gracias por tu ejemplo, me es muy útil también para este caso.

Por otra parte, ya encontré como agregar componentes al GridPanel en tiempo de ejecución, aquí les dejo un ejemplo, solo necesitan un TGridPanel con 4 Columnas x 4 Renglones y un TButton:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var miBoton: TButton;
begin
   miBoton:= TButton.Create(Self);
   miBoton.Align:= alClient;
   miBoton.Name:= 'Boton' + IntToStr(Button1.Tag);
   miBoton.Caption:= miBoton.Name;
   Button1.Tag:= Button1.Tag+ 1;

   GridPanel1.ControlCollection.AddControl(miBoton, 0, -1);
   miBoton.Parent:= GridPanel1;
end;

Sin embargo, esta historia sigue sin tener un final feliz, ya que, hay un bug en el procedimiento TControlCollection.AddControl(AControl: TControl; AColumn, ARow: Integer) del unit ExtCtrls.pas el cual puede ser arreglado invirtiendo los indices Row y Column, pero el problema ahora es que no tengo ese archivo, solo tengo el archivo ya compilado (ExtCtrls.dcu) :(.

¿Alguna idea de donde lo puedo encontrar para aplicar el Workaround?

*Nota: Para mas información sobre el bug, vea la siguiente liga.

Saludos!


La franja horaria es GMT +2. Ahora son las 14:39:00.

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