Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    204

    [delphi] Intercettamento tasti ( es ctrl-alt-i )

    Ciao a tutti..
    Ho scritto una piccola applicazione che mi permette di spedire ogni tot di minuti una serie di dati ad una stampante..
    L'utente sceglie ogni quanti minuti spedire questi dati per esempio 1 minuto.
    Per far passare questo minuto ho fatto un ciclo while che mi controlla quanto tempo è trascorso e mi fa scorrere una ProgressBar
    in modo da far capire all'utente che il programma non si è piantato.

    Sto cercando di inserire un tasto interrompi per terminare bruscamente la procedura ( poniamo si inceppi la carta ) ma non riesco ad intercettarlo e nemmeno una combinazione di tasti es
    ctrl-alt-I nei vari eventi on_key_down.

    Quando appare la ProgressBar la maschera sfarfalla ed è come bloccata

    Mi ricordo che in VB6 richiamavo una funzione per fare in modo di "scaricare" la maschera dalla memoria velocemente e questo mi
    permetteva di premere i tasti.

    Esiste una cosa simile in delphi oppure cosa ho sbagliato??
    Grazie

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,464

    Re: [delphi] Intercettamento tasti - tutorial sui thread

    Originariamente inviato da FilSWS
    Ho scritto una piccola applicazione che mi permette di spedire ogni tot di minuti una serie di dati ad una stampante...
    L'utente sceglie ogni quanti minuti spedire questi dati per esempio 1 minuto.
    Ok.

    Originariamente inviato da FilSWS
    Per far passare questo minuto ho fatto un ciclo while che mi controlla quanto tempo è trascorso e mi fa scorrere una ProgressBar in modo da far capire all'utente che il programma non si è piantato.
    Non mi pare una scelta molto azzeccata perchè, tendenzialmente, il ciclo while impiega molta CPU se non viene inserito un "riposo"; inoltre, l'applicazione risulta bloccata quando il programma elabora i dati o rimane in attesa di farlo.

    Originariamente inviato da FilSWS
    Sto cercando di inserire un tasto interrompi per terminare bruscamente la procedura ( poniamo si inceppi la carta ) ma non riesco ad intercettarlo e nemmeno una combinazione di tasti es ctrl-alt-I nei vari eventi on_key_down.
    Non riesce ad intercettarlo poichè il ciclo del programma e l'eventuale attesa che si svolgono nel thread dell'applicazione precludono la gestione del messaggio corrispondente alla pressione del tasto.

    Originariamente inviato da FilSWS
    Quando appare la ProgressBar la maschera sfarfalla ed è come bloccata
    Il comportamento è probabilmente dovuto al fatto che il ciclo che hai introdotto nel programma impedisce anche la gestione degli eventi legati al "refresh" grafico dell'applicazione.

    Originariamente inviato da FilSWS
    Mi ricordo che in VB6 richiamavo una funzione per fare in modo di "scaricare" la maschera dalla memoria velocemente e questo mi permetteva di premere i tasti.
    Esiste una cosa simile in delphi oppure cosa ho sbagliato??
    Molto probabilmente, si tratta di DoEvents, che esiste anche in Delphi come metodo dell'oggetto Application: Application.ProcessMessages.

    Tale metodo è funzionale quanto pericoloso, poichè nel punto in cui è richiamato indica all'applicazione di gestire tutti i messaggi presenti in coda (tra cui disegno, clic su pulsanti e altri ancora) prima di proseguire l'elaborazione; tuttavia, nella coda potrebbero essere presenti messaggi di chiusura del form, di shutdown del sistema, di terminazione del programma e così via che, se sopraggiungono durante l'elaborazione, comporterebbero un crash.

    In VB l'uso di DoEvents è tollerabile (prendendo anche in quel caso tutte le precauzioni), ma in Delphi - essendoci i Thread - è una soluzione che giudico assurda e da evitare per qualsiasi software, anche il più semplice, che sia sviluppato con un minimo di professionalità.

    Creare un thread è semplicissimo, ed è una soluzione che ti permette di avviare una routine, magari continuata (il tuo ciclo while) in modo asincrono rispetto al percorso di esecuzione del programma principale che rimane quindi libero di "respirare" e intercettare gli eventi, tra cui la pressione di un tasto in grado di fermare tale thread o sospenderlo per risolvere eventuali problemi.

    La trattazione dei thread è molto lunga, quindi non posso descriverti tutto ciò che c'è da sapere in questo contesto, ma posso fornirti un link ad un tutorial molto interessante e ben fatto, a mio avviso, sull'argomento:
    Tutorial sui Thread.
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3

    Re: [delphi] Intercettamento tasti ( es ctrl-alt-i )

    Originariamente inviato da FilSWS
    Per far passare questo minuto ho fatto un ciclo while che mi controlla quanto tempo è trascorso e mi fa scorrere una ProgressBar
    in modo da far capire all'utente che il programma non si è piantato.
    Perché non utilizzi il componente TTimer ?
    In questo modo puoi usare più semplicemente la ProgressBar.


  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    204
    Sto leggendo il tutorial e lo trovo molto utile..non sapevo dell'esistenza dei thread.
    Ti faccio una domanda scema,
    nel mio caso "costruisco" un thread con all'interno la procedura che mi fa scorrere la progressBar all'interno della form principale e la richiamo con thread.execute al momento giusto??

  5. #5
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,464
    Originariamente inviato da FilSWS
    nel mio caso "costruisco" un thread con all'interno la procedura che mi fa scorrere la progressBar all'interno della form principale e la richiamo con thread.execute al momento giusto??
    Indicativamente sì, ma leggi attentamente il tutorial poichè ci sono degli accorgimenti da prendere quando da un thread esterno si tenta di modificare proprietà dei componenti e dei controlli visuali utilizzati anche dal thread principale dell'applicazione, detto primario.

    Non so come è strutturata la tua applicazione, ad ogni modo indicativamente alla pressione del pulsante di avvio viene creato il tuo thread che esegue il ciclo richiesto, codificato nel metodo Execute.

    Non si deve richiamare direttamente il metodo Execute, bensì si crea il thread senza sospenderlo oppure, in caso contrario, si avvia manualmente chiamando il metodo Resume.

    Ribadisco di leggere attentamente il tutorial e di leggerlo tutto, se intendi farne uso, poichè mi hai fatto domande le quali hanno una loro spiegazione già all'interno del tutorial.

    Ad ogni modo, si tratta di una complicazione rispetto all'uso del semplice TTimer come ti ha suggerito Alberto...valuta tu quale soluzione ti fa più comodo analizzando a fondo gli effetti collaterali e l'impatto di entrambe sulla tua applicazione.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2004
    Messaggi
    204
    Ok..ho usato il TTimer..è più adatto alla mia semplice applicazione.
    Comunque interessanti anche i thread..li userò per qualcosa di più complesso.
    Grazie

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 © 2025 vBulletin Solutions, Inc. All rights reserved.