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

📄 calcdlg.pro

📁 利用人工智能程序设计语言prolog编程实现的公式计算软件源代码。
💻 PRO
📖 第 1 页 / 共 3 页
字号:
%END calculator, idc_help _CtlInfo

%BEGIN calculator, idc_edit_finput modified
  dlg_calculator_eh(_Win,e_Control(idc_edit_finput,_CtrlType,_CtrlWin,modified),0):-
	form_info("editable"),
	Text=win_getText(_Ctrlwin),
	searchstring(Text,"\t",_),
	del_str(Text, "\t", Text1),
	win_settext(_CtrlWin,Text1),
	CmW=win_getCtlHandle(_win,idc_edit_fcommts),
	win_setfocus(Cmw),
	!.
  dlg_calculator_eh(_Win,e_Control(idc_edit_finput,_CtrlType,_CtrlWin,modified),0):-
	form_info("editable"),
	Text=win_getText(_Ctrlwin),
	searchstring(Text,"\n",_),
	del_str(Text, "\n", Text1),
	win_settext(_CtrlWin,Text1),
	CmW=win_getCtlHandle(_win,idc_edit_fcommts),
	win_setfocus(Cmw),
	!.
 dlg_calculator_eh(_Win,e_Control(idc_edit_finput,_CtrlType,_CtrlWin,modified),0):-%drect calc , finished input
	calc_info(1),
	Text=win_getText(_Ctrlwin),
	searchstring(Text,"\n",_),
	del_str(Text, "\n", Text1),
	win_settext(_CtrlWin,Text1),
	OkW=win_getCtlHandle(_win,idc_ok),
	win_sendEvent(_Win,e_Control(idc_ok,wc_PushButton,OkW,activated)),
	!.

%END calculator, idc_edit_finput modified

%BEGIN calculator, idc_edit_finput getfocus
/*
  dlg_calculator_eh(_Win,e_Control(idc_edit_finput,_CtrlType,_CtrlWin,getfocus),0):-!,
	calc_info(Info), %if direct calc not allowed,
	Info<>1, %not direct calc
	Info<>2,
	form_info("noedit"),
	dlg_note("如果希望修改公式,请按左边的\"改!\"键。"),
	!.
*/
%END calculator, idc_edit_finput getfocus



%BEGIN calculator, e_Destroy
  dlg_calculator_eh(_Win,e_Destroy,0):-
	retractall(f( _, _, _,_)),
	retractall(edit_win(_)),
	retractall(var_value(_,_, _)),
	retractall(calc_info(_)),
	retractall(form_info(_)),  %"editable", "noedit"
	retractall(modOrAddId(_)), %modify pb id or add f id
	retractall(fv_record(_,_,_,_)),
	retractall(record(_, _,_)),%general purpose	
	!.
%END calculator, e_Destroy

%BEGIN calculator, e_CloseRequest
  dlg_calculator_eh(_Win,e_CloseRequest,0):-
/*	_Answer=dlg_Ask("问题", "这样将退出公式计算程序。退出吗?", ["退出(&T)", "保留(&K)"]),
	_Answer<>resp_default,
	*/
	Pwin=win_getParent(_Win),
	win_sendEvent(Pwin,e_CloseRequest),
	!.
%END calculator, e_CloseRequest

%BEGIN calculator, idc_pb_copyres _CtlInfo
  dlg_calculator_eh(_Win,e_Control(idc_pb_copyres,_CtrlType,_CtrlWin,_CtlInfo),0):-
	 ResW =win_GetCtlHandle(_Win, idc_edit_res),
	ResStr=win_getText(ResW),
	fronttoken(ResStr,_,_),
	cb_PutString(ResStr),
	beep,
	dlg_note("结果已经被传送到剪贴板。可用编辑器的粘贴命令拷贝到文件中。"),
	!.
%END calculator, idc_pb_copyres _CtlInfo

%BEGIN calculator, idc_ok _CtlInfo
  dlg_calculator_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtlInfo),0):- %direct calc
	calc_info(What),
	What=1, %direct calc,just calc
	%get expr:
	FormWin=win_GetCtlHandle(_Win, idc_edit_finput),
	Expr=win_GetText(FormWin),
	%find var values:
	expr_val_loop(Expr,0,Res),
	str_real(ResStr,Res),
	 ResW =win_GetCtlHandle(_Win, idc_edit_res),
	format(DisPlay,"%-= %-",Expr,ResStr),
	win_setText(ResW, DisPlay),
	!.
dlg_calculator_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtlInfo),0):- %direct calc failed
	calc_info(What),
	What=1, !,%direct calc,just calc
	dlg_note("请查看算式是否有错!"),
	!.
  dlg_calculator_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtlInfo),0):-%fixed var, use old formu
	calc_info(Mode),
	Mode<>1,  %not direct calc, need variable extracting
	%get expr:
%	FormWin=win_GetCtlHandle(_Win, idc_edit_finput),
%	Expr0=win_GetText(FormWin),
	%find var values:
	fv_record(Mode,Expr0,VarList,_VarNum),
%	write("VarNum=",VarNum),nl,
%	f(_,Expr0,_ComstrList,VarList),!,	
	edit_win(EditWin),
%	edit_suspend(Editwin),
	trap(edit_FileHome( EditWin),_,true),
	retractall(var_value(_,_, _)),
	retractall(getval_rec(_,_,_,_,_)),
%	slist_length(VarList,IniLineSeq),
%	IniLineSeq=1000,
	assert(getval_rec(1,VarList,[],[],[])),
	get_varValue(EditWin,_VarValueList,VarValueSList,OutVarList),
%	write("VarList=", VarList, ", VarValuesList=",VarValueSList, ", OutVarList=", OutVarList),nl,
%	edit_resume(Editwin),
	%reput the cursor
	edit_fileHome(EditWin),
	edit_LineEnd(EditWin),
	%replace var in expr
	replace_str(Expr0,OutVarList, VarValueSList, "",Expr),
	%do calc
	expr_val_loop(Expr,0,Res),
	str_real(ResStr,Res),
	 ResW =win_GetCtlHandle(_Win, idc_edit_res),
	format(DisPlay,"%-= %-",Expr,ResStr),
	win_setText(ResW, DisPlay),
	!.
  dlg_calculator_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtlInfo),0):-%fixedand not fixed, failed
	calc_info(Mode),
	Mode<>1,  %not direct calc, need variable extracting
	beep,
	dlg_note("请查看公式是否有错!"),
	!.
  dlg_calculator_eh(_Win,e_Control(idc_ok,_CtrlType,_CtrlWin,_CtlInfo),0):- %when fail, don't close
  	!.
%END calculator, idc_ok _CtlInfo
%BEGIN calculator, idc_list_fnames selchanged
  dlg_calculator_eh(_Win,e_Control(idc_list_fnames,_CtrlType,_CtrlWin,selchanged),0):-
	form_info("noedit"),
	lbox_GetSel(_CtrlWin,ItemList,_IndexList),
	ItemList=[Item|_RList],
%	what_calc(Item,Mode),
	f(Item, OldFormu,CommentList1,OldVarList),
	%comments control:
	CommentList1=[Cm|CommentList2],
	slist_strplus(CommentList2, "\n",Cm, Commetstr),
	ComWin= win_GetCtlHandle(_Win, idc_edit_fcommts),
	set_win_textlist_Loop(ComWin, [Commetstr ]),
	%get original varlist and formu
	get_NewFV(Mode,OldFormu,NewFormu,OldVarList,NewVarlist,NewVarNum),
	fronttoken(NewFormu,_,_),!,
	retractall(fv_record(_,_,_,_)),
	assert(fv_record(Mode,NewFormu,NewVarList,NewVarNum)),
	F_Whandle= win_GetCtlHandle(_Win, idc_edit_finput),
	set_win_textlist_Loop(F_Whandle, [OldFormu]),
	%input edit win
	NewVarList=[Var|RVarList],
	slist_strplus(RVarList, "=\n",Var, VarStr),
	edit_win(EditWin),
	edit_PasteStr(EditWin, VarStr),
	ResWin=win_getCtlHandle(_win, idc_edit_res),
	win_SetText(ResWin,""),
	win_setFocus(EditWin),
	edit_lineEnd(EditWin),
	calc_info(CAlcInfo),
	set_focusYN(CalcInfo, F_WHandle),
	!.
  dlg_calculator_eh(_Win,e_Control(idc_list_fnames,_CtrlType,_CtrlWin,selchanged),0):-%has syntax error, above failed
	form_info("noedit"),
	lbox_GetSel(_CtrlWin,ItemList,_IndexList),
	ItemList=[Item|_RList],
	f(Item, _Formu,_,_),
	fronttoken(_Formu,_,_),
%	what_calc(Item,Mode),
	ini_fcalc(_Win,Item),
	!.
  dlg_calculator_eh(_Win,e_Control(idc_list_fnames,_CtrlType,_CtrlWin,selchanged),0):-%direct calc
%	form_info("editable"),
	F_W= win_GetCtlHandle(_Win, idc_edit_finput),
	win_setFocus(F_W),
	!.
%END calculator, idc_list_fnames selchanged

%BEGIN calculator, idc_cancel _CtlInfo
  dlg_calculator_eh(_Win,e_Control(idc_cancel,_CtrlType,_CtrlWin,_CtlInfo),0):-
	_Pwin=win_getParent(_Win),
	_Answer=dlg_Ask("问题", "这样将退出公式计算程序。退出吗?", ["退出(&T)", "保留(&K)"]),
	_Answer=resp_default,
	win_destroy(_Pwin),
	%	win_sendEvent(_Pwin, e_Menu(id_file_exit,1)),
	!.
 dlg_calculator_eh(_Win,e_Control(idc_cancel,_CtrlType,_CtrlWin,_CtlInfo),0):-
	!.
%END calculator, idc_cancel _CtlInfo


  dlg_calculator_eh(_,_,_):-!,fail.

%END_DLG calculator
%%%input win handler
/*
 input_handler(_Win,e_char(Char,_),0):- %test
 	Pos=edit_getPos(_Win),
% 	write("Char=", Char, ", Pos=", Pos),nl,
 	fail.
 input_handler(_Win,e_char(13,_),0):-
	form_info("editable"),
	Ans=dlg_ask("输入完了吗?", ["完了(&Y)" ,"没完(&N)"]),
	Ans=resp_default,
	modOrAddId(MAiD),
	PWin=win_getParent(_Win), 
	MAWin=win_getCtlHandle(Pwin,Maid),
	win_sendEvent(Pwin,e_Control(MAiD,wc_pushbutton,MAWin,activated)), 
	!.
*/	
 input_handler(_Win,e_char(13,_),0):-
	form_info("editable"),
	edit_win(Editwin),
	win_setfocus(EditWin),
	!.	
 input_handler(_Win,e_char(_,_),0):-
	calc_info(Mode),
	Mode=1,
	form_info("noedit"),
	beep,
	dlg_note("公式是不含变量的算式。"),
	PWin=win_getParent(_Win),
	Fwin=win_getCtlHandle(PWin,idc_edit_finput),
	trap(win_setFocus(FWin),_0,true),
	!.

 input_handler(_Win,e_char(13,_),0):-
	%get the line seq of current cursor
%	edit_Suspend(_Win),
	form_info("noedit"), %when add form pb not pushed
	edit_SelectCurLine(_Win),
	edit_Copy(_Win),
	Line=cb_GetString(),
	fronttoken(Line,T,_),
	Pwin=win_getParent(_Win),
%	FormWin=win_GetCtlHandle(PWin, idc_edit_finput),
%	Expr=win_GetText(FormWin),
%	f(_,Expr,_,VarList),
	fv_record(_,_,VarList,_VarNum),
	slist_member_pos(T,VarList,1,NowLineN),
	NowLineN>0,
	TotalLines=edit_GetNumberOfLines(_Win),
%	write("total lines=", TotalLines,",NowLine=",NowLineN),nl,
	NowLineN>=TotalLines-1,!,
	 OkWin =win_GetCtlHandle(PWin, idc_ok),
	win_sendEvent(PWin,e_Control(idc_ok,wc_PushButton,OkWin,activated)),
%	edit_Resume(_Win),
	win_setfocus(_win),
%	dlg_note("next line end"),
	!.
 input_handler(_Win,e_char(13,_),0):-
	form_info("noedit"), %when add form pb not pushed
	edit_Down( _Win ),
	edit_LineEnd( _Win ),
	win_setfocus(_win),
%	dlg_note("next line end"),
	!.
/*
 input_handler(_Win,e_char(Char,_),0):- %input is number, ok
% 	write("Char=",Char),nl,
 	Char<>303, %when right arrow pushed, 
 	Char<>304,  %specal , don't know why,
 	str_char(STr,Char),
 	str_real(Str,Num),
  	NowP=edit_GetPos(_Win),
	edit_LineHome( _Win ),
 	_Pos1=edit_GetPos(_Win),
	edit_LineEnd( _Win ),
 	_Pos2=edit_GetPos(_Win),
	_YN=edit_GotoPos(_WIn,NowP),
 	StartP=_Pos1-1,
 	EndP=_Pos2-1,
	Text=edit_GetText(_Win,StartP,EndP),
	concat(Text,Str,Text1),
	win_setfocus(_win),
	write("input line=",Text1),nl,
	fail.
*/
 input_handler(_Win,e_char(k_del,_),0):-%when at end of line, don't del,but go to next line
	form_info("noedit"), %when add form pb not pushed
 	NowP=edit_GetPos(_Win),
	edit_LineEnd( _Win ),
 	LineEndP=edit_GetPos(_Win),
% 	write("at end of line, NowP=",NowP,",EndP=",LineEndP),nl,
	_YN=edit_GotoPos(_WIn,NowP),
 	NowP=LineEndP,!,
	edit_Down( _Win ),
	win_setfocus(_win),
	!. 	
/*
 input_handler(_Win,e_char(k_del,_),0):-%when at end of "=", don't del
 	NowP=edit_GetPos(_Win),
 	EndP=NowP+1,
	Text=edit_GetText(_Win,NowP,EndP),
	Text="=",
	!.
 input_handler(_Win,e_char(k_del,_),0):-%when del , cursor beginning  of line, don't del
 	NowP=edit_GetPos(_Win),
 	edit_LineHome( _Win ),
 	LineBegin=edit_GetPos(_Win),
	_YN=edit_GotoPos(_WIn,NowP),
 	NowP=LineBegin,
 	write("when del, cursor at ", NowP, ",begin is ", LineBegin),nl,
	!.
*/ 
 input_handler(_Win,e_char(Char,_),0):-%when backspace, cursor at beginning of line, don't del
	form_info("noedit"), %when add form pb not pushed
 	Char=315, 	
 	NowP=edit_GetPos(_Win),
 	edit_LineHome( _Win ),
 	LineBegin=edit_GetPos(_Win),
	_YN=edit_GotoPos(_WIn,NowP),
 	NowP=LineBegin,
%	write("Char=", Char, ", NowP=", NowP, ",Begin=",LineBegin),nl,
	!.
 input_handler(_Win,e_char(Char,_),0):- %input is not number, nor function keys, prompt
% 	write("Char=", Char),nl,
	form_info("noedit"), %when add form pb not pushed
 	str_char(STr,Char),
 	not(str_real(Str,_)),
 	Char<>315,
 	Char<>'-',
 	Char<>'+',
 	Char<>'*',
% 	Char<>304,
 %	Char<>303,
 	Char<>8,
 	Char<>k_down,
 	Char<>k_up,
	Char<>k_right,
	Char<>k_left,
	Char<>k_prev,
	Char<>k_home,
	Char<>k_end,
	Char<>k_ins,
%	Char<>k_btab,
	Char<>k_help,
	Char<>k_del,
	Char<>'.',
 	dlg_note(Str,"只能输入数值"),
	trap(win_setfocus(_win),_,beep),
	!.

input_handler(_Win,_,0):-
  	fail.


%%begin: initiate the formula window
ini_fcalc(_win,FName):-
	fronttoken(FName,_,_),
	what_calc(FName,Mode),
	retractall(f(_,_,_,_)),
%	write("form name=", FName, ",mode=", Mode),nl,
	retractall(calc_info(_)),
	assert(calc_info(Mode)),
	retractall(form_info(_)),
	assert(form_info("noedit")),
	consult("formula.tdb",formula),
	f(FName,Formu1,CommentList1,VarList),
	not(searchstring(Formu1,"...",_)),
	findall(FName1,f(FName1,_,_,_), FNameList),
	LBoxwin= win_GetCtlHandle(_Win, idc_list_fnames),
	lbox_Clear(LboxWin),
	lbox_Add(LboxWin, 0, FNameList),
	ItemList=lbox_GetAll(LboxWin),
%	write("ItemList=", ItemList),nl,
	slist_member_pos(FName,ItemList,1,SeqN),
	ToselN=SeqN-1,
%	write("SeqN=",SeqN),nl,
	lbox_SetSel(LboxWin,ToSelN, 1),
	%formula control:
%	f(_Name,Formu1,CommentList1,VarList),!,
	F_win= win_GetCtlHandle(_Win, idc_edit_finput),
	set_win_textlist_Loop(F_win,  [Formu1]),
	win_SetEditCtlReadOnly(F_win,1),
	%comments control:
	CommentList1=[Cm|_CommentList2],
%	slist_strplus(CommentList2, "\n",Cm, "请选择公式进行计算。"),
	Comwin= win_GetCtlHandle(_Win, idc_edit_fcommts),
%	Commentstr= "请选择公式进行计算。",
	set_win_textlist_Loop(Comwin, [CM ]),
	win_SetEditCtlReadOnly(Comwin,1),
	%input edit win
	VarList=[Var|RVarList],
	slist_strplus(RVarList, "=\n",Var, VarStr),
	edit_win(EditWin),
	edit_PasteStr(EditWin, VarStr),
%	win_setFocus(EditWin),
%	edit_LineEnd(EditWin),
	!.
ini_fcalc(_win,_):-
	retractall(f(_,_,_,_)),
	retractall(calc_info(_)),
	assert(calc_info(0)),
	retractall(form_info(_)),
	assert(form_info("noedit")),
	consult("formula.tdb",formula),
	findall(FName,f(FName,_,_,_), FNameList),
	LBoxwin= win_GetCtlHandle(_Win, idc_list_fnames),
	lbox_Clear(LboxWin),
	win_setText(LboxWin, "在此选公式"),

⌨️ 快捷键说明

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