Eingabefeld beschränken

25/04/2011 - 19:12 von Jens Kallup | Report spam
Hallo,

versuche gerade auf dem Terminal ohne ncurses ein Eingabefeld zu
programmieren.
Leider bekomme ich das nicht hin :-(
Was soll das Programm können?
Also:
In einer Eingabe(feld) das auf den Bildschirm auf x y!
10 Zeichen breit sein soll und wenn die Eingabe lànger wird, dass
der Cursor am Ende stehen bleibt und die Eingabe trotzdem weiter
erfolgen kann.
Bei Char 127 (BackSpace) soll dann ein Zeichen gelöscht werden
und wenn der String < 10 ist soll dann der Cursor um 1 Position
nach links verschoben werden.
Anbei der momentane Code:
Danke für Hilfe
Jens

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
#include <signal.h>


int kbhit(void);

int kbhit(void)
{
struct termios term, oterm;
int fd = 0;
int c = 0;
tcgetattr(fd, &oterm);
memcpy(&term, &oterm, sizeof(term));
term.c_lflag = term.c_lflag & (!ICANON);
term.c_cc[VMIN] = 0;
term.c_cc[VTIME] = 1;
tcsetattr(fd, TCSANOW, &term);

c = getchar();
tcsetattr(fd, TCSANOW, &oterm);
if (c != -1)
ungetc(c, stdin);
return ((c != -1) ? 1 : 0);
}

int getch()
{

static int ch = -1, fd = 0;
struct termios neu, alt;
fd = fileno(stdin);
tcgetattr(fd, &alt);
neu = alt;
neu.c_lflag &= ~(ICANON|ECHO);
tcsetattr(fd, TCSANOW, &neu);
ch = getchar();
tcsetattr(fd, TCSANOW, &alt);
return ch;
}

...
char text[11], z;
char pwz = '*'; //Zeichen für Passwörter
int i=0, max=0, count;



printf("farbe: \033[1;33;42mfarbtest");

printf("╔══════════════════════════════════╗");
printf("║ ║");
printf("║ Eingabe: ║");
printf("║ ║");
printf("║ < OK > ║");
printf("╚══════════════════════════════════╝");
printf("\033[21;11f");
getch();

for(;;)
{
if ((max >= 10))
{
printf("\033[1D");
}

z = getch();

switch(z) //wurde was spezielles gedrückt?
{
case 0: //Sondertasten wie z. B. Pfeil nach oben
if(kbhit()) //bei Sondertasten werden zwei Werte eingelesen!
getch(); //Wert der Sondertaste lesen
break;

case 10:
goto ende;
break;

case 127: //Rücktaste (Zeichen links vom Cursor löschen)
if(i>0)
{

if (max <= 10)
{
printf("\033[1D \033[1D"); //Zeichen am Bildschirm löschen
}

text[i-1] = 0; //letztes Zeichen löschen
/*
if (max-strlen(text) <= max)
{
text[0] = 0;
printf("\033[21;11f");
}
*/
}
break;
default: //restliche Zeichen
if(z>=' ') //keine Steuerzeichen!
{
max++;
printf("%c", (pwz)?pwz:z); //Zeichen ausgeben; wenn pwz 0
dann eingegebenes Zeichen
text[i++] = z;
}
break;
}
}
ende:
text[i] = 0; //Stringendekennzeichen nicht vergessen! ;)



//scanf("%s",enter);

printf("\033[1;1f");
printf("--> %s",text);
continue;
//╔╝╗╚╣
} else {
printf("versuche programm '%s' zu starten...",_str_);
system(_str_);
}
}
}
 

Lesen sie die antworten

#1 Jens Kallup
25/04/2011 - 21:15 | Warnen spam
Hallo,

habe was halbwegs lauffàhiges hinbekommen - code anbei.
ist es auch möglich, den text nach max >= 10 nach links zu verschieben?

Gruß
Jens


for(;;)
{
if ((max >= 10))
{
printf("\033[1D");
}

z = getch();

switch(z) //wurde was spezielles gedrückt?
{
case 0: //Sondertasten wie z. B. Pfeil nach oben
if(kbhit()) //bei Sondertasten werden zwei Werte eingelesen!
getch(); //Wert der Sondertaste lesen
break;

case 10:
goto ende;
break;

case 127: //Rücktaste (Zeichen links vom Cursor löschen)
if(i>0)
{

if (max == 10)
{
printf(" \033[1D \033[1D");
}

if (max <= 9)
{
printf("\033[1D \033[1D"); //Zeichen am Bildschirm löschen
}


text[i-1] = 0; //letztes Zeichen löschen
}

if (max >= 10)
{
// hier sollte der text verschoben werden ...
printf("\033[21;21f");
}

if (strlen(text) <= 0)
{
printf("\033[21;11f");
}

break;
default: //restliche Zeichen
if(z>=' ') //keine Steuerzeichen!
{
max++;
printf("%c", (pwz)?pwz:z); //Zeichen ausgeben; wenn pwz 0
dann eingegebenes Zeichen
text[i++] = z;
}
break;
}
}
ende:
text[i] = 0; //Stringendekennzeichen nicht vergessen! ;)

Ähnliche fragen