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

📄 input_tool.c

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 C
📖 第 1 页 / 共 3 页
字号:
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 + -