Newsgroup: it.hobby.elettronica.digitale
Titolo: Doppio clic

Ciao,
sto realizzando una semplice interfaccia utente e mi accorto solo ora di 
non sapere come funziona il doppio clic.
Cioï¿œ, prendiamo il mouse: se eseguo un singolo clic il sistema al 
rilascio del tasto esegue *immediatamente* la funzione.
Perï¿œ ï¿œ in grado di discriminare il doppio clic... come fa?
Per quanto semplice, mi sfugge...
Marco

 Perï¿œ ï¿œ in grado di discriminare il doppio clic... come fa?
un timer?
(es: se entro X millisecondi si verificano 2 eventi di rilascio allora ï¿œ 
un doppio click)
-ice-

 un doppio click)
Si, ma se tu fai un singolo click a me sembra che la funzione viene 
eseguita immediatamente! Quindi se cosï¿œ fosse significa che quando fai 
doppio click il sistema esegue *sempre* due funzioni: quella legata al 
primo click e quella legata al doppio click.
E' forse cosï¿œ?
Marco

 primo click e quella legata al doppio click.
Ciao!
Io metterei la verifica per il singolo/doppio click PRIMA delle funzioni 
singolo doppio click. DIciamo una cosa cosï¿œ:
Verifica singolo click/doppio click (doppio evento entro x secondi)
Se singolo click: procedura singolo click
Se doppio click: procedura doppio click
Il fatto che adesso la procedura parta subito suppongo sia dovuta al 
fatto che deve solo verificare un solo evento, quindi un controllo molto 
semplice (e veloce).
Ti butterei giï¿œ anche due righe di codice se ti interessa, ma in ASM, 
perchï¿œ c o basic non li conosco!
Ciao!
-- 
Stefano M. (Italy)
WEB: 
http://www.lemming.it
"La necessitï¿œ di parlare,  l'imbarazzo di non aver nulla da dire
e la brama di mostrarsi persone di spirito, sono tre cose capaci
di rendere ridicolo anche l'uomo piï¿œ grande."         (Voltaire)

 Per quanto semplice, mi sfugge...
Un semplice timer che conta il tempo dall'ultimo rilascio.
Se ci sono 2 eventi nella finestra di tempo desiderato si tratta di doppio 
click.
Ho implementato qualcosa di simile per un piccolo pannello touch seriale.
Al primo click porto il focus.
Se non c'ï¿œ rilascio abilito il trascinamento.
Se c'ï¿œ il rilascio senza variazione di coordinate non ï¿œ un trascinamento e 
inizio a contare il tempo.
Se arriva un altro rilascio prima che sia trascorso il tempo ï¿œ un doppio 
click.
Attenzione che ad ogni rilascio deve partire un timer differente dal primo 
per poter contare eventualmente un doppio click dovuto ad un terzo rilascio.

 Se doppio click: procedura doppio click
Ah, ho capito. Quindi se imposto ad esempio 250 ms come intervallo 
massimo per il doppio click, nel caso di singolo evento la mia procedura 
partirï¿œ 250 ms dopo il rilascio del tasto.
Marco

 doppio click.
Ok, quindi come dicevo a Stefano, vi sarï¿œ comunque un ritardo 
nell'esecuzione dell'evento relativo al singolo click. Se cosï¿œ non fosse 
sarebbe anticausale :)
Marco

 Si, probabilmente � questo.
Non credo sia cos�. Relativamente a Windows, non esiste un 
messaggio "click": in caso di click vengono inviati alla 
finestra, in successione, i messaggi:
WM_LBUTTONDOWN
WM_LBUTTONUP
In caso di doppio click la sequenza � invece:
WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP
E questo anche se la finestra non riceve il focus. Quindi, 
vengono per cos� dire generati sia i messaggi di click che di 
doppio click. Per cui la reazione al click pu� avvenire senza 
ritardi.
HTH,
-- 
Stefano Frosio
www.esse-effe.com

 ritardi.
Giusto, ma quello che intendevo io ï¿œ che non puoi a meno di introdurre 
il famoso ritardo eseguire *o* la funzione click *o* la funzione doppio 
click (or esclusivo) in quanto dopo il messaggio WM_LBUTTONUP non puoi 
sapere se arriverï¿œ anche il WM_LBUTTONDBLCLK. Se vuoi saperlo (ed 
evitare cosï¿œ la reazione al semplice click) devi aspettare...
Marco

 al semplice click) devi aspettare...
S�, questo � ovviamente corretto, dai tuoi messaggi precedenti 
mi pareva fossi interessato a capire come il sistema gestiva gli 
eventi pi� che come utilizzarli.
Se invece il problema � come utilizzarli, personalmente non 
effettuerei una discriminazione tra click e doppio click, tanto 
meno basandomi su una temporizzazione. Cio� reagirei agli eventi 
cos� come mi vengono comunicati dal sistema operativo. Pu� anche 
darsi che tu ti stia trovando in una situazione dove se l'utente 
fa doppio click assolutamente non deve essere preceduto dal 
codice dell'evento click, per� mi sembra una situazione non 
standard e forse il problema andrebbe risolto diversamente.
-- 
Stefano Frosio
www.esse-effe.com

 standard e forse il problema andrebbe risolto diversamente.
Infatti :)
Spiego il contesto: ho un circuito con un pulsante a sfioramento. Quando 
l'utonto tocca la superficie ottengo un livello alto quando lo rilascia 
ce l'ho basso.
Devo gestire una macchina a stati finiti per controllare la mia 
applicazione (il tutto ï¿œ sempre sull'AVR ATTiny25 - che diventerï¿œ 45).
Ho implementato facilmente il click e l'hold, ovvero la pressione 
continuata di un tot di tempo - ad esempio 2 secondi.
Mi servirebbe perï¿œ un altro evento e pensavo appunto al "doppio click". 
Questo perchï¿œ ci sono alcuni stati che possono avere tre diverse uscite 
a seconda del click/doppio click/hold.
Dato il tipo di applicazione assolutamente non critica, direi che posso 
permettermi di aspettare x ms dopo il primo rilascio e verificare se si 
preme nuovamente il pulsante.
Marco

 e verificare se si preme nuovamente il pulsante.
Ecco, qui siamo ripassati dalla parte del sistema operativo pi� 
che da quella dell'utente (inteso come applicazione). Per cui 
per verificare il doppio click � sicuro che ti serva una 
temporizzazione.
Il punto � se eseguire comunque il codice del semplice click o 
solo quello del doppio click. E qui dipende da cosa l'utente si 
aspetta, ma visto che non stiamo parlando di un'interfaccia 
standard e che abbinerai tre stati a tre diversi modi di agire 
sul pulsante mi sembra naturale che uno escluda l'altro.
-- 
Stefano Frosio
www.esse-effe.com

 partirï¿œ 250 ms dopo il rilascio del tasto.
Sï¿œ, in entrambi i casi partirï¿œ con quel "ritardo".
Mi pare la soluzione piï¿œ semplice e lineare!
