2012-03-16 9 views
0

私は完全にactionscriptで電卓を作成していますが、ステージングエリアには何もありません。これまで私は計算を実行するまでです。しかし、私は問題を抱えているようです。AS3電卓

import flash.events.MouseEvent; 

var btn:Array = new Array(); 

for(var i = 0; i < 10; i++) { 
var myBtn:Btn = new Btn(); 
myBtn.y = 15; 
myBtn.x = i * 100 + 15; 
myBtn.width = 48; 
myBtn.height = 48; 
myBtn.buttonMode = true; 
myBtn.mouseChildren = false; 
myBtn.num = Number(i); 
myBtn.caption.text = String (i); 
addChild(myBtn); 
btn.push(myBtn); 
btn[i].addEventListener(MouseEvent.CLICK,pressNumber);//EVENT TO ADD NUMBERS TO  DISPLAY 

} 
btn[0].y += 370; 
btn[0].x += 10; 

btn[1].y += 310; 
btn[1].x += -90; 

btn[2].y += 310; 
btn[2].x += -130; 

btn[3].y += 310; 
btn[3].x += -170; 

btn[4].y += 250; 
btn[4].x += -390; 

btn[5].y += 250; 
btn[5].x += -430; 

btn[6].y += 250; 
btn[6].x += -470; 

btn[7].y += 190; 
btn[7].x += -690; 

btn[8].y += 190; 
btn[8].x += -730; 

btn[9].y += 190; 
btn[9].x += -770; 

//OPERATORS// 
var operators:Array = new Array(); 
for(var io:int = 0; io < 6; io++) { 
var opBtn:Btn_operator = new Btn_operator(); 
opBtn.width = 48; 
opBtn.height = 48; 
opBtn.buttonMode = true; 
opBtn.mouseChildren = false; 
opBtn.caption_op.text = String ("."); 
addChild(opBtn); 
operators.push(opBtn); 
operators[io].addEventListener(MouseEvent.CLICK, pressOperator);//EVENT TO ADD OPERATORS TO DISPLAY 
} 

//ADD DOT 
var dot:Btn_dot = new Btn_dot(); 
dot.width = 48; 
dot.height = 48; 
dot.buttonMode = true; 
dot.mouseChildren = false; 
dot.caption_op.text = String ("."); 
addChild(dot); 

dot.y += 383; 
dot.x += 78; 
dot.addEventListener(MouseEvent.CLICK, addDot);//EVENT TO ADD DOT TO DISPLAY 

//BACKSPACE 
var goBack:Btn_backspace = new Btn_backspace(); 
goBack.width = 48; 
goBack.height = 48; 
goBack.buttonMode = true; 
goBack.mouseChildren = false; 
goBack.caption_op.text = String ("<--"); 
addChild(goBack); 

goBack.y += 203; 
goBack.x += 256; 
goBack.addEventListener(MouseEvent.CLICK, backSpace);//EVENT TO GO BACK SPACE IN DISPLAY 

//BACKSPACE 
var clearAll:Btn_clear = new Btn_clear(); 
clearAll.width = 48; 
clearAll.height = 48; 
clearAll.buttonMode = true; 
clearAll.mouseChildren = false; 
clearAll.caption_op.text = String ("C"); 
addChild(clearAll); 


clearAll.y += 323; 
clearAll.x += 256; 
clearAll.addEventListener(MouseEvent.CLICK, clearFields);//EVENT TO GO BACK SPACE IN DISPLAY 

operators[0].y += 383; 
operators[0].x += 138; 
operators[0].caption_op.text = String("="); 

operators[1].y += 383; 
operators[1].x += 198; 
operators[1].caption_op.text = String("/"); 

operators[2].y += 323; 
operators[2].x += 198; 
operators[2].caption_op.text = String("*"); 

operators[3].y += 263; 
operators[3].x += 198; 
operators[3].caption_op.text = String("-"); 

operators[4].y += 203; 
operators[4].x += 198; 
operators[4].caption_op.text = String("+"); 

operators[5].y += 263; 
operators[5].x += 256; 
operators[5].caption_op.text = String("-/+"); 


//VARIABLE HANDLE OPERATION NOT BUTTON 
var operate:String; 

//HANDLE FIRST AND SECOND VALUE 
var num1:Number; 
var num2:Number; 

//grouping all buttons in function 


//display_txt.text = "0"; 
//DISPLAYING NUMBERS IN DISPLAY 
//var numberEntered:String =""; 
function pressNumber(e:MouseEvent):void{ 
     display_txt.appendText(e.target.num); 
} 

//DISPLAY OPERATORS 
function pressOperator(event:MouseEvent):void{ 
var operatorEntered:String; 
trace("a",display_txt.text,display_txt.text.length,event.currentTarget.caption_op.t  ext,event.currentTarget.caption_op.text.length); 
display_txt.appendText(event.currentTarget.caption_op.text); 
//CHECKING FOR VALUES AND STORING NUMBERS 
trace("b",display_txt.text);   
if(isNaN(num1)){ 
    //CONVERT STRING TO NUMBER 
    num1=Number(display_txt.text); 
    operate = operatorEntered; 
    display_txt.text = ""; 
    //trace(num1,isNaN(num1)); // if this outputs some number and true, display_txt an   html enabled textfield, has kerning enabled or is a multiline textfield. fix that. 
} 
else if(isNaN(num2)){ 
    num2 = Number(display_txt.text); 
    //trace(num1,isNaN(num2)); // if this outputs some number and true,  display_txt an html enabled textfield, has kerning enabled or is a multiline textfield. fix that. 
    performCalculation(); 
    operate = operatorEntered; 
} 
} 


//CLEARS DISPLAY AREA 
function clearFields(event:MouseEvent):void{ 
display_txt.text = ""; 
num1=NaN; 
num2=NaN; 
} 

//ADDS DECIMAL PLACE 
function addDot(event:MouseEvent):void{ 
if(event.target.num == Number(display_txt.text)) 
{ 
display_txt.text = "0"; 
} 
if (display_txt.text.indexOf(".")==-1){ 
    display_txt.appendText("."); 
} 

} 
//BACKSPACE DISPLAY AREA 
function backSpace(e:MouseEvent):void{ 
var temp_str:String = display_txt.text; 
display_txt.text = temp_str.substr(0, (temp_str.length-1)); // Get rid of last  character in the string, which in this case is the phantom \r or \n character 
} 

function performCalculation():void{ 

switch (operate){ 
case "multiply": 
    num1*=num2; 
break; 
case "divide": 
    num1/=num2; 
break; 
case "subtract": 
    num1-=num2; 
break; 
case "add": 
    num1+=num2; 
break; 
    default: 
break; 
} 
//now that we found out the result 
//let's display on the window 
display_txt.text=String(num1); 
num2=NaN; 

} 

それは計算を実行していないようですし、以下のコードでは、計算を実行する関数を呼び出すことを意味しているが、それはしません。私のコードのサンプルは以下の通りですこれをやっているようです。num1をトレースしようとすると、演算子をクリックしたときに最後に押されたボタンを表示するためのNaNとして出力されます。

function pressOperator(event:MouseEvent):void{ 
var operatorEntered:String; 
trace("a",display_txt.text,display_txt.text.length,event.currentTarget.caption_op.t ext,event.currentTarget.caption_op.text.length); 
display_txt.appendText(event.currentTarget.caption_op.text); 
//CHECKING FOR VALUES AND STORING NUMBERS 
trace("b",display_txt.text);   
if(isNaN(num1)){ 
    //CONVERT STRING TO NUMBER 
    num1=Number(display_txt.text); 
    operate = operatorEntered; 
    display_txt.text = ""; 
    //trace(num1,isNaN(num1)); // if this outputs some number and true, display_txt an  html enabled textfield, has kerning enabled or is a multiline textfield. fix that. 
} 
else if(isNaN(num2)){ 
    num2 = Number(display_txt.text); 
    //trace(num1,isNaN(num2)); // if this outputs some number and true,  display_txt an html enabled textfield, has kerning enabled or is a multiline textfield. fix that. 
    performCalculation(); 
    operate = operatorEntered; 
} 
} 

私は、彼らは両方ともお互いに入っているが何も操作するためVARSに入っていないとoperatorEnteredされているので、それがNaNになると思います。どうすればそれを解決できますか?

+0

'String-> Number'を変換するには' Number(str_num) 'ではなく' parseInt(str_num) 'や' parseFloat(str_num) 'メソッドが必要です。 – Engineer

答えて

1

これはあなたの質問に直接答えないかもしれませんが、私は本当に "純粋な" ActionScript 3プロジェクトでドキュメントクラスを書く方法を見てみることをお勧めします。ちょっとだけ、あなたのコードを "強化"するだけではありません。しかし、あなたは問題の容易な発見に役立つより良いデバッグ機能を備えた適切なIDE(つまり、無料のFlashDevelop)を使用することもできます。

また、他の人に見てもらいたいコードを投稿する場合は、整形されていて読みやすい(少なくともインデントされていて、コメントが付いていることが望ましい)ことを確認してください。この場合、FLAファイル内のものを利用するので、コードをコピーしてフラッシュに貼り付けることはできません。 これらのすべての要因は、本当にあなたを助けることがとても難しいです。