IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Lazarus Pascal Discussion :

Comportement de la souris différent sous Windows et sous Linux


Sujet :

Lazarus Pascal

  1. #1
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut Comportement de la souris différent sous Windows et sous Linux
    Bonjour à toutes et à tous,

    Je souhaite recoder sous Lazarus une application que j'avais développée avec Delphi afin qu'elle puisse fonctionner aussi sous Linux. Mais je tombe sur un gros nosnos.

    Le comportement de la souris sur le onMouseUp est différent sous Windows et sous Linux (je l'ignore sous MacOS). Je m'explique, testez le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    unit TestUp;
     
    {$mode objfpc}{$H+}
     
    interface
     
    uses
      Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Buttons;
     
    type
     
      { TForm1 }
     
      TForm1 = class(TForm)
        SpeedButton1: TSpeedButton;
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { private declarations }
      public
        { public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.lfm}
     
    { TForm1 }
     
    procedure TForm1.SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      ShowMessage('Bouton Up');
    end;
     
    procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      ShowMessage('Fond Up');
    end;
     
    end.
    Placez un SpeedButton sur une Form et attachez aux évènements onMouseUp de la Form et du SpeedButton les méthodes ci-dessus. Exécutez sous Windows et sous Linux.

    Constat :

    Sous Windows : si je clique sur le bouton, que je reste appuyé sur la souris et que je me déplace hors du bouton, lorsque je relâche la souris, c'est l'évènement appartenant à la souris qui est déclenché,

    Même manip sous Linux : au relâché de la souris, c'est l'évènement appartenant à la Form qui est déclenché.

    Je ne cherche pas à savoir qui a raison ou tort, mais dans de telles conditions, comment assurer la portabilité entre les deux environnements ?
    Y a-t-il un moyen d'harmoniser ces comportements ?

    Merci de votre aide.

    Pierre

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Stocker l'objet pointé au MouseDown et comparer au MouseUp ?
    NB: en s'assurant qu'on n'est pas dans un Drag&Drop...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Octobre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 21
    Points : 30
    Points
    30
    Par défaut
    Dans l'algorithmique serait-il gênant que le mouseUp de la forme appel le mouseUp du bouton ?

    J'imagine qu'il doit y avoir plusieurs boutons ?
    Si c'est le cas, le mouseDown sur un bouton indique sur quel bouton l'évènement a eut lieu et le mouseUp du bouton remet à zéro cette indication et le mouseUp de la forme appelle le mouseUp du bouton qui va bien en se basant sur la donnée intialisée par le mouseDown !

    Heu ai-je été clair ?

    Moi aussi je me bat avec la gestion des évènements sous Lazarus. Ceci dit, je ne suis pas persuadé qu'il serait différemment avec un autre IDE.

  4. #4
    Membre éprouvé
    Avatar de ChPr
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Val d'Oise (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 2 022
    Points : 1 049
    Points
    1 049
    Par défaut
    Bon, pour pallier la différence de comportement de la souris entre les deux environnements, j'ai été amené à faire des horreurs !

    En fait, mon, plutôt mes TSpeedButton comme le suppose à juste titre "leneant", se trouvent sur un TPanel, et l'endroit où je veux amener le déplacement se trouve sur un TImage qui est dans un TScrollBox qui est sur la Form de base.

    Sous Windows, suite à un MouseDown sur un SpeedButton et un déplacement hors du Speedbutton, les évènements OnMouseMove et onMouseUp du SpeedButton répondent --> super .

    Sous Linux donc, le OnMouseUp du SpeedButton ne répond pas, pas plus que ceux de la Form, du ScrollBox et de l'Image et ... miracle, le onMouseUp du TPanel où se trouvent mes SpeedButton répond.

    Donc, sous Linux, je prends en compte le onMouseUp du TPanel (heureusement, il ne me servait à rien par ailleurs) au travers duquel j'appelle le onMouseUp de mes SpeedButton en ayant, comme le dit "tourlourou", au préalable mémorisé dans le onMouseDown des SpeedButton lequel avait été cliqué. Ça donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    procedure TBase.BtnMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    {Sélectionne un opérateur par son logo dans la bibliothèque d'opérateurs}
    begin
    {$IFDEF UNIX}
      FctSymb:= Sender; {Mémorisation du SpeedButton appuyé}
      BtnSymb:= True;
      xSymb:= X;
      ySymb:= Y;
    {$ENDIF}
      if TSpeedButton(Sender).Visible and (Button = mbLeft) then
      begin
    ... {Ce qui doit être fait}
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TBase.BtnMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    {Permet le déplacement du logo du nouvel opérateur sur le "planSchema"}
    begin
      if Shift = [ssLeft] then
      begin
    {$IFDEF UNIX}
        xSymb:= X;
        ySymb:= Y;
    {$ENDIF}
     ... {Ce qui doit être fait}
      end;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TBase.PlanLogosMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      {$IFDEF UNIX}
        if BtnSymb then
          BtnMouseUp(FctSymb, Button, Shift, xSymb, ySymb); {Appel du OnMouseUp du SpeedButton mémorisé}
      {$ENDIF}
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TBase.BtnMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    {Dépose le nouvel opérateur sur le "PlanSchema" à l'endroit où est relâchée la souris}
    begin
     ... {Ce qui doit être fait}
    end;
    M'enfin (comme dirait Gaston), au-delà de cette magouille abominable qui heureusement fonctionne, ce problème de comportement différent d'un OS à l'autre relève du bug. Je ne me souviens plus comment on fait pour les déclarer.

    Cordialement.

    Pierre

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Urbaniste
    Inscrit en
    Octobre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 21
    Points : 30
    Points
    30
    Par défaut
    Je ne suis pas sûr que ce soit un bug, mais plutôt une gestion différente des évènements entre Windows et Linux. Question : qu'en est-il sous mac ?

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/05/2013, 09h46
  2. souris + clavier ne marche pas sous windows xp
    Par guitou_429 dans le forum Windows XP
    Réponses: 23
    Dernier message: 02/12/2010, 12h06
  3. [PostgreSQL] clients sous windows - base sous Linux
    Par Gandalf dans le forum Installation
    Réponses: 6
    Dernier message: 10/04/2003, 14h13
  4. Assembleur sous Windows et sous Linux
    Par Bibouda dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 28/10/2002, 07h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo