PDA

Ver la Versión Completa : Agregar objetos a un GridPanel en tiempo de ejecución


Luis Abraham
23-06-2008, 18:35:52
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...


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

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 (http://qc.borland.com/wc/qcmain.aspx?d=50972).

Saludos!