PDA

Visualizza la versione completa : [C++] Autocompletamento nella digitazione in applicazione Console


Sifr
23-07-2007, 14:42
Ciao,

sto scrivendo un'applicazione sotto Windows con un'interfaccia basata su console di testo, o prompt dei comandi se preferite ;)

Questa applicazione riceve in input una stringa "Cognome Nome" e restituisce il numero di matricola corrispondente, confrontando la stringa "Cognome Nome" con un file di testo così strutturato:

Cognome Nome;Matricola
Cognome Nome;Matricola

Quello che vorrei ottenere io è che, quando il programma richiede il nome dell'utente, se io comincio a scrivere "Pipp" e poi premo tab, da solo capisca che si tratta di Pippo Rossi.

Qualche consiglio per l'approccio al problema?

:ciauz: :ciauz:
Sifr

oregon
23-07-2007, 14:47
La vedo dura con una applicazione di tipo console ... questo tipo di funzionalita' e' piu' adatta a sistemi con una GUI e oggetti (tipo combobox o listbox) e gestione degli eventi ...

Non che non si possa fare (intravedo qualche soluzione) ma sarebbe un po' pesante ...

Sifr
23-07-2007, 14:58
beh in teoria pensando alla shell di linux o al prompt dei comandi di windows stesso introdotto in xp, la cosa è fattibile.

Il programmino è dannatamente piccolo e non dovrebbe impiegare troppi cicli di cpu, inoltre il database non è immenso (un centinaio di voci) quindi se lo appesantisco un po' non è forse così grave.

Effettivamente avevo pensato ad una GUI, il problema è che non ho esperienza in programmazione di interfacce grafiche in ambito windows, dunque volevo evitare di imparare ad utilizzare le api per un programmino così banalotto.

Il punto di partenza sarebbe trovare un modo per gestire gli input da tastiera... Ovvero, risolverebbe l'intero problema riuscire a trovare il modo di intercettare il segnale (ovvero la pressione del tasto TAB) mentre l'utente sta digitando nel prompt (cin >>).

ibykos
23-07-2007, 15:00
Ciao!

La cosa scomoda secondo me è che devi cambiare la modalità di input, in maniera da poter processare subito la pressione del TAB senza dover aspettare il prossimo INVIO.
In unix il problema si risolve con la libreria ncurses, ma non conosco l'equivalente in windows.

Sifr
23-07-2007, 15:09
infatti, il difficile è proprio (e forse anche soltanto) quello, io non voglio che ci sia bisogno di premere invio, è necessaria la massima velocità per l'utente :yuppi:

oregon
23-07-2007, 15:16
Originariamente inviato da Sifr
beh in teoria pensando alla shell di linux o al prompt dei comandi di windows stesso introdotto in xp, la cosa è fattibile.

Infatti, ti ho detto che e' possibile. Il fatto e' che nei casi che hai citato e' il sistema che ha il totale controllo, carattere per carattere, dell'input, cosa che il tuo programma non ha facilmente ...



Il punto di partenza sarebbe trovare un modo per gestire gli input da tastiera... Ovvero, risolverebbe l'intero problema riuscire a trovare il modo di intercettare il segnale (ovvero la pressione del tasto TAB) mentre l'utente sta digitando nel prompt (cin >>).

In C puoi usare la getch di conio.h anche se e' sconsigliata (puoi usare anche la _getch).
Qualcosa del genere per gestire il tab



#include <conio.h>

int main()
{
printf("Wait for tab ... ");

while(getch() != '\t')
;

printf("ok!\n");

return 0;
}


Da qui, puoi sviluppare una tua funzione che gestisca l'input carattere per carattere in una stringa e tratti separatamente il tasto tab ...

Sifr
23-07-2007, 17:35
ok grazie, domani provo ad implementare una funzione con l'aiuto di getch()


Solo non ho capito una cosa, te intendi fare una cosa tipo questa?

while(getch() != '\t') {

// funzione di input personalizzata

};

E se invece facessi un ciclo che:

esce su getch() == '\r';
chiama la funzione autocompleta() su getch() == '\t';
in ogni altro caso inserisce in un buffer il carattere ottenuto;

che ne dici?

Sifr
24-07-2007, 10:31
Ecco come sto risolvendo, riporto qualora dovesse tornare utile a qualcuno:

do {
static int counter = 0; // da utilizzare come indice. static necessario

typedchar = getch(); // cattura un singolo carattere
if(typedchar=='\t'){ // se uguale a tab...
autocompleta(); // ... chiama la routine di autocompletamento
continue; // non vogliamo aggiungere il carattere TAB al
// buffer contenente la stringa da ricercare nel db
}

nome[counter] = typedchar; // aggiunge il carattere al buffer contenente il nome
counter++;
putchar(typedchar); // mette il carattere nello stdout

} while (typedchar != '\r'); // finchè diverso da invio


ora vedo di scrivere anche la funzione autocompleta()

Loading