📄 myform.c
字号:
#include <curses.h>#include <form.h>#include <stdlib.h>#include <locale.h>#include "public.h"#include "myform.h"#include "newtype.h"#include "listbox.h"extern int FormFunc(char *, FORM_NODE *);WINDOW *FieldWin(FIELD *field)//当前域的主窗口{ return(form_win(field->form));}FORM_NODE *InitForm()//初始化表单{ int i; FORM_NODE *pForm; setlocale(LC_ALL,""); pForm= (FORM_NODE *) malloc(sizeof(FORM_NODE)); pForm->fields = (FIELD **) calloc(MAX_FIELD, sizeof(FIELD *)); pForm->init = (char **) calloc(MAX_FIELD, sizeof(char *)); pForm->term = (char **) calloc(MAX_FIELD, sizeof(char *)); pForm->disp = (char **) calloc(MAX_FIELD, sizeof(char *)); pForm->index = (int *) calloc(MAX_FIELD, sizeof(int)); for(i=0; i<MAX_FIELD; i++) { pForm->init[i] = (char *) 0; pForm->term[i] = (char *) 0; pForm->disp[i] = (char *) 0; } return(pForm);}void FreeForm(FORM_NODE *pForm)//释放表单{ int i=0; WINDOW *win = form_win(pForm->form); werase(win); wrefresh(win); delwin(form_sub(pForm->form)); delwin(win); unpost_form(pForm->form); free_form(pForm->form); del_panel(pForm->panel); for(i = 0; i < MAX_FIELD; i++) { if(pForm->fields[i]) free_field(pForm->fields[i]); if(pForm->init[i]) free(pForm->init[i]); if(pForm->term[i]) free(pForm->term[i]); if(pForm->disp[i]) free(pForm->disp[i]); } if(pForm->index) free(pForm->index); if(pForm->prompt) free(pForm->prompt); if(pForm->name) free(pForm->name); free(pForm);}WINDOW *FormWin(FORM_NODE *pForm)//返回表单窗口{ return(form_sub(pForm->form));}int CurrentIndex(FORM_NODE *pForm)//当前域索引号{ return(field_index(current_field(pForm->form)));}FIELD *CurrentField(FORM_NODE *pForm)//当前域{ return(pForm->fields[CurrentIndex(pForm)]);}char *CurrentTerm(FORM_NODE *pForm)//当前域终止函数名{ return(pForm->term[CurrentIndex(pForm)]);}char *CurrentInit(FORM_NODE *pForm)//当前域初始函数名{ return(pForm->init[CurrentIndex(pForm)]);}char *CurrentDisp(FORM_NODE *pForm)//当前域的显示文件名{ return(pForm->disp[CurrentIndex(pForm)]);}char *CurrentPrompt(FORM_NODE *pForm)//当前域提示{ return(field_userptr(CurrentField(pForm)));}void RunPrompt(FORM_NODE *pForm)//域提示{ char *str=CurrentPrompt(pForm); WINDOW *win=form_sub(pForm->form); if(str) PrintMsg(win, str, 'N'); else PrintMsg(win, pForm->prompt, 'N'); pos_form_cursor(pForm->form);//光标复位 wrefresh(win);}/*int RunDisp(FORM_NODE *pForm)//显示域对应信息{ FIELD *f = CurrentField(pForm); char *x = Trim(field_buffer(f, 0)); char *fname=CurrentDisp(pForm); char buf[160], disp[80], code[9]; WINDOW* w; int rows, cols, frow, fcol, nrow, nbuf; FILE *fp; if( fname == NULL) return; if((fp = fopen(fname,"r")) == NULL) return; memset(buf, 0 ,sizeof(buf)); while((fscanf(fp, "%[^\n]\n", buf) != EOF)) { memset(code, 0, sizeof(code)); GetString(code, buf, 1, '|'); if(strcmp(Trim(code), x) == 0) { memset(disp, 0, sizeof(disp)); GetString(disp, buf, 2, '|'); w = form_sub(f->form); field_info(f, &rows, &cols, &frow, &fcol, &nrow, &nbuf); mvwaddstr(w, frow, fcol + cols + 2, disp); wrefresh(w); fclose(fp); return(0); } } w = FormWin(pForm); PrintMsg(w, "输入超出范围", 'E'); fclose(fp); return(1);}*/char *GetVal(FIELD *f){ int end, len, i, j; char *x = field_buffer(f, VALBUF); FIELDTYPE *type = field_type(f); if(type == TYPE_DATE) { len = strlen(x); end = len - 1; for(i = 0, j = 1; i < len; i++) { if( '0' <= x[i] && x[i] <= '9') continue; for(j = i; j < end ; j++) x[j] = x[j+1]; x[end--] = ' '; i--; len--; } return(Trim(x)); } if(type == TYPE_AMOUNT) { len = strlen(x); end = len - 1; for(i = 0, j = 1; i < len; i++) { if( ('0' <= x[i] && x[i] <= '9') || x[i] == '.') continue; for(j = i; j < end ; j++) x[j] = x[j+1]; x[end--] = ' '; i--; len--; } return(Trim(x)); } return(x);}int RunInit(FORM_NODE * pForm)//执行域初始函数{ FIELD *f = CurrentField(pForm); char *code = CurrentInit(pForm); set_field_buffer(f, VALBUF, GetVal(f)); form_driver(pForm->form, REQ_VALIDATION); RunPrompt(pForm); return(FormFunc(code, pForm));}int RunTerm(FORM_NODE * pForm)//执行域终止函数{ char *code = CurrentTerm(pForm); //FIELD *f = CurrentField(pForm); //char *x = GetVal(f); //for( ;*x != 0; x++) // form_driver(pForm->form, *x); //RunDisp(pForm); return(FormFunc(code, pForm));}int RunList(FORM_NODE *pForm)//执行列表域函数{ FIELD *f = CurrentField(pForm); LIST *n = (LIST *)field_arg(f); WINDOW* w = form_sub(pForm->form); LIST_NODE *p; char *code; int y, x, ret; int rows, cols, frow, fcol, nrow, nbuf; getbegyx(w, y, x); field_info(f, &rows, &cols, &frow, &fcol, &nrow, &nbuf); y += n->y; x += fcol; if((p = InitList(y, x, n->len, n->name)) == NULL) { return(1); } else { code = DriverList(p); if(code){ set_field_buffer(f, VALBUF, code); ret = 0; } else ret = 1; } FreeList(p); update_panels(); doupdate(); return(ret);}int DriverForm(FORM_NODE *pForm)//表单驱动 0-接受 1-退出{ int ch, i; char *x; FORM *form = pForm->form; WINDOW *win=form_win(form); form_driver(form, REQ_OVL_MODE); RunPrompt(pForm); while(ch = wgetch(win)) { switch(ch) { case 0x1b://ESC return(1); case KEY_F(2): form_driver(form, REQ_VALIDATION); if(RunTerm(pForm) == OK) return(0); RunInit(pForm); break; case 0x0a://Enter case KEY_DOWN: form_driver(form, REQ_VALIDATION); if(RunTerm(pForm) == OK) form_driver(form, REQ_NEXT_FIELD); RunInit(pForm); break; case KEY_UP: //form_driver(form, REQ_VALIDATION); //if(RunTerm(pForm) == OK) form_driver(form, REQ_PREV_FIELD); RunInit(pForm); break; case 0x08://BackSpace form_driver(form, REQ_DEL_PREV); break; case 0x7f://Del form_driver(form, REQ_DEL_CHAR); break; case KEY_LEFT: form_driver(form, REQ_LEFT_CHAR); break; case KEY_RIGHT: form_driver(form, REQ_RIGHT_CHAR); break; case ' '://Space if(field_type(current_field(form)) == TYPE_LIST) { if(RunList(pForm) == OK ) form_driver(form, REQ_NEXT_FIELD); RunInit(pForm); } break; default: form_driver(form, ch); break; } }}void ClearForm(FORM_NODE *pForm){ int i; FORM *form = pForm->form; for(i = 0; i < field_count(form); i++) { form_driver(form, REQ_CLR_FIELD); form_driver(form, REQ_NEXT_FIELD); } form_driver(form, REQ_FIRST_FIELD);}int GetIndex(FORM_NODE *pForm, int indexno)//域的实际索引号{ int i; for(i=0; i < MAX_FIELD; i++) if(pForm->index[i] == indexno) return(i); return(-1);}char *ReadField(FORM_NODE *pForm, int i)//读入域中的值{ int no = GetIndex(pForm, i); return(GetVal(pForm->fields[no]));}void WriteField(FORM_NODE *pForm, int i, char *buf)//写域值{ int no = GetIndex(pForm, i); set_field_buffer(pForm->fields[no], VALBUF, buf);}void ClearField(FORM_NODE *pForm, int i){ char *x = ReadField(pForm, i); memset(x, 0, strlen(x)); WriteField(pForm, i, x);}int CheckForm(FORM_NODE *p){ int i, flag = 0; FORM *form = p->form; WINDOW *win = FormWin(p); for(i = 0; i < field_count(form); i++) { if(form_driver(form, REQ_VALIDATION) != E_OK) { PrintMsg(win, "输入数据不合法", 'E'); return(1); } form_driver(form, REQ_NEXT_FIELD); } return(0);}extern FILE *yyin;FORM_NODE *LoadForm(char *frmfile){ char msg[80]; if((yyin = fopen(frmfile, "r")) == NULL) { sprintf(msg, "读文件[%s]失败!", frmfile); PrintMsg(stdscr, msg, 'E'); deleteln(); refresh(); fclose(yyin); return(NULL); } if(yyparse()){ //取得表单句柄HFORM; fclose(yyin); return(NULL); } else fclose(yyin); return(HFORM);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -