En los diseños de formularios interactivos, es habitual que haya una o varias secciones en el formulario que no se muestren hasta que el usuario seleccione la opción para incluirlas. Con Designer, puede agregar un botón junto con una secuencia de comandos que agregue o quite dinámicamente una sección concreta (subformulario) en el formulario cuando el usuario haga clic en un botón.
Por ejemplo, en la orden de compra interactiva de ejemplo, el usuario puede hacer clic en el botón Agregar comentarios para mostrar la sección de comentarios (subformulario comentarios). El botón puede tener uno de dos rótulos que se alternan, Agregar comentarios o Borrar comentarios, según el estado actual del subformulario. Cada vez que el usuario hace clic en el botón, la secuencia de comandos comprueba si el subformulario comentarios se muestra y, después actualiza el rótulo del botón según corresponda.
El botón desencadena una secuencia de comandos que utiliza instanceManager, el objeto del Modelo de objetos de formulario XML que administra la creación, eliminación y desplazamiento de objetos de formulario en una instancia. Cuando el usuario final elimina el subformulario comentarios, el objeto instanceManager quita el subformulario del modelo de objetos de documento (DOM) de datos del formulario y el DOM de datos.
Tenga en cuenta que instanceManager utiliza cuatro métodos: addInstance, removeInstance, moveInstance y setInstances. La convención de nomenclatura de un objeto instanceManager es el nombre del subformulario con un guión bajo delante (_nombre de subformulario). La sintaxis de un objeto instanceManager es _nombre de subformulario.método().
En el formulario interactivo de orden de compra de ejemplo, el autor del formulario escribió la siguiente secuencia de comandos JavaScript en el Editor de secuencias de comandos utilizando el método setInstances para agregar y quitar el subformulario de comentarios y cambiar el rótulo del botón. Observe que comments.count == 0 property devuelve el número de instancias de subformulario de las que se crean instancias.
// Invoke the Instance Manager to add and remove the comments subform.
if (_comments.count == 0) {// The count property specifies the current number
// of instances instantiated.
_comments.setInstances(1); // Add the comments subform.
this.resolveNode("caption.value.#text").value = "Clear Comments"; // Change the button's caption.
}
else {
_comments.setInstances(0); // Remove the comments subform.
this.resolveNode("caption.value.#text").value = "Add Comments"; // Change the button's caption.
}
También puede utilizar el cuadro de diálogo Action Builder del menú Herramientas para crear funciones interactivas comunes en formularios con presentación flexible sin necesidad de escribir secuencias de comandos.
Creación de botones para agregar y eliminar
Cuando se agregan botones a un formulario interactivo, los usuarios finales pueden iniciar acciones como agregar y eliminar instancias de subformularios que definen secciones como líneas de elementos en un formulario de orden.
También puede agregar información del objeto al botón eliminar para que muestre las palabras “Eliminar elemento” cuando el usuario posicione el cursor sobre este botón. El uso de distintos botones para eliminar permite a los usuarios quitar filas específicas del formulario.
Por ejemplo, la orden de compra interactiva de ejemplo tiene un botón Agregar elemento y un botón para eliminar, etiquetado con una “X” para cada subformulario detalle. Cuando el usuario hace clic en el botón Agregar elemento, una secuencia de comandos agrega una línea de elementos. O bien, cuando el usuario hace clic en uno de los botones para eliminar, una secuencia de comandos elimina la línea de elementos asociada.

También puede utilizar el cuadro de diálogo Action Builder situado en el menú Herramientas para crear funciones interactivas comunes en formularios con presentación flexible sin necesidad de escribir secuencias de comandos. Consulte
Generación de acciones en formularios.Botón Agregar elemento
La siguiente secuencia de comandos JavaScript del suceso click del botón Agregar elemento, permite que los usuarios agreguen una línea de elementos al formulario interactivo de orden de compra de ejemplo. La secuencia de comandos también vuelve a calcular el formulario para que el campo Total incluya la nueva línea en el cálculo.
Puesto que los usuarios agregan únicamente líneas de elementos utilizando el botón Agregar elemento, no es necesario que la secuencia de comandos verifique el valor de incidencia mínimo.
// Invoke the Instance Manager to add one instance of the detail subform.
_detail.addInstance(1);
//Invoke the recalculate method to include the field values from the added subform in calculations.
xfa.form.recalculate(1);
Botón Eliminar
La siguiente secuencia de comandos JavaScript del suceso click del botón Eliminar permite que los usuarios eliminen una instancia del subformulario detalle del formulario interactivo de orden de compra de ejemplo utilizando el botón Eliminar. La secuencia de comandos también vuelve a calcular el formulario para que el campo Total ya no incluya la línea eliminada en el cálculo.
// Invoke the Instance Manager to remove the current instance of the detail subform.
_detail.removeInstance(this.parent.index);
// Invoke the recalculate method to update the form calculations.
xfa.form.recalculate(1);
Dado que el valor de incidencia mínimo inicial del subformulario detalle es 2, la secuencia de comandos tiene que reducir el valor de incidencia mínimo para permitir que la persona que rellene el formulario elimine las dos líneas de elementos que aparecen automáticamente cuando se procesa el formulario. Se ha agregado esta secuencia de comandos al suceso initialize del subformulario detalle.
// Reset the minimum occurrence value of the detail subform.
this.occur.min = "0";
Dado que el formulario permite que los usuarios eliminen todas las instancias del subformulario detalle, la secuencia de comandos del suceso calculate del campo Total (numTotal) debe comprobar que existe al menos una instancia del campo numAmount en el subformulario detalle. En caso contrario, aparece un error porque el cálculo no encuentra ocurrencias del campo numAmount. Se ha agregado esta secuencia de comandos al suceso Calculate del campo numTotal.
// Verify at least one instance of the numAmount field exists.
if (exists(detail[0].numAmount) == 1) then
Sum(detail[*].numAmount)
endif