La conversazione
Un dialogo è una conversazione tra due persone. Due persone di solito hanno conversazioni come questa:
Queste due persone si scambiano informazioni in un modo che consente loro di occuparsi di altre cose durante la conversazione.
A volte due persone passano a una modalità conversazionale che diventa strettamente focalizzata:
In questa modalità il copilota ora ignora il gioco del solitario e il pilota ignora il sandwich.
Una finestra di dialogo è una finestra in cui una persona ha una conversazione con un computer. JMP dispone di due tipi di finestre di dialogo: non modali e modali. La finestra di dialogo trova/sostituisci è non modale; rimane aperto e sposta la sua attenzione tra le finestre con la stessa facilità con cui il pilota è passato dall'economia al cibo. La finestra di dialogo di salvataggio di JMP è modale; una volta che JMP entra nella modalità di salvataggio di un file, nient'altro può ostacolare il salvataggio del file o l'annullamento del salvataggio. JSL può creare finestre di dialogo personalizzate, non modali o modali, per darti alcune informazioni e ottenere una risposta.
Ottenere risposte
La vita di una finestra di dialogo modale:
L'elemento 1, costruire l'albero, viene spesso utilizzato come argomento della funzione Nuova finestra. Gli elementi 2 e 3 sono la funzione Nuova finestra. Ecco una finestra di dialogo modale della finestra di avviso.
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...Ho solo pensato che dovresti sapere...
Il dialogo bidirezionale di questa piccola finestra è molto semplice:
Non ci sono dati da restituire. La funzione Nuova finestra restituisce un valore; dice se hai premuto il pulsante OK
{Button( 1 )}
o chiuso la finestra con il pulsante di chiusura fornito dal sistema operativo
{Button( -1 )}
Restituisce una lista con un elemento. Puoi testare Annulla vs OK usando rdata["Pulsante"] che sarà -1 o 1. Probabilmente non ti interessa dato che non hai inserito un pulsante ANNULLA nella finestra di dialogo.
Molto tempo fa JMP inseriva i contenuti (caselle di visualizzazione) di una finestra in una struttura interna chiamata La spazzatura prima di chiedere al sistema operativo di chiudere la finestra.La spazzatura si è evoluto nel tempo per risolvere molti problemi e talvolta creare effetti collaterali indesiderati. Un effetto collaterale è stato quello di rendere disponibili a JSL le caselle di visualizzazione di una finestra di dialogo modale per a corto tempo dopo la chiusura della finestra di dialogo, ed è stato così che alcuni utenti hanno recuperato le risposte dalle finestre di dialogo modali ... letteralmente tirandole fuori dalla spazzatura.
Problemi con La spazzatura ruota intorno a quanto si riempie e quando svuotarlo. Nelle prime versioni di JMP il cestino veniva svuotato quando veniva visualizzata la finestra successiva, o qualche variazione. Quando il cestino viene svuotato, il suo contenuto scompare e anche quelle variabili della finestra di dialogo modale svaniscono. Ha funzionato per lo più, la maggior parte delle volte, ma ha continuato ad evolversi, cercando di risolvere vari problemi. Infine @hecht_jmp mettere una soluzione all'avanguardia in JMP che risolvesse i problemi con il cestino... ma richiedeva un po' più di un piano per ottenere risposte dai dialoghi modali.
Ottenere risposte nel modo giusto
Se vuoi che vengano restituiti più dati, devi richiederli 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.Diceva "Inserisci il tuo nome" prima che ci scrivessi sopra.
{risposta = "Craige", Pulsante( 1 )}
Puoi usare rdata["risposta"] dopo il Nuova finestra() restituisce per ottenere il valore dalla casella di testo nella variabile risposta . (Esegui prima il test di annullamento.)
Una lista è come un array associativo?
Tutti gli esempi precedenti restituiscono un elenco. Gli elementi nell'elenco sembrano tutti semplici istruzioni di assegnazione o qualche tipo di chiamata di funzione. Una caratteristica poco utilizzata e poco conosciuta di JMP è la sottoscrizione di elenchi utilizzando tali nomi, anziché il più consueto indice numerico.
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 sta per premere OK
Il valore nel risultato potrebbe essere
{name = "Bob", title = "programmer", Button( 1 )}
oppure, se Bob annulla,
{name = "Bob", title = "programmer", Button( -1 )}
If( result["Button"] == 1, Write( Eval Insert( "\!n\[^result["name"]^ is a ^result["title"]^]\" ) ) , // else Write( "\!nthe dialog canceled." ) );
Bob è un programmatore
La lista fa si comporta un po' come un array associativo, anche se è fatto con una ricerca sequenziale. (Se hai bisogno di un array associativo, creane uno. Non utilizzare questo comportamento dell'elenco... è un cattivo sostituto.)
Semantica del dialogo modale
Quando l'utente preme il pulsante Annulla in una finestra di dialogo modale, non si aspetta che venga modificato nulla. Qualsiasi JSL in una finestra di dialogo modale dovrebbe eseguire la finestra di dialogo senza apportare modifiche alle variabili nel resto del programma. Ecco un esempio più grande; ha una finestra di dialogo non modale per l'avvio dei report:
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.Puoi lavorare in altre finestre mentre questa finestra è aperta; è un dialogo non modale.
Ogni volta che si preme il pulsante Crea rapporto, si apre un'altra finestra:
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 rapporto che mostra i valori dell'utilità di avvio non modale.
C'è anche un pulsante Imposta parametri che apre una finestra di dialogo modale con una routine di convalida. Questo pulsante di annullamento non applicherà alcuna modifica al programma di avvio sopra.
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 routine di convalida apre ancora un'altra finestra di dialogo modale.
// 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>
Cos'è un dialogo modale e come scriverne uno migliore.