“編寫程式”的版本间的差异
Pegasusroe(讨论 | 贡献) 小 (→JavaScript) |
Pegasusroe(讨论 | 贡献) |
||
第15行: | 第15行: | ||
* 最後,調整 a 值就可以改變它的[[:en:Reference:Colors|顏色]]。</div>}} | * 最後,調整 a 值就可以改變它的[[:en:Reference:Colors|顏色]]。</div>}} | ||
{{Hint|有些指令只能用於 GGBScript 中,詳情請參閱:[[GGB 程式碼 指令|GGBScript 指令]]}} | {{Hint|有些指令只能用於 GGBScript 中,詳情請參閱:[[GGB 程式碼 指令|GGBScript 指令]]}} | ||
+ | {{Hint|有關顏色的名稱與編碼,請參閱:[[:en:Reference:Colors|完整的顏色列表]]}} | ||
{{Youtube|title=以 SetColor 指令動態改變顏色|url=http://www.youtube.com/watch?v=xpV2L5CAtM8}} | {{Youtube|title=以 SetColor 指令動態改變顏色|url=http://www.youtube.com/watch?v=xpV2L5CAtM8}} | ||
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.