Comment détecter la fin d'activation de la molette ?

Résolu
geocad Messages postés 4 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 25 octobre 2007 - 23 oct. 2007 à 11:56
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?

8 réponses

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
Ben Oui
3
geocad Messages postés 4 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 25 octobre 2007
24 oct. 2007 à 13:25
Ca bouge pas beaucoup ici. Serait-ce à cause de la rentrée???
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
24 oct. 2007 à 22:11
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...
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
24 oct. 2007 à 22:48
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;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
24 oct. 2007 à 22:55
Bien sûr, il faut presser la molette pendant tout le temps du traitement rapide...
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
24 oct. 2007 à 23:30
Oups!
...
... //On teste l'état du bouton central.
...

Mille excuses
0
geocad Messages postés 4 Date d'inscription mardi 23 octobre 2007 Statut Membre Dernière intervention 25 octobre 2007
24 oct. 2007 à 23:43
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" ?
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
25 oct. 2007 à 14:25
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?
0
Rejoignez-nous