Newsgroup: it.comp.lang.delphi
Titolo: [D7]: left click, right click & dbl click detecting

Ciao a tutti!
Dunque, per un certo componente (un pannello che visualizza una label
numerica txtNumber) su un form vorrei rilevare e gestire il mouse nel modo
seguente:
- clic sinistro: decrementa il numero
- clic destro: incrementa il numero
- doppio clic: apre un dialoghetto di impostazioni
Pensavo di risolvere con OnMouseDown e OnDblClick (vedi sotto) ma ho notato
che, anche se in realtà il doppio clic mi apre il dialogo voluto e il clic
semplice sinistro/destro diminuiscono/incrementano come voluto il valore
nella label, ottengo anche una indesiderata "sovrapposizione" fra l'azione
del clic semplice (decremento/incremento) e l'apertura del dialogo di
impostazioni stesso: in sostanza nel momento che effettuo il doppio clic
avviene dapprima anche il decremento del numero (in quanto viene comunque
richiamata la OnMouseDown)
Come potrei differenziare le routine "senza effetti collaterali"?
Grazie per qualsiasi suggerimento!
Un saluto e Auguri a tutti di un Ottimo 2004 Delphico :-) !
...
procedure TFormMain.txtNumberMouseDown(Sender: TObject; Button:
TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
      if (Button = mbLeft) then
        // chiama azione di decremento
        actDecExecute(Sender)
     else if (Button = mbRight) then
       // chiama azione di incremento
        actIncExecute(Sender);
end;
procedure TFormMain.txtNumberDblClick(Sender: TObject);
begin
     // chiama dialogo di setup
    actSetupExecute(Sender);
end;

 Come potrei differenziare le routine "senza effetti collaterali"?
Potresti usare MouseDown solo per il tasto destro, e usare OnClick per il
tasto sinistro.
--
Jax
====
L'età in cui si divide tutto, é quella in cui non si possiede nulla.
(A.Karr)

 tasto sinistro.
grazie ma purtroppo ho notato che in questo modo due click abbastanza
ravvicinati effettuati col tasto sinistro equivalgono all'azione del doppio
clic
un saluto

 doppio clic
Hai ragione... perň č cosě che funziona windows stesso.
Il click singolo non puň escludere il doppio click. Se cosě fosse, vorrebbe
dire che il sistema, per detectare un click singolo, dovrebbe funzionare
cosě:
- ho detectato un click
- aspetto tot millisecondi
- se, dopo questi tot millisecondi l'utente non ha cliccato ancora, allora č
un click singolo
capisci che se fosse cosě, tra un click dell'utente e l'effettiva esecuzione
del codice corrispondente, ci sarebbe una discrepanza di tempo abbastanza
fastidiosa.
--
Jax
====
Non condivido ciň che dici, ma sarei disposto a dare la vita affinché
tu possa dirlo. (Voltaire)

Siccome per far aprire la finestrella di setup devi fare doppio click, con 
il conseguente incremento di una unità, si potrebbe mettere nell'evento 
OnShow della finestrella una procedurina che decrementa di uno quel valore 
(è un po' sporco come lavoro però funziona); oppure abbinare il tasto shift 
della tastiera nel seguente modo:
procedure TFormMain.txtNumberMouseDown(Sender: TObject; Button:
TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
 
  if Shift=ssShift then //a memoria non ricordo bene ma puoi usare l'help
    begin
       if (Button = mbLeft) then
          begin
         // chiama dialogo di setup
          actSetupExecute(Sender);
         end;
       end
     else
       begin 
         case Button of
            mbLeft: actDecExecute(Sender); // chiama azione di decremento
 
            mbRight:actIncExecute(Sender);  // chiama azione di incremento
         end;
        end;
       end;
 end;
In sostanza la procedura controlla lo stato del tasto shift: se è premuto e 
premi il sinistro del mouse si apre la finestrella mentre con il destro non 
fai niente, invece se non è premuto il shift allora il destro decrementa e 
il sinistro incrementa; il doppio click non si usa
Forse manca qualche end; ma grossomodo l'ibea a me sembra buona.
Ciao.
Inviato da 
www.mynewsgate.net

ps: non so perchè ma non vedo l'indentazione che ho usato, vedo tutto 
allineato a sinistra.
Inviato da 
www.mynewsgate.net