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,