int EnterTextInt(int x,int y,int lim) //x,y - координаты начала поля, lim - размер поля ввода.
{
//int x,y,i,lim,var_int;
int i,var_int;
char *str;
str=(char*)calloc(lim,sizeof(char));
if(str==NULL) MemoryErrorMes();
x=48;
y=4;
lim=2; //максимальный размер поля ввода
gotoxy(x,y);
for(i=0;str!=13;i++)
{
str=getch();
if((str==8)&(i>0)) { //если был нажат Backspace и строка с больше, чем одного символа
x=wherex(); y=wherey();
gotoxy(x-1,y); //курсор перемещается влево на одну позицию
cprintf(" "); //затирается на экране последний символ строки
gotoxy(x-1,y); //курсор перемещается влево на одну позицию
str[i-1]='\0'; //затирается в массиве последний символ строки
i-=2; //чтобы при следующем входе в цикл запись символа в строку осуществлялась с места, где был последний символ
continue; //возвращение в начало цикла
}else if((str<48)||(str>57)) { //если были введены не цифры
if(str==27){ //если был введен Escape, то выходим из цикла
break;
}else if(str==13){ //если был введен Enter
if(i!=0){ //проверяем, чтобы строка содержала хотя бы один символ
str='\0'; //ставим символ конца строки
break; //обрываем цикл
}else{ //если не было введено в строку никаких символов, то нужно вернуться в начало цикла с помощью continue, чтобы предоставить возможность снова ввести строку
i--; //для этого восстановляем итератор цикла в нуль
str[0]=1; //и присваиваем str[0] значение, отличное от 13, чтобы осуществился вход в цикл после continue
//printf("{%c}",str);
continue; //и возвращаемся в начало цикла
}
}else{ //если был введен любой другой символ, отличный от приведенных выше, то тоже возвращаемся в начало цикла
i--; //для этого восстановляем итератор цикла в нуль
continue; //и возвращаемся в начало цикла
} //end if 27 13
} //end if 48 57
if(i>lim-1){ //если строка выходит за границы поля (текущий введеный символ за границей поля)
i--; //то даем возможность ввести еще раз последний символ в строке
x=wherex(); //узнаем текущую координату курсора X
gotoxy(x-1,y); //на экране возвращаем то место, где быдет появляться символ, назад на одну позицию влево(чтобы текст не выходил за границы поля)
}
cprintf("%c",str); //если строка НЕ выходит за границы поля, то выводим введенный символ на экран
} // end for(i=0;str!=13;i++)
if(i){ //если строка содержит хотя бы один символ
var_int=atoi(str); //то конвертируем строку в целое число
}
return var_int; //функция возвращает полученное число
}
Функция ввода текста с выводом на экран и запись в буфер (язык C)
1. При нажатии Escape: ничего в буфер не записывать и на экран не выводить, а просто выходить из функции.
2. При нажатии Enter: прекращать ввод текста и функция должна возвращать введенное число. Также проверять, если пользователь еще ничего не ввел, а уже нажал Enter, то ничего не делать, а продолжать ждать, пока он не введет какое-то число.
3. При нажатии стрелок вправо\влево на экране перемещать курсор соответственно. И чтобы после этого набор текста мог осуществляться с того места, где стоит курсор, и если справа от курсора находится текст, то нужно его сдвигать на экране(так как это работает в любом текстовом редакторе).
4. При нажатии любых символов, отличных от приведенных выше, а также отличных от цифр, просто ничего не делать, а ждать, когда пользователь введет числа.
Все эти пункты я уже сделал и написал, прога работает. Не сделал я только пункт 3... моск уже кипит... чтобы осуществлять ввод текста с возможностью его ввода с любого места строки, где стоит курсор - не могу ничего толкового на счет этот придумать. Помогите пожалуйста. Наперед говорю огромное спасибо!:)
P.S. Вот мой код, где пункты 1,2,4 уже работают:
Код:
На другом форуме мне быстрее помогли... Вот эта функция:
Код:
int InputCharInt(const char *label, char *str, int lim)
{
//hOut=GetStdHandle(STD_OUTPUT_HANDLE);
//char *str=(char*)calloc(lim+1,sizeof(char));
for(int i=0;i<=lim;i++) str='\0';
int charCount=0,x,y;
x=wherex(); y=wherey();
str[0]=0;str[5]=0;
int key=0,tmp=0,tmp2=0;
for(int i=0;key!=13;i++)
{
key=getch();
if(key>=48 && key<=57)
{
if(charCount>lim-1)
{
i--;continue;
}
tmp=str;
for(int j=i;j<lim-1;j++)
{
tmp2=str[j+1];
str[j+1]=tmp;
tmp=tmp2;
}
str=key;
charCount++;
gotoxy(x,y);
cprintf("%s",str);
gotoxy(x+i+1,y);
continue;
}
if(key==8)
{
if(wherex()==x)
{
i--;continue;
}
gotoxy(x+charCount-1,y);
cprintf(" ");
gotoxy(wherex()-1,wherey());
tmp=str[charCount-1];
for(int j=charCount-1;j!=i-1;j--)
{
tmp2=str[j-1];
str[j-1]=tmp;
tmp=tmp2;
}
charCount--;
str[charCount]=0;
gotoxy(x,y);
cprintf("%s",str);
gotoxy(x+i-1,y);
i-=2;
continue;
}
if (key==13)
{
if(!i)
{
key=0;
i--;
continue;
}
str[charCount]=0;
break;
}
if(key==27) return 27;
if(key==0xE0)
{
i--;
continue;
}
if(key==0){
key=getch();
if(key==75)
{
if(wherex()==x)
{
i--;continue;
}
gotoxy(wherex()-1,wherey());
i-=2;
continue;
}
if(key==77)
{
if(wherex()==lim+5 || charCount==i)
{
i--;
continue;
}
gotoxy(wherex()+1,wherey());
continue;
}
}
i--;continue;
}
//return *str;
}
{
//hOut=GetStdHandle(STD_OUTPUT_HANDLE);
//char *str=(char*)calloc(lim+1,sizeof(char));
for(int i=0;i<=lim;i++) str='\0';
int charCount=0,x,y;
x=wherex(); y=wherey();
str[0]=0;str[5]=0;
int key=0,tmp=0,tmp2=0;
for(int i=0;key!=13;i++)
{
key=getch();
if(key>=48 && key<=57)
{
if(charCount>lim-1)
{
i--;continue;
}
tmp=str;
for(int j=i;j<lim-1;j++)
{
tmp2=str[j+1];
str[j+1]=tmp;
tmp=tmp2;
}
str=key;
charCount++;
gotoxy(x,y);
cprintf("%s",str);
gotoxy(x+i+1,y);
continue;
}
if(key==8)
{
if(wherex()==x)
{
i--;continue;
}
gotoxy(x+charCount-1,y);
cprintf(" ");
gotoxy(wherex()-1,wherey());
tmp=str[charCount-1];
for(int j=charCount-1;j!=i-1;j--)
{
tmp2=str[j-1];
str[j-1]=tmp;
tmp=tmp2;
}
charCount--;
str[charCount]=0;
gotoxy(x,y);
cprintf("%s",str);
gotoxy(x+i-1,y);
i-=2;
continue;
}
if (key==13)
{
if(!i)
{
key=0;
i--;
continue;
}
str[charCount]=0;
break;
}
if(key==27) return 27;
if(key==0xE0)
{
i--;
continue;
}
if(key==0){
key=getch();
if(key==75)
{
if(wherex()==x)
{
i--;continue;
}
gotoxy(wherex()-1,wherey());
i-=2;
continue;
}
if(key==77)
{
if(wherex()==lim+5 || charCount==i)
{
i--;
continue;
}
gotoxy(wherex()+1,wherey());
continue;
}
}
i--;continue;
}
//return *str;
}