Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-05-2016
leg128 leg128 is offline
Registrado
NULL
 
Registrado: jun 2014
Posts: 5
Poder: 0
leg128 Va por buen camino
Error "A control cannot have itself as its parent"

Buenos dias, les comento... estoy tratando de crear objetos(botones, edit y demas cosas que se me ocurran) en una grilla.. cuando ejecuto el programa recibo este error al hacer la llamada a mi procedimiento
"A control cannot have itself as its parent"

la llamada es
Código:
  stgboton(1, StringGrid1, 'hola', EventoClick, 5 );
el procedimiento es este
Código:
procedure stgboton(objeto:integer; Grid : TStringGrid; txtcaption:string; evento:TNotifyEvent; columna:integer);
var
 i: Integer;
  Btn: TObject;

begin
 for i := Grid.FixedRows to Grid.RowCount -2 do
  begin
    if objeto = 1 then
    begin
    with TButton (btn) do
    begin
       Create(nil);
       Caption   := txtboton;
       Width     := 87;
       Name      := 'Button' + IntToStr(i);
       BoundsRect:= Grid.CellRect(Columna, i);
       ControlStyle := [csClickEvents];
       onclick    := evento;
       Tag       :=  i;
       parent:= grid;
    end;
     Grid.Objects[Columna,i] := Btn;

    end;
  end;
end;
Alguna idea de como puedo solucionarlo? saludos.
Responder Con Cita
  #2  
Antiguo 05-05-2016
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Hola
Porque pones TButton(btn)??? No veo que crees el objeto (btn) en ninguna parte.
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #3  
Antiguo 05-05-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
No estas asignando ningun valor a la variable Btn, a la que luego le aplicas un casting a TButton usando el with
Responder Con Cita
  #4  
Antiguo 05-05-2016
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Poder: 21
gatosoft Va camino a la fama
De cualquier forma el no instanciar una variable generaría un Access Violation #000000... no un "A control cannot have itself as its parent"

Yo creo (no tengo compilador a la mano) que el problema está en la utilizacion del With (Ya nuestro amigo Al Gonzalez en algún hilo habló de su uso y abuso)

Asumo que al hacer el Create(nil); quieres asignarlo a tu btn... pues no funciona asi.

Código Delphi [-]
with TButton (btn) do
    begin
       Create(nil);
       Caption   := txtboton;
       Width     := 87;
       Name      := 'Button' + IntToStr(i);
       BoundsRect:= Grid.CellRect(Columna, i);
       ControlStyle := [csClickEvents];
       onclick    := evento;
       Tag       :=  i;
       parent:= grid;
    end;

La linea create dentro del with equivale a hacer:

Código Delphi [-]
TButton (btn).Create(nil);

instancia un objeto pero no lo asigna a la variable btn.

Lo que está ocurriendo es que dentro del with está asignando las variables a otro objeto, y segun parece, se está haciendo al StringGrid, de forma que en la linea parent:= grid, genera el error que te está enviando


Creo que deberias hacer algo como:

Código Delphi [-]
btn:= TButton.Create(nil);
with TButton (btn) do
    begin
       Caption   := txtboton;
       Width     := 87;
       Name      := 'Button' + IntToStr(i);
       BoundsRect:= Grid.CellRect(Columna, i);
       ControlStyle := [csClickEvents];
       onclick    := evento;
       Tag       :=  i;
       parent:= grid;
    end;

Saludo,
Responder Con Cita
  #5  
Antiguo 05-05-2016
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Poder: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Cita:
De cualquier forma el no instanciar una variable generaría un Access Violation #000000... no un "A control cannot have itself as its parent"
Esto tiene truco, como descubri hace un tiempo

Es eso, o bien en esa ejecucion se presento esa oportunidad y btn podria apuntar a cualquier lado
Responder Con Cita
  #6  
Antiguo 06-05-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
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
  #7  
Antiguo 06-05-2016
leg128 leg128 is offline
Registrado
NULL
 
Registrado: jun 2014
Posts: 5
Poder: 0
leg128 Va por buen camino
Muchas gracias muchachos, tengo ganas de llorar de la emoción! El ejemplo de ecfisa y la correccion de [gatosoft] funcionaron de 10...Gracias
Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Usar TServerSocket y TClientSocket para enviar "streams" más o menos "grandes" dec Internet 9 04-08-2015 16:11:50
EInvalidOperation with message 'Control" has no parent mrnovice OOP 4 18-08-2008 18:53:05
Cómo acceder a las propiedades de un "Parent" NeoAnderson API de Windows 14 12-02-2008 21:13:46
Parent, ParentWindow, objetos y el error Control has no parent Window dec Varios 18 07-08-2007 15:02:01
Necesito llamar a métodos de clases "hija" desde su clase "padre" Flecha OOP 17 20-04-2007 00:03:53


La franja horaria es GMT +2. Ahora son las 15:50:07.


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
Copyright 1996-2007 Club Delphi