FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» bug SEVERE fnc+sub n°3: pb avec variables locales
par silverman Aujourd'hui à 13:08

» Virus/Antivirus
par jjn4 Aujourd'hui à 13:06

» Biomorphe de Pickover
par silverman Aujourd'hui à 11:34

» PanExpress : l'éditeur Panoramic avec création d'objet
par Minibug Dim 23 Sep 2018, 20:14

» Planétarium virtuel.
par Pedro Alvarez Dim 23 Sep 2018, 17:50

» Calculatrice
par papydall Ven 21 Sep 2018, 20:45

» Orbites de l’ensemble de Mandelbrot
par Minibug Ven 21 Sep 2018, 19:32

» Demande pour Jack concernant PanExpress
par Minibug Ven 21 Sep 2018, 09:04

» EPP_V01 éditeur pour Panoramic
par Minibug Mer 19 Sep 2018, 19:03

» [RESOLU] Quelle ligne est sélectionnée dans SYNEDIT ?
par Jean Claude Mer 19 Sep 2018, 19:02

» Petit coucou en passant !
par Minibug Dim 16 Sep 2018, 13:03

» bug SEVERE fnc+sub n°2: variables globales corrompus
par silverman Dim 16 Sep 2018, 11:38

» Verrouiller un form en avant plan
par silverman Dim 16 Sep 2018, 10:50

» Fin de l'aventure.
par Pedro Alvarez Sam 15 Sep 2018, 16:16

» Demande d'explications Sur File_Write & File_writeln
par Jack Sam 15 Sep 2018, 15:26

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Septembre 2018
LunMarMerJeuVenSamDim
     12
3456789
10111213141516
17181920212223
24252627282930
CalendrierCalendrier

Partagez | 
 

 Problème avec MOUSE_LEFT_DOWN(N)

Aller en bas 
AuteurMessage
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Problème avec MOUSE_LEFT_DOWN(N)   Ven 31 Mar 2017, 16:02

La fonction MOUSE_LEFT_DOWN(N) est supposée retourner 1 si le bouton gauche de la souris est enfoncé au-dessus de l'objet N, et 0 sinon.

Or, ceci ne marche qu'immédiatement après le clic, dans l'évènement ON_MOUSE-DOWN. Là, la fonction retourne bien 1.

Mais cela ne marche pas lorsque la souris bouge, tout en maintenant le bouton enfoncé. En particulier, dans l'évènement ON_MOUSE_MOVE, la fonction retourne toujours 0, que le bouton sout einfoncé ou non. Je crains que là, le bug ne soit réel !

Il en est d'ailleurs de même pour MOUSE_LEFT_UP.

Code:
label down, move

picture 11 : full_space 11 : on_mouse_down 11,down
end

down:
  off_mouse_down 11
  caption 0,"down: mouse_left_down="+str$(mouse_left_down(11))+" mouse_left_up="+str$(mouse_left_up(11))+"   "+str$(mouse_x_position(11))+","+str$(mouse_y_position(11))
  on_mouse_move 11,move
  return

move:
  caption 0,"move: mouse_left_down="+str$(mouse_left_down(11))+" mouse_left_up="+str$(mouse_left_up(11))+"   "+str$(mouse_x_position(11))+","+str$(mouse_y_position(11))
  return

Du coup, je ne peux plus savoir si, à un instant donné, la souris est enfoncée ou non.

EDIT

D'ailleurs, le comportement est identique avec la version précédente, celle qui ne corrige pas encore le problème de lancement.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Problème avec MOUSE_LEFT_DOWN(N)   Ven 31 Mar 2017, 21:54

Encore plus simple pour mettre le problème en évidence: on ne gère plus le cas du ON_MOUSE_DOWN, on ne traite que le ON_MOUSE_MOVE sur un picture. Et on surveille le résultat de MOUSE_LEFT_DOWN, MOUSE_LEFT_UP et MOUSE_X_POSITION ainsi que MOUSE_Y_POSITION.

Code:
label move

picture 11 : full_space 11 : on_mouse_move 11,move
end

move:
  caption 0,"move: mouse_left_down="+str$(mouse_left_down(11))+" mouse_left_up="+str$(mouse_left_up(11))+"   "+str$(mouse_x_position(11))+","+str$(mouse_y_position(11))
  return

Et on constate que:
- les coordonnées MOUSE_X_LEFT_POSITION et MOUSE_Y_MOUSE_DOWN sont actualisées systématiquement, à chaque évènement ON_MOUSE_MOVE
- les valeurs de MOUSE_LEFT_DOWN et MOUSE_LEFT_UP passent brièvement à 1 (il faut regarder la barre de titre de près !) pour retomber à 0 tout de suite près

Et ceci quelque soit la position du bouton - restant enfoncé ou relâché. Et ceci ne correspond pas du tout à la doc: MOUSE_LEFT_DOWN et MOUSE_LEFT_UP devraient refléter l'état du bouton gauche de la souris, quelque soit on état. Et en particulier, lorsque l'un est à 1, l'autre doit être à 0 !

Ceci est d'ailleurs parfaitement identique si l'on utilise, non plus l'évènement ON_MOUSE_MOVE, mais un timer avec son évènement ON_TIMER:
Code:
label move, tick

picture 11 : full_space 11 : ' on_mouse_move 11,move
timer 1 : timer_interval 1,100 : on_timer 1,tick
end

tick:
move:
  caption 0,"move: mouse_left_down="+str$(mouse_left_down(11))+" mouse_left_up="+str$(mouse_left_up(11))+"  "+str$(mouse_x_position(11))+","+str$(mouse_y_position(11))
  return
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Problème avec MOUSE_LEFT_DOWN(N)   Sam 01 Avr 2017, 00:37

Et avec une fonction Delphi dans KGF.dll je peux régler le problème ! En effet, je peux faire une fonction du genre
Code:
down% = dll_call1("CheckMouseButton",btn%)
avec btn%=1 pour le bouton gauche et btn%=2 pour le bouton droit. Et la fonction retourne 1 si le bouton est enfoncé, et 0 sinon. Quelque soit la position du curseur, quelque soit la durée pendant laquelle le bouton est enfoncé. Le petit code devient alors:
Code:
label  tick
dim down%

dll_on "KGF.dll"
picture 11 : full_space 11 : ' on_mouse_move 11,move
timer 1 : timer_interval 1,100 : on_timer 1,tick
end


tick:
  down% = dll_call1("CheckMouseButton",1)
  caption 0,"tick: down%="+str$(down%)+"    mouse_left_down="+str$(mouse_left_down(11))+" mouse_left_up="+str$(mouse_left_up(11))+"  "+str$(mouse_x_position(11))+","+str$(mouse_y_position(11))
  return
et la barre de titre contient "down%=" suivi de 0 ou 1, reflétant exactement la position de la touche gauche de la souris.

Voici le code Delphi qui fait cela:
Code:
Function ButtonIsDown(Button:TMousebutton):integer;
var
  Swap :Boolean;
  State:short;
begin
  State:=0;
  Swap:= GetSystemMetrics(SM_SWAPBUTTON)<>0;
  if Swap then
    case button of
      mbLeft :State:=getAsyncKeystate(VK_RBUTTON);
      mbRight:State:=getAsyncKeystate(VK_LBUTTON);
    end
  else
    case button of
      mbLeft :State:=getAsyncKeystate(VK_LBUTTON);
      mbRight:State:=getAsyncKeystate(VK_RBUTTON);
    end;
  if state<0 then result := 1
            else result := 0;
end;

function CheckMouseButton(btn: integer):integer; stdcall; export;
begin
  result := 0;
  case btn of
    1: result := ButtonIsDown(mbLeft);
    2: result := ButtonIsDown(mbRight);
  end
end;

Exports
  CheckMouseButton;

Je vais intégrer cela dans KGF.dll.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
silverman

avatar

Nombre de messages : 678
Age : 46
Localisation : Picardie
Date d'inscription : 18/03/2015

MessageSujet: Re: Problème avec MOUSE_LEFT_DOWN(N)   Sam 01 Avr 2017, 09:30

Effectivement cette commande ne fonctionne pas comme il le faudrait, mais tu n' a pas besoin de KGF pour la faire fonctionner correctement:
Code:
label tick
dim downL%
picture 11 : full_space 11 : ' on_mouse_move 11,tick
' timer 1 : timer_interval 1,100 : on_timer 1,tick
end


tick:
  if mouse_left_down(11)=1
     downL%=1
  else
     if mouse_left_up(11)=1 then downL%=0
  end_if
  '
  caption 0,"tick: downL%="+str$(downL%)+"    mouse_left_down="+str$(mouse_left_down(11))+" mouse_left_up="+str$(mouse_left_up(11))+"  "+str$(mouse_x_position(11))+","+str$(mouse_y_position(11))
return
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Klaus

avatar

Nombre de messages : 11088
Age : 69
Localisation : Ile de France
Date d'inscription : 29/12/2009

MessageSujet: Re: Problème avec MOUSE_LEFT_DOWN(N)   Sam 01 Avr 2017, 10:18

Je vois, Silverman. En activant, soit le ON_MOUSE_MOVE, soit le ON_TIMER, l'indication dans la barre de titre est correcte.

De façon interne, les fonctions mouse_left_down et mouse_left_up de Panoramic utilisent certainement l'API getAsyncKeystate comme moi, et testent le bit le moins significatif pour savoir si un changement d'état est intervenu depuis le dernier appel à getAsyncKeystate.

Mais ceci est sujet à caution, d'après la doc même de MSDN sur cet API. En effet, si un autre processus effectue cet appel entretemps, la veleur du bit le moins significatif n'a plus de signification car le changement d'état a déjà été "digéré" par un autre processes. MSDN met en garde de ne pas se fier à cette information. Je cite:
Citation :
If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks.
et
Code:
Although the least significant bit of the return value indicates whether the key has been pressed since the last query, due to the pre-emptive multitasking nature of Windows, another application can call GetAsyncKeyState and receive the "recently pressed" bit instead of your application. The behavior of the least significant bit of the return value is retained strictly for compatibility with 16-bit Windows applications (which are non-preemptive) and should not be relied upon.
Source: https://msdn.microsoft.com/fr-fr/library/windows/desktop/ms646293(v=vs.85).aspx

Pour cette raison, dans ma fonction CheckMouseButton dans KGF.dll, j'utilise le bit le plus significatif de la valeur retournée par getAsyncKeystate ce qui me donne une information "statique" de l'état du bouton visé.

Je pense vraiment que les fonctions mouse_left_down et mouse_left_up de Panoramic devraient faire mla même chose.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur http://klauspanoramic.comxa.com/index.html
Contenu sponsorisé




MessageSujet: Re: Problème avec MOUSE_LEFT_DOWN(N)   

Revenir en haut Aller en bas
 
Problème avec MOUSE_LEFT_DOWN(N)
Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [/résolu] problème avec java à l'instalation :-/
» Problème avec Java
» [Résolu] problème avec avira
» Problème avec décodeur Tv
» problème avec Outlook

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Un bug dans PANORAMIC?-
Sauter vers: