- 编写计算器界面程序
一、计算器程序功能
基本运算:
支持加(+)、减(-)、乘(×)、除(÷)、取余(%)运算
-
完整界面:包含数字键0-9、小数点、等号
-
控制功能:清除©、退格(⌫)
-
显示区域:顶部显示计算结果和输入
二、实现
使用鼠标点击按钮,当是数字键时累加显示到edit中。
- 使用lastNum存储第一个数据。使用op存储运算符。
- 当按键是=时,计算结果。
- 退格实现,先检查edit中字符个数是否大于1,大于则去掉最后一位,实现退格。同时更新edit显示,并把isNewNum置为假。
三、import导入库
import 语句将一个外部命名空间导入到当前命名空间。
import 语句首先会在当前命名空间下查找同名对象是否存在,查找时不会触发命名空间的元方法,如果同名对象已经存在并且不是指向相同的库 - 则会报错。import保证不会在同一线程重复加载相同的库。外部库内的代码在一个线程中仅运行一次。
- import 语句内使用的库命名空间第一个字符不能为下划线 _。
- aardio的库有三种:
- 内置库(Builtin Libraries)
- 公共库(Common libraries)
- •用户库(User Libraries)
四、程序
//创建一个功能完整的aardio计算器界面程序
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio 计算器";right=319;bottom=444;bgcolor=0xFFFFFF;border="dialog";max=false)
winform.add(
btn0={cls="plus";text="0";left=11;top=383;right=164;bottom=431;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=14};
btn1={cls="plus";text="1";left=11;top=328;right=85;bottom=376;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=1};
btn2={cls="plus";text="2";left=90;top=328;right=164;bottom=376;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=2};
btn3={cls="plus";text="3";left=169;top=328;right=243;bottom=376;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=3};
btn4={cls="plus";text="4";left=11;top=273;right=85;bottom=321;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=4};
btn5={cls="plus";text="5";left=90;top=273;right=164;bottom=321;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=5};
btn6={cls="plus";text="6";left=169;top=273;right=243;bottom=321;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=6};
btn7={cls="plus";text="7";left=11;top=218;right=85;bottom=266;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=7};
btn8={cls="plus";text="8";left=90;top=218;right=164;bottom=266;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=8};
btn9={cls="plus";text="9";left=169;top=218;right=243;bottom=266;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=9};
btnAdd={cls="plus";text="+";left=248;top=328;right=308;bottom=376;bgcolor=0xDDDDDD;font=LOGFONT(h=-19);z=13};
btnBack={cls="plus";text='\u232B';left=92;top=164;right=166;bottom=212;bgcolor=0xCEC0C0;font=LOGFONT(h=-19);z=20};
btnC={cls="plus";text="C";left=11;top=163;right=85;bottom=211;bgcolor=0xC0C0C0;font=LOGFONT(h=-19);z=18};
btnDiv={cls="plus";text="÷";left=248;top=163;right=308;bottom=211;bgcolor=0xDDDDDD;font=LOGFONT(h=-19);z=10};
btnDot={cls="plus";text=".";left=169;top=383;right=243;bottom=431;bgcolor=0xEAEAEA;font=LOGFONT(h=-19);z=15};
btnEqual={cls="plus";text="=";left=248;top=383;right=308;bottom=431;bgcolor=0xFF9900;color=0xFFFFFF;font=LOGFONT(h=-19);z=16};
btnMod={cls="plus";text="%";left=168;top=164;right=242;bottom=212;bgcolor=0xEADDDD;font=LOGFONT(h=-19);z=19};
btnMul={cls="plus";text="×";left=248;top=218;right=308;bottom=266;bgcolor=0xDDDDDD;font=LOGFONT(h=-19);z=11};
btnSub={cls="plus";text="-";left=248;top=273;right=308;bottom=321;bgcolor=0xDDDDDD;font=LOGFONT(h=-19);z=12};
edit={cls="edit";text="0";left=11;top=21;right=308;bottom=145;align="right";border=1;edge=1;font=LOGFONT(h=-43);readonly=1;z=17}
)
/*}}*/
var lastNum = 0; // 存储上一次输入的数字
var op = ""; // 存储当前操作符
var isNewNum = true; // 标记是否开始输入新数字
var currentNum = 0; // 存储当前输入的数字
// 计算逻辑
var calculate = function(){
currentNum = tonumber(winform.edit.text) || 0;
select(op) {
case "+" { lastNum = lastNum + currentNum; }
case "-" { lastNum = lastNum - currentNum; }
case "×" { lastNum = lastNum * currentNum; }
case "%" {lastNum = lastNum % currentNum; }
case "÷" {
if(currentNum != 0) lastNum = lastNum / currentNum;
else {
winform.edit.text = "Error";
isNewNum = true;
return;
}
}
else { lastNum = currentNum; }
}
winform.edit.text = tostring(lastNum);
}
// 批量注册数字键响应
var btns = {
winform.btn0, winform.btn1, winform.btn2, winform.btn3,
winform.btn4, winform.btn5, winform.btn6, winform.btn7,
winform.btn8, winform.btn9
};
for(i=1;#btns;1){
var btn = btns[i];
btn.oncommand = function(){
if(isNewNum){
winform.edit.text = owner.text;
isNewNum = false;
}
else {
if(winform.edit.text == "0") winform.edit.text = owner.text;
else winform.edit.text = winform.edit.text ++ owner.text;
}
}
}
// 运算符响应
var setOperator = function(nextOp){
calculate();
op = nextOp;
isNewNum = true;
}
winform.btnAdd.oncommand = function(){ setOperator("+") }
winform.btnSub.oncommand = function(){ setOperator("-") }
winform.btnMul.oncommand = function(){ setOperator("×") }
winform.btnDiv.oncommand = function(){ setOperator("÷") }
winform.btnMod.oncommand = function(){ setOperator("%") }
winform.btnEqual.oncommand = function(){
calculate();
op = "";
isNewNum = true;
}
winform.btnDot.oncommand = function(){
if(isNewNum) {
winform.edit.text = "0.";
isNewNum = false;
}
elseif( !string.find(winform.edit.text, "\.") ){
winform.edit.text = winform.edit.text ++ ".";
}
}
winform.btnC.oncommand = function(){
winform.edit.text = "0";
lastNum = 0;
op = "";
isNewNum = true;
}
// 退格
winform.btnBack.oncommand = function(){
var currentText = tostring(winform.edit.text)
if(#currentText > 1){
currentText = string.left(currentText,#currentText-1);
}
else {
currentText = "0";
isNewInput = true;
}
winform.edit.text =currentText ;
isNewNum = false;
}
// 设置按钮交互样式
for(name,ctrl in winform.eachControl("plus")) {
ctrl.skin({
background = {
hover = 0xFFDCDCDC;
active = 0xFFB4B4B4;
}
})
}
winform.show();
win.loopMessage();
