La conversazione
Un dialogo è una conversazione tra due persone. Di solito due persone hanno conversazioni come questa:
- Pilota: (riponendo il panino sul vassoio) "Cosa ne pensi dell'economia?"
- Copilota: (senza alzare lo sguardo dal telefono) "Ho bisogno di un aumento, e tu?"
- Pilota: (pulisce le briciole di pane all'aglio) "Beh, mangerò al cinque stelle questa settimana."
- Co-pilota: (aggrottando il gioco) "La loro zuppa di pollo è gustosa."
Queste due persone si stanno scambiando informazioni in un modo che consente loro di occuparsi di altre cose durante la conversazione.
A volte due persone passano a una modalità di conversazione che diventa strettamente focalizzata:
- Pilota: "Stiamo finendo la benzina".
- Copilota: "Passa all'altro serbatoio".
- Pilota: "L'ho fatto un'ora fa".
- Copilota: "Questo non va bene. Saremo sull'acqua per un'altra ora."
- Pilota: "Ho un'idea, ma non ti piacerà".
In questa modalità il copilota ora ignora il gioco del solitario e il pilota ignora il panino.
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 modale e modale. 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 salvataggio di JMP è modale; una volta che JMP entra in modalità di salvataggio di un file, nient'altro può interferire finché il file non viene salvato o il salvataggio non viene annullato. 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:
- Costruisci un albero di scatole da esposizione
- Apri una finestra di tua proprietà e mostra l'albero della casella di visualizzazione
- Aspetta che la finestra si chiuda
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 di avviso.
rdata = New Window( title, <<MODAL></MODAL>
<
Pensavo solo che dovessi sapere...
La finestra di dialogo bidirezionale di questa piccola finestra è molto semplice:
- JMP: "Svegliati! Questa cosa è successa!"
- Sì ok"
Non ci sono dati da restituire. La funzione Nuova finestra restituisce un valore; ti 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 dal momento che non hai inserito un pulsante CANCEL nella finestra di dialogo.
Visualizza di più...Non solo è necessario fornire il titolo e il testo, è necessaria un'icona. Mi piace l'addin per le icone integrate per un progetto veloce come questo. Puoi anche creare bitmap personalizzate, se ne hai bisogno.
@Justin_Chilton Icone JMP integrate
L'icona "Errore" potrebbe non esistere sul Mac. o un'icona di avviso di dimensioni diverse
avvertimento!
La spazzatura
Molto tempo fa JMP ha inserito i contenuti (display box) 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 breve tempo dopo che la finestra di dialogo è stata chiusa, ed è così che alcuni utenti hanno recuperato le risposte dalle finestre di dialogo modali... letteralmente tirandole fuori dal cestino.
- Pilota: (lanciando un tovagliolo con la briciola d'aglio nella spazzatura) "mmmm. buono."
- Copilota: (arricciando il naso) "Penso che lo svuoterò ora. O forse tra un po'".
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 scompaiono anche quelle variabili della finestra di dialogo modale. Per lo più ha funzionato, la maggior parte del tempo, ma ha continuato a evolversi, cercando di risolvere vari problemi. Infine @hecht_jmp ha inserito una soluzione all'avanguardia in JMP che ha risolto i problemi con il cestino... ma ha richiesto 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>
Diceva "Inserisci il tuo nome" prima che lo scrivessi sopra.
{risposta = "Craige", Bottone( 1 )}
Puoi usare rdata["risposta"] dopo il Nuova finestra() ritorna per ottenere il valore dalla casella di testo nella variabile Rispondere . (Fai 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 usata e poco conosciuta di JMP è quella di sottoscrivere gli elenchi usando quei nomi, piuttosto che il più comune indice numerico.
result = New Window( "Tell us about yourself",
<<MODAL></MODAL>
Bob sta per premere OK
Il valore nel risultato potrebbe essere
{nome = "Bob", titolo = "programmatore", Pulsante( 1 )}
o, se Bob annulla,
{nome = "Bob", titolo = "programmatore", Pulsante ( -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 agire 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 di elenco... è un sostituto scadente.)
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 modale dovrebbe operare sulla finestra 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:
Puoi lavorare in altre finestre mentre questa finestra è aperta; è un dialogo senza modale.
Ogni volta che si preme il pulsante Crea rapporto, si apre un'altra finestra:
Un report che mostra i valori del launcher 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.
La routine di convalida apre un'altra finestra modale.
- Pilota: (strizzando gli occhi) "Sembra complicato!"
- Copilota: "Possiamo farcela. Ha commenti!"
// 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>