?? xcalc.pro
字號(hào):
;+
; NAME:
; XCALC
;
; PURPOSE:
;
; This widget program simulates the operation of a simple calculator.
;
; AUTHOR:
;
; Robert M. Dimeo, Ph.D.
; NIST Center for Neutron Research
; 100 Bureau Drive
; Gaithersburg, MD 20899
; Phone: (301) 975-8135
; E-mail: robert.dimeo@nist.gov
; http://www.ncnr.nist.gov/staff/dimeo
;
; CATEGORY:
;
; Widgets
;
; CALLING SEQUENCE:
;
; XCALC
;
;
; INPUT FIELDS:
;
; NONE
;
; DISCLAIMER
;
; This software is provided as is without any warranty whatsoever.
; Permission to use, copy, modify, and distribute modified or
; unmodified copies is granted, provided this disclaimer
; is included unchanged.
;
; MODIFICATION HISTORY:
;
; Written by Rob Dimeo, November 6, 2002.
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro xcalcCleanup,tlb
widget_control,tlb,get_uvalue = pState
ptr_free,pState
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro xcalcQuit,event
widget_control,event.top,/destroy
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro xcalc_event,event
uname = widget_info(event.id,/uname)
widget_control,event.top,get_uvalue = pState
case strupcase(uname) of
'QUIT': widget_control,event.top,/destroy
'CLEAR': begin
(*pState).val1 = 0.0
(*pState).val2 = 0.0
widget_control,(*pState).inField, $
set_value = strtrim(string((*pState).val1),2)
(*pState).op = ''
(*pState).valEntry = 0
end
'INVERSE': begin
widget_control,(*pState).inField,get_value = val
(*pState).val1 = 1.0/float(val[0])
widget_control,(*pState).inField, $
set_value = strtrim(string((*pState).val1),2)
(*pState).op = ''
(*pState).valEntry = 0
end
'SQRT': begin
widget_control,(*pState).inField,get_value = val
(*pState).val1 = sqrt(float(val[0]))
widget_control,(*pState).inField, $
set_value = strtrim(string((*pState).val1),2)
(*pState).op = ''
(*pState).valEntry = 0
end
'ADD': begin
widget_control,(*pState).inField,get_value = val
(*pState).val1 = float(val[0])
widget_control,(*pState).inField, $
set_value = strtrim(string((*pState).val1),2)
(*pState).op = '+'
(*pState).valEntry = 0
end
'SUBTRACT': begin
widget_control,(*pState).inField,get_value = val
(*pState).val1 = float(val[0])
widget_control,(*pState).inField, $
set_value = strtrim(string((*pState).val1),2)
(*pState).op = '-'
(*pState).valEntry = 0
end
'DIVIDE': begin
widget_control,(*pState).inField,get_value = val
(*pState).val1 = float(val[0])
widget_control,(*pState).inField, $
set_value = strtrim(string((*pState).val1),2)
(*pState).op = '/'
(*pState).valEntry = 0
end
'MULTIPLY': begin
widget_control,(*pState).inField,get_value = val
(*pState).val1 = float(val[0])
widget_control,(*pState).inField, $
set_value = strtrim(string((*pState).val1),2)
(*pState).op = '*'
(*pState).valEntry = 0
end
'EQUALS': begin
if (*pState).op eq '' then return
widget_control,(*pState).inField,get_value = val
(*pState).val2 = float(val[0])
expr = string((*pState).val1)+(*pState).op+string((*pState).val2)
r = execute('y='+expr,1)
(*pState).val1 = y
widget_control,(*pState).inField, $
set_value = strtrim(string((*pState).val1),2)
(*pState).op = ''
(*pState).val2 = 0.0
(*pState).valEntry = 0
end
else:
endcase
theseVals = ['1','2','3','4','5','6','7','8','9','0','.']
ok = where(theseVals eq strupcase(uname),count)
if count gt 0 then begin
widget_control,(*pState).inField,get_value = val
; How many decimal points have been used?
decPos = strpos(val[0],'.')
if (decPos[0] ne -1) and strupcase(uname) eq '.' then return
if (float(val[0]) eq 0.0) or (*pState).valEntry eq 0 then begin
widget_control,(*pState).inField,set_value = uname
(*pState).valEntry = 1
endif else begin ; append number
outVal = strtrim(val[0]+uname,2)
widget_control,(*pState).inField,set_value = outVal
endelse
endif
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
pro xcalc
; Widget definition module
tlb = widget_base(/col,title = 'Calculator Utility',tlb_frame_attr = 1)
thisFont = "Comic Sans MS*20*Bold"
if !d.name ne 'WIN' then begin
inField = widget_text(tlb,xsize = xsize,value = strtrim(string(0.0),2))
endif else begin
inField = widget_text(tlb,xsize = xsize,value = strtrim(string(0.0),2), $
font = thisFont)
endelse
xsize = 60 & ysize = 50
row1 = widget_base(tlb,/row)
b = widget_button(row1,value = '7',uname = '7',xsize = xsize,ysize = ysize)
b = widget_button(row1,value = '8',uname = '8',xsize = xsize,ysize = ysize)
b = widget_button(row1,value = '9',uname = '9',xsize = xsize,ysize = ysize)
b = widget_button(row1,value = '/',uname = 'divide',xsize = xsize,ysize = ysize)
b = widget_button(row1,value = 'AC',uname = 'clear',xsize = xsize,ysize = ysize)
row2 = widget_base(tlb,/row)
b = widget_button(row2,value = '4',uname = '4',xsize = xsize,ysize = ysize)
b = widget_button(row2,value = '5',uname = '5',xsize = xsize,ysize = ysize)
b = widget_button(row2,value = '6',uname = '6',xsize = xsize,ysize = ysize)
b = widget_button(row2,value = '*',uname = 'multiply',xsize = xsize,ysize = ysize)
b = widget_button(row2,value = '.',uname = '.',xsize = xsize,ysize = ysize)
row3 = widget_base(tlb,/row)
b = widget_button(row3,value = '1',uname = '1',xsize = xsize,ysize = ysize)
b = widget_button(row3,value = '2',uname = '2',xsize = xsize,ysize = ysize)
b = widget_button(row3,value = '3',uname = '3',xsize = xsize,ysize = ysize)
b = widget_button(row3,value = '+',uname = 'add',xsize = xsize,ysize = ysize)
b = widget_button(row3,value = 'EXIT',uname = 'quit',xsize = xsize,ysize = ysize)
row4 = widget_base(tlb,/row)
b = widget_button(row4,value = '0',uname = '0',xsize = xsize,ysize = ysize)
b = widget_button(row4,value = 'SQRT',uname = 'sqrt',xsize = xsize,ysize = ysize)
b = widget_button(row4,value = '1/x',uname = 'inverse',xsize = xsize,ysize = ysize)
b = widget_button(row4,value = '-',uname = 'subtract',xsize = xsize,ysize = ysize)
b = widget_button(row4,value = '=',uname = 'equals',xsize = xsize,ysize = ysize)
widget_control,tlb,/realize
state = { inField:inField, $
val1:0.0, $
val2:0.0, $
valEntry:0, $
op:''}
pState = ptr_new(state,/no_copy)
widget_control,tlb,set_uvalue = pState,/no_copy
xmanager,'xcalc',tlb,/no_block,cleanup = 'xcalcCleanup'
end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -