Comment détecter la fin d'activation de la molette ? [Résolu]

Messages postés
4
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
25 octobre 2007
- - Dernière réponse : geocad
Messages postés
4
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
25 octobre 2007
- 25 oct. 2007 à 18:12
Bonjour,

J'ai une petite appli dévellopée en Delphi 5, dans laquelle je fais un traitement rapide mais
provisoire quand on fait rouler la molette de la souris. Pour ça, c'est
OK, j'utilise OnMouseWheel(...) Mais le Hic, c'est que je dois faire un
traitement plus fin, dès qu' on arrête la manipulation de la molette.
Ce serait facile s'il existait un évènement qu'on pourrait appeler
"OnMouseWheelStop", mais voilà, j'ai pas trouvé, et je ne sais pas trop
comment faire pour détecter la fin de la manip de la molette.

Quelqu'un a-t-il une idée?
Afficher la suite 

8 réponses

Meilleure réponse
Messages postés
4
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
25 octobre 2007
3
Merci
Ben Oui

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 190 internautes nous ont dit merci ce mois-ci

Commenter la réponse de geocad
Messages postés
4
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
25 octobre 2007
0
Merci
Ca bouge pas beaucoup ici. Serait-ce à cause de la rentrée???
Commenter la réponse de geocad
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
0
Merci
Salut,

Tu voudrais faire un événement avec un non-événement, quoi.



Et tu t'étonnes que personne ne bouge?



En fait, quand on fait rouler la molette, l'événement n'arrête pas d'arrêter et de recommencer...
Commenter la réponse de Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
0
Merci
Essaie ça quand même :



if ssMiddle in Shift then begin
    Repeat
     

//Traitement  rapide
      Application.ProcessMessages;
    until (GetAsyncKeyState(VK_MBUTTON) = 0


);//On teste l'état du bouton gauche.
 


//Traitement fin
  end;
Commenter la réponse de Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
0
Merci
Bien sûr, il faut presser la molette pendant tout le temps du traitement rapide...
Commenter la réponse de Caribensila
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
0
Merci
Oups!
...
... //On teste l'état du bouton central.
...

Mille excuses
Commenter la réponse de Caribensila
Messages postés
4
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
25 octobre 2007
0
Merci
Mon soi-disant non-évènement, n'appelait pas forcément une non-réponse. Je vais pas dire à ceux qui utilisent mon appli de presser un bouton pour signaler qu'on a fini de tourner la molette! Ca serait de la non-informatique...
En tout cas le besoin que j'ai exprimé existe, et c'est même une solution élégante pour faire certains effets en DAO.

Ma solution: Un timer avec un intervale de 100 milli sec
var WheelOn : boolean = false;
var wheeltime : TDateTime = 0.0;
 
procedure TForme1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
 
TraitementProvisoireRapide; //
 
WheelOn := true;
Timer1.enabled := true; // Traitement Final dans OnTimer
Handled := true;
end;

procedure TForme1.Timer1Timer(Sender: TObject);
begin
// détection de la fin d'activation de la molette
// pour se substituer à un évènement manquant: "OnMouseWheelStop"
if WheelOn thenbegin WheelOn:=false; wheeltime := Now; exit; end;
 
//ici la molette n'a pas été activée depuis Timer1.interval milli sec
// On se donne un délai supplémentaire pour assurer
if( Now - wheeltime ) >0.0000023thenbegin{200 milli sec (1 s = 0.0000115)}
Timer1.enabled := false;
wheeltime := 0.0;
 
TraitementFinal;
 
end;
end;

 

Qui dit "mieux" ?
Commenter la réponse de geocad
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
13
0
Merci
procedure TForm1.FormMouseWheel(Sender: TObject; Shift: TShiftState;
                WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
begin
  if ssMiddle in Shift then begin
      Repeat
        


  //...Traitement  rapide...
          Application.ProcessMessages;
      Until (GetAsyncKeyState(VK_MBUTTON) = 0 );
     




//...Traitement final...
  end;
end;

C'est concis, pas de Timer, pas de variables globales...

Qu'est-ce qui ne te plaît pas?
Que l'utilisateur doive appuyer sur la molette centrale?
Commenter la réponse de Caribensila