Cita:
Empezado por leg128
Buenos dias, les comento... estoy tratando de crear objetos(botones, edit y demas cosas que se me ocurran) en una grilla...
...
Alguna idea de como puedo solucionarlo? saludos.
|
No miré a fondo tu código, pero en principio la forma de creación:
Código Delphi
[-]
...
with TButton (btn) do
begin
Create(nil);
...
es incorrecta, usando
with podrías hacer:
Código Delphi
[-]
with TButton.Create(nil) do
...
Por otro lado usar como el tipo de parámetro a la clase
TObject va a limitar las propiedades disponibles y la totalidad de los eventos.
Te pongo un ejemplo usando un parámetro con otro tipo de clase que te va a permitir crear muchos controles (no los que se te ocurran

), pero sí unos cuantos descendientes ella:
Código Delphi
[-]
...
procedure TForm1.FormCreate(Sender: TObject);
var
c : Integer;
sg: TStringGrid;
begin
sg := StringGrid1;
sg.ColCount := 7;
sg.FixedColor := clLime;
for c := 0 to sg.ColCount-1 do
sg.ColWidths[c] := 90;
end;
procedure TForm1.EventoClick(Sender: TObject);
begin
ShowMessage(Format('Click en %s',[TWinControl(Sender).Name]));
end;
type
TWinControlEx = class(TWinControl);
procedure TForm1.CrearWinControl(WcClass: TWinControlClass; Columna: Integer;
Evento: TNotifyEvent);
var
wc: TWinControl;
sg: TStringGrid;
r : Integer;
Rect: TRect;
begin
sg := StringGrid1;
for r := sg.FixedRows to sg.RowCount-1 do
begin
if Assigned(sg.Objects[Columna,r]) then Continue;
wc := WcClass.Create(nil);
wc.Name := Format('%s%d',[Copy(WcClass.ClassName, 2, MaxInt), r]);
Rect := sg.CellRect(Columna, r);
InflateRect(Rect, -2, -2);
wc.BoundsRect := Rect;
wc.ControlStyle := [csClickEvents];
TWinControlEx(wc).OnClick := Evento;
TWinControlEx(wc).Caption := wc.Name;
wc.Tag := r;
wc.Parent := sg;
sg.Objects[Columna, r] := wc;
end;
end;
procedure TForm1.btnCreateClick(Sender: TObject);
begin
CrearWinControl(TButton , 1, EventoClick);
CrearWinControl(TEdit , 2, EventoClick);
CrearWinControl(TMemo , 3, EventoClick);
CrearWinControl(TPanel , 4, EventoClick);
CrearWinControl(TCheckBox , 5, EventoClick);
CrearWinControl(TRadioButton, 6, EventoClick);
end;
procedure TForm1.btnFreeClick(Sender: TObject);
var
sg : TStringGrid;
c, r: Integer;
begin
sg := StringGrid1;
for c := sg.FixedCols to sg.ColCount - 1 do
for r := sg.FixedRows to sg.RowCount - 1 do
if Assigned(sg.Objects[c, r]) then
begin
sg.Objects[c,r].Free;
sg.Objects[c,r] := nil;
end;
end;
Salida:
Saludos
