📄 input_tool.c
字号:
WINDOW *pwin;
int row;
{
clear_wline( pwin, row );
}
int clear_wline( pwin, row )
WINDOW *pwin;
int row;
{
wmove( pwin, row, 0 );
wclrtoeol( pwin );
wrefresh( pwin );
return (0);
}
int yorn(pwin, row, title, item0, item1, init_item, flag)
WINDOW *pwin;
int row;
char *title;
char *item0;
char *item1;
int init_item;
int flag;
{
char str[80];
strcpy(str, item0);
strcpy(str + strlen(str) + 1, item1);
return(multi_select(pwin, row, title, str, 2, init_item, flag, 0));
}
int multi_select(pwin, row, title, pitem, item_num, init_item, flag, popup)
WINDOW *pwin; /* 指定窗口 */
int row; /* 显示的行 */
char *title; /* 提示信息 */
char *pitem; /* 选项指针 */
int item_num; /* 选项数目 */
int init_item; /* 初始选项 */
int flag; /* 快捷标志 */
int popup; /* 弹出标志 */
{
char first_char[10], *ptr;
int position[10], i, j, col, ch;
flag = !flag;
popup = !popup;
memset(first_char, 0, 10 * sizeof(char));
memset(position, 0, 10 * sizeof(int));
ptr = pitem;
for (i = 0; i < item_num; i++) {
position[i] = ptr - pitem;
if (isalpha(ptr[0]))
first_char[i] = toupper(ptr[0]);
else if (isdigit(ptr[0]))
first_char[i] = ptr[0];
ptr += strlen(ptr) + 1;
}
wmove(pwin, row, 0);
wclrtoeol(pwin);
h_winprompt(pwin, row, 0, title, 0, 0);
col = strlen(title) + 2;
for (i = 0; i < item_num; i++) {
if (i == init_item)
h_winprompt(pwin, row, col, pitem + position[i], 0, 1);
else
h_winprompt(pwin, row, col, pitem + position[i], 0, 0);
col += strlen(pitem + position[i]) + 2;
}
i = init_item;
keypad(pwin, FALSE);
while (ch = getkey(pwin)) {
j = i;
switch (ch) {
case UP:
case LEFT:
if (i == 0) i = item_num - 1;
else i--;
break;
case DOWN:
case RIGHT:
i = (i + 1) % item_num;
break;
case ENTER:
if (popup) clear_wline(pwin,row);
return(i);
case ESCAPE:
if (popup) clear_wline(pwin,row);
return(ESCAPE);
default:
if (isalpha(ch)) ch = toupper(ch);
for (col = 0; col < item_num; col++)
if (ch == first_char[col]) {
i = col;
if (flag) {
if (popup) clear_wline(pwin, row);
return(i);
}
}
break;
}
if (j != i) {
col = strlen(title) + 2 + position[j] + j;
h_winprompt(pwin, row, col, pitem + position[j], 0, 0);
col = strlen(title) + 2 + position[i] + i;
h_winprompt(pwin, row, col, pitem + position[i], 0, 1);
}
}
}
/*
* 显示指定的屏幕结构的标题以及各域的提示信息
*/
int disp_screen( pwin, scr )
WINDOW *pwin; /* 指向窗口结构的指针 */
struct screen_st *scr; /* 指向屏幕结构的指针 */
{
struct field_st *ptr;
char str[BUFSIZ];
FILE *fp;
int sum,line,i,j;
char c,map[24][81];
gen_name( str, scr->screen_file );
if ( ( fp=fopen( str, "r" ) )==NULL ) {
h_prompt( 21, 2, "打开屏幕文件出错!...", 1, 2 );
return( -1 );
}
memset(map, ' ', 24*80);
i = j = 0;
#ifdef zgx020425_modi
while ( !feof(fp) ) {
c = fgetc(fp);
if ( c == 0x0a) {
map[i][j]=0;
i++;
j=0;
}
else map[i][j++] = c;
};
#else
while (!feof(fp)) {
c = fgetc(fp);
if (c == 0x0a) {
map[i][j]=0;
i++;
if (i == 23)
break;
j = 0;
} else if (j == 79) {
map[i][j]=0;
i++;
if (i == 23)
break;
j = 0;
while (!feof(fp)) {
c = fgetc(fp);
if (c == 0x0a)
break;
}
if (c == 0x0a)
continue;
break; /* feof(fp) */
} else {
map[i][j++] = c;
}
}
#endif
sum = i;
mvwprintw(pwin, 0, 0, "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━");
for ( i=sum/2; i>=0; i--) {
line = i;
mvwaddstr(pwin,line,0,map[line]);
line = sum-i;
mvwaddstr(pwin,line,0,map[line]);
wrefresh(pwin);
}
fclose( fp );
wrefresh(pwin);
}
int clear_screen( pwin )
WINDOW *pwin;
{
int i;
for ( i=0;i<23;i++ ) {
wmove( pwin,i, 0 );
wclrtoeol(pwin);
}
wrefresh(pwin);
}
int clear_screen_fields( pwin, f_ptr )
WINDOW *pwin;
struct field_st *f_ptr;
{
struct field_st *ptr;
int x;
ptr=f_ptr;
wrefresh( pwin );
while ( 1 ) {
mvwaddch( pwin, ptr->f_row - 1, ptr->f_col - 1, '[' );
mvwaddch( pwin, ptr->f_row - 1, ptr->f_col + ptr->f_width, ']');
for ( x=0;x<ptr->f_width;x++ ) {
mvwaddch( pwin, ptr->f_row - 1, x+ptr->f_col, ' ' );
}
if ( MV_END( ptr->option ) )
break;
ptr++;
}
wrefresh( pwin );
}
/*
* 显示屏幕上的各个域
*/
int disp_fields( pwin, f_ptr )
WINDOW *pwin;
p_field_st f_ptr;
{
char tmp[200];
char *tmp0, tmp1[200];
int len=0, k=0, off=1;
double ff;
while ( 1 ) {
if ( MV_SKIP( f_ptr->option ) ) {
if ( MV_END( f_ptr->option ) ) break;
f_ptr++;
off++;
continue;
}
/* Begin - Modified by Liyao, 11/16/97 */
fieldtostr( f_ptr, tmp );
len = strlen( tmp );
if ( len > f_ptr->f_width ) {
// beep();
// sprintf( tmp1, "[%s]域的显示宽度定义太窄![%s]",
// f_ptr->field_name, tmp );
// h_winprompt( pwin, 16, 1, tmp1, 1, 1 );
tmp[f_ptr->f_width] = 0;
strtofield( tmp, f_ptr );
len = f_ptr->f_width;
}
if ( MV_HIDE( f_ptr->option ) ) memset( tmp, '*', len );
memset( tmp+len, ' ', f_ptr->f_width-len );
tmp[f_ptr->f_width] = 0;
h_winprompt( pwin, f_ptr->f_row - 1, f_ptr->f_col, tmp, 0, 0 );
/* End - Modified by Liyao, 11/16/97 */
if (!do_query && MV_FULL(f_ptr->option) && strchr(tmp, ' ')) {
sprintf(tmp1, " 本字段必须填满 按任意键继续... ");
h_wpromptr(pwin, 16, tmp1, 1, 1);
return(off);
}
tmp0 = tmp;
while (*tmp0 == ' ') tmp0++;
if (*tmp0 == 0) {
if (!do_query && MV_CHK(f_ptr->option)) {
sprintf(tmp1, " 本字段不允许为空 按任意键继续... ");
h_wpromptr(pwin, 16, tmp1, 1, 1);
return(off);
}
tmp[0] = 0; /* 字符串全空格, 置空串 */
}
#ifdef zgx010427_modi
if (!MV_FORM(f_ptr->option) && !MV_VIEW(f_ptr->option) && f_ptr->fieldcheck)
if ( ( k = f_ptr->fieldcheck( tmp ) ) != SUCC ) {
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
return( off );
}
if (!MV_FORM(f_ptr->option) && !MV_VIEW(f_ptr->option) && f_ptr->p_func)
if ( ( k = f_ptr->p_func( tmp ) ) != SUCC ) {
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
return( off );
}
#else
/*
* FLD_FORM FLD_VIEW 也须执行fieldcheck,p_func
*/
if (f_ptr->fieldcheck)
if ( ( k = f_ptr->fieldcheck( tmp ) ) != SUCC ) {
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
return( off );
}
if (f_ptr->p_func)
if ( ( k = f_ptr->p_func( tmp ) ) != SUCC ) {
h_wpromptr( pwin, 16, errstr[k], 1, 1 );
return( off );
}
#endif
if ( MV_END( f_ptr->option ) ) break;
f_ptr++;
off++;
};
wrefresh( pwin );
return(0);
}
/*
* 对指定的域结构按照域的类型进行编辑
*/
int g_field(pwin, f_ptr, input_func)
WINDOW *pwin; /* 指向窗口结构的指针 */
struct field_st *f_ptr; /* 指向域结构的指针 */
int (*input_func)(); /* 键盘输入处理函数指针 */
{
char str[200]; /* qiufeng 96.08.18. */
unsigned ch;
int view;
/* Begin - Modified by Liyao, 11/20/97 */
view = NORMAL;
if ( MV_SKIP( f_ptr->option ) ) view |= SKIP; /* 不处理 */
if ( ( do_insert && MV_INS( f_ptr->option ) ) ||
( do_update && MV_UPD( f_ptr->option ) ) ||
MV_FORM( f_ptr->option ) ||
MV_VIEW( f_ptr->option ) ) view |= NOEDIT; /* 只显示 */
if ( MV_HIDE( f_ptr->option ) ) view |= HIDE; /* 隐含显示 */
if (!do_query) {
if (MV_DIGITAL(f_ptr->option)) view |= DIGITAL; /* 数字串 */
if (MV_FULL(f_ptr->option)) view |= FULL; /* 填满 */
if (MV_CHK(f_ptr->option)) view |= NOEMPTY; /* 非空 */
}
if (!(view & SKIP)) {
str[0] = 0;
if (view & DIGITAL) strcat(str, ", 为数字型");
if (view & FULL) strcat(str, ", 必须填满");
else if (view & NOEMPTY) strcat(str, ", 不允许为空");
sprintf(str_bak, "%s%s%s%s%s", f_ptr->string,
(f_ptr->string[0] && str[0]) ? " ( " : "",
str[0] ? "本字段" : "",
str[0] ? str + 2 : "",
(f_ptr->string[0] && str[0]) ? " )" : "");
sprintf(str, "%-80.80s", str_bak);
strcpy(str_bak, str);
h_winprompt(pwin, f_ptr->e_row - 1, f_ptr->e_col, str, 0, 0);
}
// if ((MV_TYPE(f_ptr->option) != FLD_STRING) && (MV_TYPE(f_ptr->option) != FLD_DATE) && isblank(f_ptr)) str[0] = 0;
// else
fieldtostr(f_ptr, str);
#ifdef zgx020422_modi
ch = input_item( pwin,
f_ptr->field_name,
f_ptr->f_row - 1,
f_ptr->f_col,
str,
f_ptr->f_width,
f_ptr->fieldcheck,
f_ptr->p_func,
view,
0 );
#else
ch = input_func( pwin,
f_ptr->field_name,
f_ptr->f_row - 1,
f_ptr->f_col,
str,
f_ptr->f_width,
f_ptr->fieldcheck,
f_ptr->p_func,
view,
0);
#endif
/* if ( ch==CTRL_U ) return( ch ); */
strtofield(str, f_ptr);
if (!(view & SKIP)) {
// if (do_query && (MV_TYPE(f_ptr->option) != FLD_STRING) && (MV_TYPE(f_ptr->option) != FLD_DATE) && isblank(f_ptr)) str[0] = 0;
// else
fieldtostr(f_ptr, str);
str[f_ptr->f_width] = 0;
if (view & HIDE) memset(str, '*', strlen(str));
memset(str + strlen(str), ' ', f_ptr->f_width - strlen(str));
h_winprompt(pwin, f_ptr->f_row - 1, f_ptr->f_col, str, 0, 0);
}
return(ch);
/* End - Modified by Liyao, 11/20/97 */
}
int init_screen()
{
static init = 0;
if (init) return(0);
init = 1;
initscr();
start_color();
init_pair_table();
noecho();
refresh();
}
int end_screen()
{
clear_screen(stdscr);
refresh();
echo();
endwin();
}
int touch_screen()
{
WINDOW * hwin;
hwin = newwin(0, 0, 0, 0);
wrefresh(hwin);
delwin(hwin);
touchwin(stdscr);
}
int isblank(f_ptr)
struct field_st *f_ptr;
{
int result = 1;
char *sp;
switch (MV_TYPE(f_ptr->option)) {
case FLD_SHORT:
if (*((short *)f_ptr->field)) result = 0;
break;
case FLD_INT:
case FLD_UNSIGNED:
if (*((int *)f_ptr->field)) result = 0;
break;
case FLD_LONG:
if (*((long *)f_ptr->field)) result = 0;
break;
case FLD_FLOAT:
case FLD_MONEY:
if (fabs(*((double *)f_ptr->field)) >= 0.005) result = 0;
break;
case FLD_FLOAT_4:
if (fabs(*((double *)f_ptr->field)) >= 0.00005) result = 0;
break;
case FLD_STRING:
case FLD_DATE:
sp = (char *)f_ptr->field;
for (; *sp; sp++)
if (*sp != ' ') {
result = 0;
break;
}
break;
}
return(result);
}
void prescan(char *buf)
{
int i = 0, j = 0;
char tmp[200];
do {
if (buf[i] == '\'')
tmp[j++] = buf[i];
tmp[j++] = buf[i];
} while (buf[i++]);
strcpy(buf, tmp);
}
/* End - Modified by Liyao, 12/02/97 */
int clear_fields( f_ptr )
struct field_st *f_ptr;
{
struct field_st * fp;
for( fp=f_ptr;;fp++ ) {
strtofield( "", fp);
if ( MV_END( fp->option ) ) break;
}
}
int strtofield( str, f_ptr)
char *str;
struct field_st *f_ptr;
{
double ff;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -