Creaste un cursor llamado "valores"
y asignas
this.grid1.column1.ControlSource = valores && valores (sin comillas) es una variable que no existe.
donde lo correcto sería
this.grdi1.REcordsource="VALORES"
this.grid1.column1.ControlSource = "valores.CampoqueMuestrasEnLaColumna1"
Estudia bien cómo se manejan las asignaciones dentro de un control GRid. En general, tienes dos posibilidades:
1) No asignar los ControlSource, dejando que las configure automáticamente (cosa fea, claro)
2) Asignar todos los ControlSource de las columnas.
En cualquier caso, lo primero que debes hacer es poner qué cursor o tabla mostrará el control grid:
Thisform.grdEjemplo.RecordSource="valores"
* Si asigno los controlSource, será conveniente limitar el número de columnas:
With thisform.grdEjemplo
.ColumnCount=5
.Columns[1].ControlSource="valores.campo1"
.Columns[2].ControlSource="valores.campo2"
&& etc
&& Además, querrás ponerle tus propios títulos a las columnas
.Columns[1].Header1.Caption="TituloColumna1"
.Columns[2].Header1.Caption="TituloColumna2"
&&
.Columns[5].Header1.Caption="TituloColumna5"
&& también puedes configurar los .Format e .InputMask de los controles Text1 contenidos en las columnas
&& por ejemplo, si la columna1 tendrá una fecha
.Columns[1].Text1.Format="D"
&& si la columna5 tendrá un número con formato
.Columns[5].text1.Format="Z" && que no muestre los valores cero
.Columns[5].Text1.InputMask="999,999,999.99" && que muestre esta separación de millares.
&& también puedes asignarle un ancho a las columnas
.Columns[1].width=63
.Columns[2].width=180
.Columns[3].width=200
.Columns[4].width=26
.Columns[5].width=80
ENDWITH
En resumen, el control grid es un contenedor que contiene únicamente otros contenedores llamados Columns.
Además tiene otros elementos (DeleteMark, RecordMark, ScrollBars, GridLines, HightLight, etc) que pueden mostrarse o no según la configuración. En el caso de las GridLines, se les puede asignar un color cualquiera (recomendable) y también un grosor distinto del que viene por default (poco recomendable).
Los objeto Columns contienen 1 objeto Header llamado Header1 por defecto y pueden contener uno o más objetos de los cuales solo uno de ellos estará activo y visible (Columns[x].CurrentControl="objetoTal"). Por defecto, cada columna contiene un objeto textbox de nombre "Text1".
Si quieres que el Control Grid sea de solo consulta, las columnas deben seterase
Thisform.grdEjemplo.Setall("readonly",.T.,"column")
También puedes asignarle un tamaño de letra
with thisform.grdEjemplo
* .Setall("Readonly",.t.,"Column")
.Setall("Fontsize",8,"Column")
.Setall("Fontsize",8,"Header")
.Setall("FontBold",.t.,"Header")
.Setall("BackColor",Rgb(73,136,160),"Header")
.Setall("ForeColor",Rgb(255,255,255),"Header")
endwith
También puedes hacer asignaciones dinámicas (simples o complejas)
griDynDark="Rgb(217,220,212)"
GriDynClear="Rgb(233,232,228)"
with thisform.grdEjemplo
.SetAll("DynamicBackColor","IIF(MOD(RECNO( ), 2)=0, &griDynClear , &griDynDark )", "Column")
endwith
El comportamiento del control grid cambia en algunas cuestiones según lo configures como AutoCellSelection=.t. (default) o .F.
En el ejemplo siguiente, muestro cómo se puede enviar una cantidad de parámetros a un formulario a través de un objeto Empty. La idea es la siguiente: Tener un formulario que pueda mostrar cualquier cursor en un control grid.
De acuerdo a la complejidad de los parámetros, podemos obtener diversas funcionalidades de este formulario.