Jump to content

c++ linux edição de campos texto


Americo Pereira

Recommended Posts

Boas, decididamente optei por trabalhar com Linux, estou a desenvolver uma aplicação que corre em consola.

Estou com alguns problemas iniciais e necessitava de ajuda numa questão que me anda a por os cabelos em pé.

Em relação ao código que apresento quando digito 'ç' ou um carater com acento o cursor anda um espaço a mais, o controlador do teclado devolve dois inteiro distintos, deduzo que seja o buffer do teclado, alguém sabe como resolver esta questão?  

 

#include <cstdlib>
#include <stdio.h>


#include <string>

#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>
#include <cstdlib>
#include<stdlib.h>
#include <stdio.h>
#include <string.h>
#include<iostream>
#include<string>
#define ENTER 10
#define ESC 27
#define BSP 127
using namespace std;

/*
 * 
 */
void gotoxy(int x, int y){
        printf("%c[%d;%df",0x1b,y,x);
}
 
int GetKey(void)
{
    struct termios oldattr, newattr;
    int ch;
    tcgetattr( STDIN_FILENO, &oldattr );
    newattr = oldattr;
    newattr.c_lflag &= ~( ICANON | ECHO );
    tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
    ch = getchar();
    tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
    return (int)ch;
}
int Get_text(int x, int y, int tam, char *texto){
    int i = 0, num_carater = 0;
    bool sair = true;
    char carater;
    char str[250];
    if (tam > 250) tam = 250;

    for (i=0;i<tam && texto!='\0';i++,num_carater++){
            str=texto;
        }
        
        for (i=i; i<tam; i++){
        str = '.';

    }
    str[tam] = '\0';


    do{

        gotoxy(x, y);
        cout<< str;
        gotoxy(x + num_carater , y);
        carater = GetKey();
                
                switch (carater){
        case ENTER:
                    for(i=0;i<num_carater;i++){
                        texto=str;
                        
                    }
                    texto[num_carater]='\0';
                    for(i=i;i<tam;i++){
                        str=' ';
                        
                    }
                    gotoxy(x, y);
                    printf(str);
                        return 1;
            break;

        case ESC:

            return 0;
            break;
        case BSP:
            if (num_carater > 0){
                
                str[--num_carater] = '.';
            }

            break;
        default:
                    if(1){
            //std::cout<<(int)carater;
            if (num_carater < tam){
                str[num_carater] = carater;
                num_carater++;
            }
                    }
        }

    } while (sair);
    return 0;
    
}
int main(int argc, char** argv) {
    char campo[20]={'                  \0'};
    system("clear");
    gotoxy(10,10);
    Get_text(10,20,10,campo);
    
    return 0;
}
Edited by Americo Pereira
Link to comment
Share on other sites

1 hora atrás, HappyHippyHippo disse:

podes responder somente a duas questões ?

- o que é que ese código deveria fazer ?

- onde tiraste a ideia que eria dessa maneira ?

Bom dia Happy, obrigado pela atenção, respondendo ás tuas questões:

1- Pretendo editar uma ficha de cliente em modo consola em linux, tenho um classe edita, a qual tem vários métodos que permite editar um campo  tipo inteiro, float, data, etc .

deste modo posso controlar o tamanho do campo e os carateres permitidos.

2- Éra assim que eu fazia quando trabalhava com turbo c da borland na época de 90, MS DOS. existe outra maneira de o fazer? sei que posso usar o cin e depois fazer o teste para determinar se os carateres estão dentro do conjunto permitido, e como faço para quando o utilizador só pode escrever 10 carateres e carrega em 20 teclas, vai-me invadir zona da ficha que não devia.    

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.