對話
對話是兩個人之間的對話。 兩個人的對話通常是這樣的:
- 飛行員:(把三明治放回托盤上)“你對經濟怎麼看?”
- 副駕駛:(沒有從電話上抬起頭)“我需要加薪,你呢?”
- 飛行員:(擦掉大蒜麵包屑)“好吧,我這週要去五星級酒店吃飯。”
- 副駕駛:(對遊戲皺眉)“他們的雞湯很好吃。”
這兩個人正在以一種允許他們在談話期間傾向於其他事情的方式交換信息。
有時,兩個人會切換到一種非常專注的對話模式:
- 飛行員:“我們的汽油快用完了。”
- 副駕駛:“切換到另一個坦克。”
- 飛行員:“一個小時前做的。”
- 副駕駛:“這不好。 我們還要再過一個小時。”
- 飛行員:“我有個主意,但你不會喜歡的。”
在這種模式下,副駕駛現在忽略紙牌遊戲,飛行員忽略三明治。
對話框是一個人與計算機對話的窗口。 JMP 有兩種對話框:無模式對話框和模式對話框。 查找/替換對話框是無模式的;它保持開放並在窗口之間切換焦點,就像飛行員從經濟轉向食品一樣容易。 JMP 的保存對話框是模態的;一旦 JMP 進入保存文件模式,在保存文件或取消保存之前,不會有任何其他障礙。 JSL 可以創建無模式或模態的自定義對話框,為您提供一些信息並得到答复。
得到答案
模態對話框的壽命:
- 構建顯示框樹
- 打開一個窗口以擁有並顯示顯示框樹
- 等待窗口關閉
第 1 項,構建樹,通常作為 New Window 函數的參數完成。 第 2 項和第 3 項是新窗口功能。 這是一個警告框模態對話框。
rdata = New Window( title, <<MODAL></MODAL>
<
只是認為你應該知道...
這個小窗口的雙向對話非常簡單:
沒有要返回的數據。 New Window 函數確實返回一個值;它會告訴你是否按下了 OK 按鈕
{Button( 1 )}
或使用操作系統提供的關閉按鈕關閉窗口
{Button( -1 )}
它返回一個包含一個元素的列表。 您可以使用rdata["按鈕"]這將是 -1 或 1。 您可能不在乎,因為您沒有在對話框中放置取消按鈕。
查看更多...
垃圾
很久以前,JMP 將窗口的內容(顯示框)放入一個名為垃圾在要求操作系統關閉窗口之前。垃圾隨著時間的推移不斷發展以解決許多問題,有時會產生意想不到的副作用。 一個副作用是使模態對話框的顯示框對 JSL 可用短的對話框關閉後的時間,這就是一些用戶從模態對話框中檢索答案的方式……實際上是將它們從垃圾箱中取出。
- 飛行員:(把大蒜碎餐巾扔進垃圾桶)“嗯,很好。”
- 副駕駛:(皺著鼻子)“我想我現在就把它清空。 或者也許一會兒。”
問題垃圾圍繞它填滿多少以及何時清空它。 在 JMP 的早期版本中,當顯示下一個窗口或某些變體時,垃圾箱會被清空。 當垃圾桶被清空時,它的內容消失了,那些模態對話框變量也消失了。 大多數情況下,它大部分時間都有效,但它不斷發展,試圖解決各種問題。 最終@hecht_jmp將最先進的解決方案放入 JMP 以解決垃圾問題……但需要更多的計劃來從模態對話框中獲取答案。
以正確的方式獲得答案
如果你想返回更多的數據,你必須用<<返回結果:
rdata = New Window( "modal dialog test",
<<MODAL></MODAL>
在我輸入之前,它說“輸入你的名字”。
{answer = "Craige", Button( 1 )}
您可以使用rdata["答案"]之後新窗戶()返回從變量中的文本框中獲取值回答. (先做取消測試。)
列表和關聯數組一樣嗎?
上面的所有示例都返回一個列表。 列表中的項目看起來都像簡單的賦值語句或某種函數調用。 JMP 的一個很少使用但不太了解的功能是使用這些名稱為列表添加下標,而不是更常見的數字索引。
result = New Window( "Tell us about yourself",
<<MODAL></MODAL>
鮑勃正要按確定
結果中的值可能是
{name = "Bob", title = "程序員", Button( 1 )}
或者,如果鮑勃取消,
{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." )
);
鮑勃是一名程序員
列表做行為有點像關聯數組,儘管它是通過順序查找完成的。 (如果您需要一個關聯數組,請製作一個。 不要使用這個列表行為......它是一個糟糕的替代品。)
模態對話語義
當您的用戶按下模態對話框上的取消按鈕時,他們不希望任何更改。 模態對話框中的任何 JSL 都應該在不更改程序其餘部分中的變量的情況下操作對話框。 這是一個更大的例子;它有一個用於啟動報告的無模式對話框:
此窗口打開時,您可以在其他窗口中工作;這是一個無模式的對話框。
每次按下 Make Report 按鈕時,都會打開另一個窗口:
顯示來自無模式啟動器的值的報告。
還有一個“設置參數”按鈕,可打開帶有驗證例程的模式對話框。 此取消按鈕不會對上面的啟動器應用任何更改。
驗證例程打開另一個模態對話框。
- 飛行員:(瞇眼)“這看起來很複雜!”
- 副駕駛:“我們可以做到。 有評論!”
// 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>