Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434

    [c++] autocompletamento

    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?


    Sifr

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    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 ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434
    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 >>).

  4. #4
    Utente di HTML.it L'avatar di ibykos
    Registrato dal
    Feb 2005
    Messaggi
    201
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434
    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

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    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

    codice:
    #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 ...

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434
    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?

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2002
    Messaggi
    434
    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()

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.