📄 calcdlg.pro
字号:
%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 + -