Esto de tener un procedure en un prg para modificar el estado de una botonera del formulario me parece una idea mala.
Mínimamente deberías comprobar en el prg si los botones existen antes de asignarle un valor a un propiedad.
PROCEDURE MudaProd
LPARAMETERS loForm,tlEnabled
IF VARTYPE(loForm) = "O"
IF PEMSTATUS(loForm,"ranterior",5)
loForm.ranterior.Enabled = m.tlEnabled
ENDIF
IF PEMSTATUS(loForm,"primero",5)
loForm.primero.Enabled = m.tlEnabled
ENDIF
IF PEMSTATUS(loForm,"rsiguiente",5)
loForm.rsiguiente.Enabled = m.tlEnabled
ENDIF
IF PEMSTATUS(loForm,"rultimo",5)
loForm.rultimo.Enabled = m.tlEnabled
ENDIF
IF PEMSTATUS(loForm,"nuevo",5)
loForm.nuevo.Enabled = m.tlEnabled
ENDIF
IF PEMSTATUS(loForm,"eliminar",5)
loForm.eliminar.Enabled = m.tlEnabled
ENDIF
ENDWITH
ENDPROC
Me parece que esa botonera debería estar en una clase container, y que la clase contenedora debe contener todos los métodos y propiedades de ususario necesarios para su funcionalidad.
Y entonces, en lugar de llamar a un procedure de prg, llamas a un método de la clase contenedora.
La clase contenedora puede ser Container con commands individuales o Commandgroup donde en el evento click debes resolver lo que se hace, o una combinación de ambas.
Por ejemplo, el código del evento click de un commandgroup que tiene los botones de movimiento del puntero y un botón más para refresco y enfoque del control grid: (Versión de código Foxbin2prg)
PROCEDURE Click
TRY
LOCAL lcmetodo,loex as Exception
IF VARTYPE(this.objgrid)="O"
SELECT (This.objGrid.RecordSource )
do case
case this.value=1
* Primer Registro
go top
case this.value=2
* Ultimo Registro
go bott
case this.value=3
* Registro Anterior
IF !BOF()
SKIP -1
ENDIF
case this.value=4
* REgistro Siguiente
IF !EOF()
SKIP
IF EOF()
GO bott
ENDIF
ENDIF
case this.value=5
* Forzar Refresh
This.objGrid.REfresh
ENDCASE
* Permite que se ejecute cierto método del formulario
* para el raro caso en que sea necesario
IF !EMPTY(this.metodo) AND PEMSTATUS(thisform,this.metodo,5)
RAISEEVENT(thisform,this.Metodo)
ENDIF
This.objGrid.SetFocus
ENDIF
CATCH TO loex
loex.UserValue = PROGRAM()
ShowError(Loex)
FINALLY
ENDTRY
ENDPROC
PROCEDURE Destroy
this.objgrid = null
ENDPROC
Como se puede ver, la clase tiene una propiedad ("ObjGrid") que contiene la referencia de objeto al control grid al que se refiere.
También hay una propiedad llamada "Metodo" que puede contener el nombre de un método del formulario que necesita ejecutarse.