“編寫程式”的版本间的差异
Pegasusroe(讨论 | 贡献) 小 |
Pegasusroe(讨论 | 贡献) |
||
(未显示同一用户的14个中间版本) | |||
第1行: | 第1行: | ||
<noinclude>{{Manual Page|version=4.0}}</noinclude>{{objects|property}} | <noinclude>{{Manual Page|version=4.0}}</noinclude>{{objects|property}} | ||
− | GeoGebra | + | GeoGebra 支援兩種程式語言 - GGBScript 和 Javascript 。我們可以在下列的事件中編寫相對的觸發程序: |
− | * | + | * 用滑鼠點選某物件時 (On Click) |
− | * | + | * 某物件數值或屬性變更時 (On Update, ...) |
− | * Javascript | + | * 開啟 GeoGebra 檔案時 (ggbOnInit) |
− | + | * Javascript 觸發程序 (listener),詳情請參考 [[:en:Reference:JavaScript|JavaScript]] 。 | |
+ | 我們可以透過物件[[ 屬性]] 視窗中的「程式」頁面來編寫程式碼。 | ||
+ | [[File:ScriptingTab.png|thumb|屬性視窗的「程式」頁]] | ||
==GGBScript== | ==GGBScript== | ||
− | + | GGBScript 主要是用 GeoGebra 本身的指令來編寫。 | |
{{Example|1=<div> | {{Example|1=<div> | ||
− | * | + | * 假設 a 是一個範圍從 1 到 3 的[[ 數值與角度| 整數]] |
− | * <code><nowiki> | + | * 在命令列中輸入以下的[[串列|集合]]:<br><code><nowiki>colors = {"red", "green", "blue"}</nowiki></code> |
− | * | + | * 進入 ''a'' 的[[屬性]]中的「程式」頁面,然後在「On Update 」頁面中輸入:<br><code>[[SetColor 指令|SetColor]][a, [[Element 指令|Element]][colors, a]]</code> |
− | * | + | * 最後,調整 a 值就可以改變它的[[:en:Reference:Colors|顏色]]。</div>}} |
+ | {{Hint|有些指令只能用於 GGBScript 中,詳情請參閱:[[GGB 程式碼 指令|GGBScript 指令]]}} | ||
+ | {{Hint|有關顏色的名稱與編碼,請參閱:[[:en:Reference:Colors|完整的顏色列表]]}} | ||
+ | {{Youtube|title=以 SetColor 指令動態改變顏色|url=http://www.youtube.com/watch?v=xpV2L5CAtM8}} | ||
==JavaScript== | ==JavaScript== | ||
− | JavaScript | + | JavaScript 是一種常用於網頁中的程式語言。不像 GGBScript 只能依序執行一些 GeoGebra 指令而己,JavaScript 可以使用 {{key|if|blue}}、{{key|while|blue}}、{{key|for|blue}} 等關鍵字來控制程式的流程。 |
+ | {{Hint|若想進一步瞭解 JavaScript 的語法,請參閱 [https://developer.mozilla.org/en/JavaScript/Guide developer.mozilla.org] 。}} | ||
+ | 我們也可以使用一些特別的 JavaScript 函數來作圖,這些函數都是 {{key|ggbApplet}} 的物件方法,也就是說我們必須使用:<code>{{key|ggbApplet}}.method(a, b, ...)</code> 這樣的語法來呼叫這些函數才行。 | ||
+ | {{hint|詳細的函數說明,請參閱 [[:en:Reference:JavaScript|ggbApplet 物件方法]] 列表。}} | ||
{{Example|1= | {{Example|1= | ||
+ | <code> | ||
+ | for(var i =0;i<10;i++) {{key|ggbApplet}}.[[:en:Reference:JavaScript#Available_Methods|evalCommand]]("A_"+i+"=(random()*10,random()*10)"); | ||
+ | </code> | ||
+ | |||
+ | 這段程式會畫出 10 個點:''A<sub>0</sub>'' 到 ''A<sub>9</sub>'',其座標均由亂數產生。 | ||
+ | }} | ||
+ | |||
+ | GeoGebra 擁有自己的 JavaScript 編譯程式。當我們要將 GeoGebra [[匯出網頁]]時,我們可以選擇要使用 GeoGebra 自己的編譯程式還是瀏覽器的編譯程式。如果你直接在 HTML 網頁碼中編輯 JavaScript 的話,記得要先執行:<code>{{key|ggbApplet}} = document.applets[0];</code> 否則 {{key|ggbApplet}} 物件無法自行啟動。 | ||
+ | |||
+ | ===全域 JavaScript=== | ||
+ | [[File:GlobalJavascriptPanel.png|right]]在「[[屬性]]」視窗的「全域 JavaScript」頁面中, 你可以編寫一些 JavaScript 函數或作一些全域變數設定,GeoGebra 會在載入物件前,先執行這裡的程式碼。 「全域 JavaScript」頁面不特屬於任何物件,所以不管你打開哪個物件的屬性視窗,都會看到這個頁面。 | ||
+ | |||
+ | |||
+ | 你也可以在這裡面定義 {{key|ggbOnInit}}() 函數,此函數會在 GeoGebra 載入所有物件後馬上執行,因此我們常在這個函數中放入一些物件的相關觸發程序(JavaScript listeners),下面就是一個例子: | ||
+ | {{example|1= | ||
<pre> | <pre> | ||
− | + | function ggbOnInit(){ | |
− | + | // 當有物件新增(如新增一個點或一條線等)時,就會觸發 onAdd() 函數。 | |
+ | ggbApplet.registerAddListener("onAdd"); | ||
+ | } | ||
+ | |||
+ | function onAdd(objName){ | ||
+ | alert("物件:"+objName+" 已新增!"); | ||
+ | } | ||
</pre> | </pre> | ||
+ | 首先,我們在系統內定的 {{key|ggbOnInit}}() 函數中利用 [[:en:Reference:JavaScript#GeoGebraApplet_to_JavaScript_Communication|registerAddListener]]() 函數指定了一個「新增物件」的觸發程序,這行指令告訴系統:只要有物件新增了,就啟動 onAdd() 函數,系統同時會將新增物件的名稱丟給這個函數(也就是範例中的 objName,這個名稱不是關鍵字,你也可以用 name、obj 或其他變數名稱都可以),以方便後續的處理。 | ||
− | + | onAdd() 函數是使用者自訂的,所以你也可以將函數名稱改為 doSomething(),或其他名稱。 | |
+ | |||
+ | 當我們寫好了這段程式,然後將檔案存檔再重新開啟,系統就會載入 {{key|ggbOnInit}}() 函數。之後,假設我們新增了一點 A ,onAdd() 函數就會執行,然後顯示出「物件:A 已新增!」的訊息。 | ||
}} | }} | ||
− | + | 除了指定「新增物件」的觸發程序外,我們也可以指定諸如「改名」、「刪除」、「清除全部物件」等等事件的觸發程序,完整的說明請看[[:en:Reference:JavaScript#GeoGebraApplet_to_JavaScript_Communication|這裡]] 。 | |
− | + | {{Hint|JavaScript 函數的啟動順序如下: | |
− | + | {{key|全域 JavaScript|red}}(ggbOnInit 除外)⇨ 載入物件 ⇨ {{key|ggbOnInit}}() 函數 | |
+ | |||
+ | 因此請勿在全域 JavaScript 中直接呼叫 {{key|ggbApplet}} 的物件方法,因為在 GeoGebra 尚未載入物件完成前,{{key|ggbApplet}} 物件根本就還沒產生,所以也沒辦法呼叫它。}} | ||
+ | |||
+ | |||
+ | {{example|1= 當 GeoGebra 中有物件新增、變更、或刪除時,將其狀態顯示於其他網頁元件上。 | ||
+ | * 請看示範網頁:[http://www.geogebra.org/source/program/applet/geogebra_applet_java2javascript.htm ggbApplet 與 JavaScript 之間的互動]。 | ||
+ | }} | ||
+ | 以下為此網頁的 JavaScript 程式部份: | ||
<pre> | <pre> | ||
− | function | + | <script type="text/javascript"> |
− | + | ||
+ | function ggbOnInit() { | ||
+ | // 指定「新增物件、刪除物件、變更名稱、清除繪圖區、物件更新」等事件的觸發程序。 | ||
+ | var applet = document.ggbApplet; | ||
+ | applet.registerAddListener("addListener"); | ||
+ | applet.registerRemoveListener("removeListener"); | ||
+ | applet.registerRenameListener("renameListener"); | ||
+ | applet.registerClearListener("clearListener"); | ||
+ | applet.registerUpdateListener("updateListener"); | ||
+ | } | ||
+ | |||
+ | var strLength = 150; | ||
+ | function addListener(objName) { | ||
+ | document.listenerForm.textarea1.value = "add: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength ); | ||
+ | printConstructionState(); | ||
+ | } | ||
+ | |||
+ | function removeListener(objName) { | ||
+ | document.listenerForm.textarea1.value = "remove: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength ); | ||
+ | printConstructionState(); | ||
+ | } | ||
+ | |||
+ | function renameListener(oldObjName, newObjName) { | ||
+ | document.listenerForm.textarea1.value = "rename: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength ); | ||
+ | printConstructionState(); | ||
} | } | ||
− | function | + | function updateListener(objName) { |
− | + | strVal = document.ggbApplet.getValueString(objName); | |
+ | document.listenerForm.textarea2.value = strVal + "\n" + document.listenerForm.textarea2.value.substring(0, strLength ); | ||
+ | } | ||
+ | |||
+ | function clearListener() { | ||
+ | document.listenerForm.textarea1.value = ""; | ||
+ | document.listenerForm.textarea2.value = ""; | ||
+ | document.listenerForm.textarea1.value = "construction cleared"; | ||
+ | document.listenerForm.consState.value = ""; | ||
+ | } | ||
+ | |||
+ | function printConstructionState() { | ||
+ | var applet = document.ggbApplet; | ||
+ | var objNumber = applet.getObjectNumber(); | ||
+ | var strState = "Number of objects: " + objNumber; | ||
+ | |||
+ | for (i=0; i < objNumber; i++) { | ||
+ | strName = applet.getObjectName(i); | ||
+ | strType = applet.getObjectType(strName); | ||
+ | strCommand = applet.getCommandString(strName); | ||
+ | strState += "\n" + strType + " " + strName + ", " + strCommand; | ||
+ | } | ||
+ | document.listenerForm.consState.value = strState; | ||
} | } | ||
+ | </script> | ||
</pre> | </pre> | ||
− | |||
− | |||
− | |||
===USB Data Logging (From GeoGebra 4.2)=== | ===USB Data Logging (From GeoGebra 4.2)=== | ||
For logging data from some Vernier USB Data Loggers, eg ''Go!Motion'' and ''Go!Temp'' one can define a logger listener using the registerLoggerListener method. Such listener can look like this: | For logging data from some Vernier USB Data Loggers, eg ''Go!Motion'' and ''Go!Temp'' one can define a logger listener using the registerLoggerListener method. Such listener can look like this: |
2011年12月21日 (三) 15:57的最新版本
GeoGebra 支援兩種程式語言 - GGBScript 和 Javascript。我們可以在下列的事件中編寫相對的觸發程序:
- 用滑鼠點選某物件時 (On Click)
- 某物件數值或屬性變更時 (On Update, ...)
- 開啟 GeoGebra 檔案時 (ggbOnInit)
- Javascript 觸發程序 (listener),詳情請參考 JavaScript。
我們可以透過物件屬性視窗中的「程式」頁面來編寫程式碼。
GGBScript
GGBScript 主要是用 GeoGebra 本身的指令來編寫。
JavaScript
JavaScript 是一種常用於網頁中的程式語言。不像 GGBScript 只能依序執行一些 GeoGebra 指令而己,JavaScript 可以使用 if、while、for 等關鍵字來控制程式的流程。
我們也可以使用一些特別的 JavaScript 函數來作圖,這些函數都是 ggbApplet 的物件方法,也就是說我們必須使用:ggbApplet.method(a, b, ...)
這樣的語法來呼叫這些函數才行。
for(var i =0;i<10;i++) ggbApplet.evalCommand("A_"+i+"=(random()*10,random()*10)");
GeoGebra 擁有自己的 JavaScript 編譯程式。當我們要將 GeoGebra 匯出網頁時,我們可以選擇要使用 GeoGebra 自己的編譯程式還是瀏覽器的編譯程式。如果你直接在 HTML 網頁碼中編輯 JavaScript 的話,記得要先執行:ggbApplet = document.applets[0];
否則 ggbApplet 物件無法自行啟動。
全域 JavaScript
在「屬性」視窗的「全域 JavaScript」頁面中, 你可以編寫一些 JavaScript 函數或作一些全域變數設定,GeoGebra 會在載入物件前,先執行這裡的程式碼。 「全域 JavaScript」頁面不特屬於任何物件,所以不管你打開哪個物件的屬性視窗,都會看到這個頁面。
你也可以在這裡面定義 ggbOnInit() 函數,此函數會在 GeoGebra 載入所有物件後馬上執行,因此我們常在這個函數中放入一些物件的相關觸發程序(JavaScript listeners),下面就是一個例子:
function ggbOnInit(){ // 當有物件新增(如新增一個點或一條線等)時,就會觸發 onAdd() 函數。 ggbApplet.registerAddListener("onAdd"); } function onAdd(objName){ alert("物件:"+objName+" 已新增!"); }
首先,我們在系統內定的 ggbOnInit() 函數中利用 registerAddListener() 函數指定了一個「新增物件」的觸發程序,這行指令告訴系統:只要有物件新增了,就啟動 onAdd() 函數,系統同時會將新增物件的名稱丟給這個函數(也就是範例中的 objName,這個名稱不是關鍵字,你也可以用 name、obj 或其他變數名稱都可以),以方便後續的處理。
onAdd() 函數是使用者自訂的,所以你也可以將函數名稱改為 doSomething(),或其他名稱。
當我們寫好了這段程式,然後將檔案存檔再重新開啟,系統就會載入 ggbOnInit() 函數。之後,假設我們新增了一點 A,onAdd() 函數就會執行,然後顯示出「物件:A 已新增!」的訊息。除了指定「新增物件」的觸發程序外,我們也可以指定諸如「改名」、「刪除」、「清除全部物件」等等事件的觸發程序,完整的說明請看這裡。
全域 JavaScript(ggbOnInit 除外)⇨ 載入物件 ⇨ ggbOnInit() 函數
因此請勿在全域 JavaScript 中直接呼叫 ggbApplet 的物件方法,因為在 GeoGebra 尚未載入物件完成前,ggbApplet 物件根本就還沒產生,所以也沒辦法呼叫它。
- 請看示範網頁:ggbApplet 與 JavaScript 之間的互動。
以下為此網頁的 JavaScript 程式部份:
<script type="text/javascript"> function ggbOnInit() { // 指定「新增物件、刪除物件、變更名稱、清除繪圖區、物件更新」等事件的觸發程序。 var applet = document.ggbApplet; applet.registerAddListener("addListener"); applet.registerRemoveListener("removeListener"); applet.registerRenameListener("renameListener"); applet.registerClearListener("clearListener"); applet.registerUpdateListener("updateListener"); } var strLength = 150; function addListener(objName) { document.listenerForm.textarea1.value = "add: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength ); printConstructionState(); } function removeListener(objName) { document.listenerForm.textarea1.value = "remove: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength ); printConstructionState(); } function renameListener(oldObjName, newObjName) { document.listenerForm.textarea1.value = "rename: " + objName + "\n" + document.listenerForm.textarea1.value.substring(0, strLength ); printConstructionState(); } function updateListener(objName) { strVal = document.ggbApplet.getValueString(objName); document.listenerForm.textarea2.value = strVal + "\n" + document.listenerForm.textarea2.value.substring(0, strLength ); } function clearListener() { document.listenerForm.textarea1.value = ""; document.listenerForm.textarea2.value = ""; document.listenerForm.textarea1.value = "construction cleared"; document.listenerForm.consState.value = ""; } function printConstructionState() { var applet = document.ggbApplet; var objNumber = applet.getObjectNumber(); var strState = "Number of objects: " + objNumber; for (i=0; i < objNumber; i++) { strName = applet.getObjectName(i); strType = applet.getObjectType(strName); strCommand = applet.getCommandString(strName); strState += "\n" + strType + " " + strName + ", " + strCommand; } document.listenerForm.consState.value = strState; } </script>
USB Data Logging (From GeoGebra 4.2)
For logging data from some Vernier USB Data Loggers, eg Go!Motion and Go!Temp one can define a logger listener using the registerLoggerListener method. Such listener can look like this:
function logger(value) { var d = value * 1; ggbApplet.evalCommand("(CopyFreeObject[a],"+d+")"); ggbApplet.evalCommand("SetValue[a,a+1]"); }
This script assumes that there is a free number a in the construction. Each time number d is logged, point (a,d) is constructed and a is increased.