Ver Mensaje Individual
  #6  
Antiguo 06-05-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Reputación: 38
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Cita:
Empezado por leg128 Ver Mensaje
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita