Eingabemaske



  • Moin,

    wie kann ich in der cmd eine Eingabemaske erstellen (verschiedene Feld, zwischen denen ich mit "Tab", Pfeiltasten, etc. wechseln kann).

    Ich kenne sowas noch aus dBaseIIIplus, da ging so was ganz einfach:

    @ 7,20 SAY 'Bitte Namen eingeben: ' GET NAME
    

    Am Position 7,20 erscheint der Text und dahinter dann die Eingabebox. Was dann eingeben wird, wird in das Feld/Variable NAME geschrieben



  • *Nostalgieabend*

    Die Bücher zum damals neuen dBase IV sind von mir 😋 😋 😋
    Das ist heute so was von tot ... 3+ war geil 🕶

    Früher gab es mal unter DOS einen "ansi.sys", mit dem konnte man so etwas
    machen. In C ist das (natürlich) kein Problem, man kann auch heute noch aus
    der Cmdline direkt ins Video-RAM schreiben. Viele Kassensystem machen das
    heute noch so.

    Ob das noch so richtig aktuell ist ? Ich habe da Zweifel. Dafür gibt es
    heute die GUI.



  • Moin,

    ok. Natürlich kann man das mit der GUI machen. Ich hatte mir erhofft, dass es dafür noch irgendwas unter der Konsole gibt. Ich wollte erstmal "Konsolen-C++" lernen und dann zur GUI übergehen.

    In C ist das (natürlich) kein Problem, man kann auch heute noch aus
    der Cmdline direkt ins Video-RAM schreiben.

    Das hört sich irgendwie kompliziert an und wahrscheinlich ist es das auch.

    [OT]

    Das ist heute so was von tot

    Unter http://www.dbase.com/ gibt's das immer noch. Ist aber tatsächlich nur noch Nischenprodukt 😞
    [/OT]



  • Tja, hätten die Hochnasen von Ashton-Tate das damals nicht so in den Sand
    gesetzt wäre das vielleicht heute noch etwas. Als Format zum Datenaustausch
    bekomme ich das noch manchmal. Aber eher selten.

    Heute gibt's ja nur noch SQL (und Btrieve ... uvam).

    Man sollte mal die ganzen DOS-Shells durchforsten, bestimmt gibt es da
    etwas, das das kann.



  • Man sollte mal die ganzen DOS-Shells durchforsten, bestimmt gibt es da
    etwas, das das kann.

    Natürlich ginge das. Dann müsst ich die aber jedesmal mitgeben.

    Ich glaub ich bin zu folgendes Ergebnis gekommen:
    - Improved Console muss reichen
    - möglichst schnell GUI lernen



  • johannes-h schrieb:

    Man sollte mal die ganzen DOS-Shells durchforsten, bestimmt gibt es da
    etwas, das das kann.

    Natürlich ginge das. Dann müsst ich die aber jedesmal mitgeben.

    Ich glaub ich bin zu folgendes Ergebnis gekommen:
    - Improved Console muss reichen
    - möglichst schnell GUI lernen

    😉 Jepp.



  • johannes-h schrieb:

    Moin,
    wie kann ich in der cmd eine Eingabemaske erstellen (verschiedene Feld, zwischen denen ich mit "Tab", Pfeiltasten, etc. wechseln kann).

    Für sowas kannst du dich mit den Console Functions anfreunden
    http://msdn.microsoft.com/en-us/library/ms682073(VS.85).aspx

    Mann kann sich damit was zurechtfriemeln:

    #include  <windows.h>
    #include  <stdio.h> 
    
    HANDLE hIn, hOut;
    
    #define BLACK 0
    #define BLANK ' '
    #define RETURN 13
    #define IFLD_SIZE 10
    
    char ifld[IFLD_SIZE+1]; // Inputfield :)
    
    const ifld_color = BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE;
    const ifld_x = 10, ifld_y = 5;
    const std_color = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE;
    
    int init_console() {
    	hIn = GetStdHandle ( STD_INPUT_HANDLE );
    	hOut = GetStdHandle ( STD_OUTPUT_HANDLE );
    	if (  hIn == INVALID_HANDLE_VALUE || hOut == INVALID_HANDLE_VALUE )
    		return 1;
    	return 0;
    }
    
    int gotoxy ( short x, short y ) {
    	COORD pos; pos.X = x, pos.Y = y;
    	if ( !SetConsoleCursorPosition ( hOut, pos ))
    		return 1;
    	return 0;
    }
    
    int show_console_cursor( int show ) 
    { 
        CONSOLE_CURSOR_INFO cci = {0}; 
    	if ( !GetConsoleCursorInfo( hOut, &cci ) ) 
            return 1;
        cci.bVisible = show; 
        if ( !SetConsoleCursorInfo( hOut, &cci ) ) 
            return 1;
    	return 0;
    } 
    
    int print_input_field ( short x, short y, int len ) {
    	if ( !SetConsoleTextAttribute ( hOut, ifld_color )) return 1;
    	if ( gotoxy ( x, y )) return 1;
    	while ( len-- )	putchar( BLANK );
    	return 0;
    }
    
    int input() {
    	int i = 0, n = sizeof(ifld);
    	if ( gotoxy ( ifld_x, ifld_y )) return 1;
    	while ( i <= IFLD_SIZE ) {
    		if ( ( ifld[i] = getche() ) == RETURN ) {
    			ifld[i] = 0;		
    			break;
    		}
    		else i++;
    	}
    
    	gotoxy ( ifld_x, ifld_y + 2 );
    	SetConsoleTextAttribute ( hOut, std_color );
    	if ( i > IFLD_SIZE ) {
    		ifld[IFLD_SIZE] = 0;
    		puts ( "Input too long!" );
    	}
    	return 0;
    }
    
    int main () { 
    	if ( init_console() ) return 1;
    	show_console_cursor(0);
    	if ( print_input_field ( ifld_x, ifld_y, sizeof(ifld) )) return 1;
    	if ( input() ) return 1;
    	gotoxy ( ifld_x, ifld_y + 3 );
    	printf ("Input field content: %s\n", ifld );
    	gotoxy ( ifld_x, ifld_y + 4 );
    	return 0;
    }
    

    Gruß,
    B.B.



  • Moin,

    Erstmal danke.

    Kann es sein, dass das mit'm QtCreator (MinGW) nicht funktioniert. Es erscheinen folgend Build-Fehler:

    main.cpp:13: error: ISO C++ forbids declaration of 'ifld_color' with no type
    main.cpp:14: error: ISO C++ forbids declaration of 'ifld_x' with no type
    main.cpp:14: error: ISO C++ forbids declaration of 'ifld_y' with no type
    main.cpp:15: error: ISO C++ forbids declaration of 'std_color' with no type
    main.cpp: In function 'int input()':
    main.cpp:54: error: 'getche' was not declared in this scope
    main.cpp:51: warning: unused variable 'n'
    

    [EDIT] Die Console-Funktions werd ich mir auch mal angucken[/EDIT]



  • Das ist ein simples C Programm, für nen C++ Compiler musst du wohl
    const int als Typ nehmen und die getche Deklaration steckt in der conio.h.



  • Danke, das wars. Jetzt klappts. 🙂


Log in to reply