La conversación
Un diálogo es una conversación entre dos personas. Dos personas suelen tener conversaciones como esta:
Esas dos personas están intercambiando información de una manera que les permite atender otras cosas durante la conversación.
A veces, dos personas cambian a un modo de conversación que se vuelve muy enfocado:
En este modo, el copiloto ahora ignora el juego de solitario y el piloto ignora el sándwich.
Un cuadro de diálogo es una ventana donde una persona tiene una conversación con una computadora. JMP tiene dos tipos de cuadros de diálogo: no modales y modales. El cuadro de diálogo buscar/reemplazar no tiene modo; permanece abierto y cambia su enfoque entre las ventanas tan fácilmente como el piloto cambió de la economía a la comida. El diálogo de guardar de JMP es modal; una vez que JMP ingresa al modo de guardar un archivo, nada más puede interponerse en el camino hasta que se guarde el archivo o se cancele el guardado. JSL puede crear cuadros de diálogo personalizados, sin modo o modales, para brindarle información y obtener una respuesta.
Obtener respuestas
La vida de un cuadro de diálogo modal:
El elemento 1, construir el árbol, a menudo se realiza como argumento para la función Nueva ventana. Los elementos 2 y 3 son la función Nueva ventana. Aquí hay un cuadro de diálogo modal de cuadro de alerta.
rdata = New Window( title, <<MODAL></MODAL>
<
Just thought you should know...Just thought you should know...Just thought you should know...Just thought you should know...Solo pensé que deberías saber...
El diálogo bidireccional de esta pequeña ventana es muy simple:
No hay datos para devolver. La función Nueva ventana devuelve un valor; dice si presionaste el boton OK
{Button( 1 )}
o cerró la ventana con el botón de cierre proporcionado por el sistema operativo
{Button( -1 )}
Está devolviendo una lista con un elemento. Puede probar Cancelar vs Aceptar usando rdata["Botón"] que será -1 o 1. Probablemente no le importe ya que no puso un botón CANCELAR en el cuadro de diálogo.
Hace mucho tiempo, JMP colocó el contenido (cuadros de visualización) de una ventana en una estructura interna llamada La basura antes de pedirle al sistema operativo que cierre la ventana.La basura evolucionado con el tiempo para resolver muchos problemas y, a veces, crear efectos secundarios no deseados. Un efecto secundario fue hacer que los cuadros de visualización de un diálogo modal estuvieran disponibles para JSL para un corto tiempo después de que se cerró el cuadro de diálogo, y así fue como algunos usuarios recuperaron las respuestas de los cuadros de diálogo modales... literalmente sacándolos de la papelera.
Problemas con La basura giran en torno a cuánto se llena y cuándo vaciarlo. En las primeras versiones de JMP, la papelera se vaciaba cuando se mostraba la siguiente ventana, o alguna variación. Cuando se vacía la papelera, su contenido desaparece y esas variables del cuadro de diálogo modal también desaparecen. En su mayoría funcionó, la mayor parte del tiempo, pero siguió evolucionando, tratando de resolver varios problemas. Eventualmente @hecht_jmp puso una solución de vanguardia en JMP que resolvió los problemas con la papelera... pero requirió un poco más de plan para obtener respuestas de los diálogos modales.
Obtener respuestas de la manera correcta
Si quieres que te devuelvan más datos, tienes que pedirlos con < :
rdata = New Window( "modal dialog test", <<MODAL></MODAL>
It said "Enter your name" before I typed over it.It said "Enter your name" before I typed over it.It said "Enter your name" before I typed over it.It said "Enter your name" before I typed over it.Decía "Introduce tu nombre" antes de que lo escribiera.
{respuesta = "Craige", Botón (1)}
Puedes usar rdata["respuesta"] después de la Nueva ventana() regresa para obtener el valor del cuadro de texto en la variable respuesta . (Haga la prueba de cancelación primero.)
¿Es una lista como una matriz asociativa?
Todos los ejemplos anteriores devuelven una lista. Todos los elementos de la lista parecen declaraciones de asignación simples o algún tipo de llamada de función. Una característica de JMP poco utilizada y mal entendida es la subíndice de listas usando esos nombres, en lugar del índice numérico más habitual.
result = New Window( "Tell us about yourself", <<MODAL></MODAL>
Bob is about to press OKBob is about to press OKBob is about to press OKBob is about to press OKBob está a punto de presionar OK
El valor en el resultado podría ser
{nombre = "Bob", título = "programador", Botón (1)}
o, si Bob cancela,
{nombre = "Bob", título = "programador", Botón (-1)}
If( result["Button"] == 1, Write( Eval Insert( "\!n\[^result["name"]^ is a ^result["title"]^]\" ) ) , // else Write( "\!nthe dialog canceled." ) );
bob es programador
La lista hace actúa un poco como una matriz asociativa, aunque se realiza con una búsqueda secuencial. (Si necesita una matriz asociativa, cree una. No use este comportamiento de lista... es un mal sustituto).
Semántica de diálogo modal
Cuando su usuario presiona el botón cancelar en un cuadro de diálogo modal, no espera que se cambie nada. Cualquier JSL en un diálogo modal debería operar el diálogo sin realizar cambios en las variables en el resto de su programa. Aquí hay un ejemplo más grande; tiene un diálogo no modal para lanzar informes:
You can work in other windows while this window is open; it is a modeless dialog.You can work in other windows while this window is open; it is a modeless dialog.You can work in other windows while this window is open; it is a modeless dialog.You can work in other windows while this window is open; it is a modeless dialog.Puede trabajar en otras ventanas mientras esta ventana está abierta; es un diálogo sin modelo.
Cada vez que presiona el botón Hacer informe, se abre otra ventana:
A report showing the values from the modeless launcher.A report showing the values from the modeless launcher.A report showing the values from the modeless launcher.A report showing the values from the modeless launcher.Un informe que muestra los valores del lanzador no modal.
También hay un botón Establecer parámetros que abre un cuadro de diálogo modal con una rutina de validación. Este botón de cancelar no aplicará ningún cambio al iniciador anterior.
The validation routine opens yet another modal dialog.The validation routine opens yet another modal dialog.The validation routine opens yet another modal dialog.The validation routine opens yet another modal dialog.La rutina de validación abre otro diálogo modal.
// here's a simple modal window. It provides a warning, but no data is returned. alert = Function( {title, text, icon = "error"}, New Window( title, <<MODAL></MODAL>
¿Qué es un diálogo modal y cómo escribir uno mejor?