⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xcalc.pro

📁 IDL开发的小型的计算器
💻 PRO
字号:
;+
; 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -