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

Composants VCL Delphi Discussion :

Exception avec OnMouseLeave


Sujet :

Composants VCL Delphi

  1. #1
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut Exception avec OnMouseLeave
    Bonjour
    J'utilise Delphi 2005 Perso.

    Je suis en train de me faire un petit composant dérivé d'un Timage.
    Je lui ai implementé:

    1. une collection (des pictogramme ameliorés)
    2. la procedure OnMouseLeave/Enter par interception de Cm_MouseLeave/Enter
    3. OnMouseLeave/Enter au niveau des Item de ma collection


    Dans la version surchargé de Mon MouseMove je gere le OnMouseEnter/Leave de mon item comme ceci

    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
    procedure TimageEtape.MouseMove(Shift: TShiftState; X, Y: Integer);
    Var
       RectCercle : TRect;
       ZoneMove : TZoneIndex;
       Dx, Dy : Integer;
       RegionLibre : HRGN;
    begin
         //detection Move on Etape
         ZoneMove := PointToEtapeIndex(Point(X,Y));
         If ZoneMove.Index <> -1  Then
         Begin
              If FItemEnter.Index = -1 Then
              begin
                   FItemEnter := ZoneMove;
                   Etapes[ZoneMove.Index].MouseEnter(Self, Shift, X, Y, ZoneMove);
              end;
              Etapes[ZoneMove.Index].MouseMove(Self, Shift, X, Y, ZoneMove);
              If FMode <> M_Modify Then Exit;//On est dans un EtapeItem l'evenement sera gerer par MouseDownItem
         end
         else
         begin
              If FItemEnter.Index <> -1 Then
              begin
                   Etapes[FItemEnter.Index].MouseLeave(Self, Shift, X, Y, ZoneMove);
                   FItemEnter.Index := -1;
              end;
         end;
    [...]
    Tout ceci marche bien a condition qu'a la sortie de mon item ma souris retourne sur la surface de mon composant, sinon je n'est pas le OnMouseLeave (de mon item) tant que la souris ne revient pas en contact avec mon composant. Ce qui est logic.

    Pour regler le probleme ... du moins je le croyais, j'ai decidé d'utiliser le OnMouseLeave de mon composant et de declencher le onMouseLeave de mon item avec, la souris n'etant plus sur mon composant, elle n'est plus sur l'item non plus de ce faite!

    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
    procedure TImageEtape.MouseLeave(var Msg: TMessage);
    var
       Curs : TMouse;
       CursInCtrl : TPoint;
       Shift : TShiftState;
    begin
         If FItemEnter.Index <> -1 then
         begin
              Curs := TMouse.Create;
              CursInCtrl := ScreenToClient(Curs.CursorPos);
              //On omet ici dans la declaration de Shift la position des boutons souris
              Shift := ShiftState;
              Etapes[FItemEnter.Index].OnMouseLeave(Self,Shift,CursInCtrl.X, CursInCtrl.Y,FItemEnter);
              FItemEnter.Index := -1;
         end;
         If Assigned(FOnMouseLeave) Then FOnMouseLeave(Self);
    end;
    Mais ca ne fonctionne pas
    Lorsque je quite la fenetre sans passer par la surface de mon composant, en posant par exemple un Boutton sur le quel je vais avec ma souris, j'ai une erreur EaccessViolation à l'adresse 00000000000. Lecture de L'adresse 000000000 (j'ai pas exactement compté les zeros mais en tout cas y'a pas de chiffre autre)

    Voila la declaration de mes variables au niveau de mes Item

    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
     TEtape = Class(TCollectionItem)
      private
        FImageEtape : TImageEtape;
    [...]
     
        FOnClick : TNotifyEvent;
        FonMouseDown : TMouseButExEvent;
        FonMouseUp : TMouseButExEvent;
        FOnMouseMove : TMouseMoveExEvent;
        FOnMouseLeave : TMouseMoveExEvent;
        FOnMouseEnter : TMouseMoveExEvent;
    [...]
     
      protected
        function GetDisplayName : string; override;
     
      public
        constructor Create(Collection : TCollection); override;
        destructor Destroy; override;
     
        procedure Assign(Source : TPersistent); override;
        procedure AssignGroupe(New : TGroupe);
     
        procedure Click;
        procedure MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer; Zone : TZoneIndex);
        procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer; Zone : TZoneIndex);
        procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer; Zone : TZoneIndex);
        procedure MouseEnter(Sender: TObject; Shift: TShiftState; X, Y: Integer; Zone : TZoneIndex);
        procedure MouseLeave(Sender: TObject; Shift: TShiftState; X, Y: Integer; Zone : TZoneIndex);
     
      published
    [...]
        property OnClick : TNotifyEvent read FOnClick write FOnClick;
        property OnMouseUp : TMouseButExEvent read  FonMouseUp write FonMouseUp;
        property OnMouseDown : TMouseButExEvent read  FonMouseDown write FonMouseDown;
        property OnMouseMove : TMouseMoveExEvent read  FonMouseMove write FonMouseMove;
        Property OnMouseEnter: TMouseMoveExEvent read FOnMouseEnter write FOnMouseEnter;
        Property OnMouseLeave: TMouseMoveExEvent read FOnMouseLeave write FOnMouseLeave;
     
      end;
    Et la au niveau de mon composant

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
      TImageEtape = class(TPaintBox)//(TImage)    ImgCercle.Picture.Graphic
      public
    [...]
     
      private
        FEtapes : TEtapes;
    [...]
        FOnClickEtape : TEtapeClickEvent;
        FPicture : TPicture;
     
        FMoveEnCours : TZoneIndex;
        FOldMousePos : TPoint;
        FItemEnter : TZoneIndex;
     
        FOnMouseDownItem : TMouseButExEvent;
        FOnMouseUpItem : TMouseButExEvent;
        FOnMouseMoveItem : TMouseMoveExEvent;
        FOnMouseEnterItem : TMouseMoveExEvent;
        FOnMouseLeaveItem : TMouseMoveExEvent;
        FOnMouseEnter : TNotifyEvent;
        FOnMouseLeave : TNotifyEvent;
     
    [...]
        function ShiftState: TShiftState;
    [...]
      protected
        procedure MouseDown(Button : TMouseButton; Shift : TShiftState; X, Y : integer); override;
        procedure MouseUp(Button : TMouseButton; Shift : TShiftState; X, Y : integer); override;
        procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
     
        procedure MouseDownItem(Sender : TObject; Button : TMouseButton; Shift : TShiftState; X, Y : integer; Zone : TZoneIndex); Virtual;
        procedure MouseUpItem(Sender : TObject; Button : TMouseButton; Shift : TShiftState; X, Y : integer; Zone : TZoneIndex); Virtual;
        procedure MouseMoveItem(Sender : TObject; Shift: TShiftState; X, Y: Integer; Zone : TZoneIndex);Virtual;
     
        procedure DoMouseDownItem(Sender : TObject; Button : TMouseButton; Shift : TShiftState; X, Y : integer; Zone : TZoneIndex);virtual;
        procedure DoMouseUpItem(Sender : TObject; Button : TMouseButton; Shift : TShiftState; X, Y : integer; Zone : TZoneIndex);virtual;
        procedure DoMouseMoveItem(Sender : TObject; Shift: TShiftState; X, Y: Integer; Zone : TZoneIndex);Virtual;
     
        procedure MouseEnterItem(Sender: TObject; Shift: TShiftState; X, Y: Integer; Zone : TZoneIndex);
        procedure MouseLeaveItem(Sender: TObject; Shift: TShiftState; X, Y: Integer; Zone : TZoneIndex);
     
        procedure DoMouseEnterItem(Sender: TObject; Shift: TShiftState; X, Y: Integer; Zone : TZoneIndex);
        procedure DoMouseLeaveItem(Sender: TObject; Shift: TShiftState; X, Y: Integer; Zone : TZoneIndex);
     
        procedure MouseEnter(var Msg: TMessage); message CM_MouseEnter;
        procedure MouseLeave(var Msg: TMessage); message CM_MouseLeave;
     
     [...]
     
        procedure ClickEtape(Index : integer);
        procedure DoClickEtape(Index : integer; Zone : TZoneEtape); virtual;
     
      published
    [...]
        property OnClickEtape : TEtapeClickEvent read FOnClickEtape write FOnClickEtape;
        property OnMouseDownItem : TMouseButExEvent read FOnMouseDownItem write FOnMouseDownItem;
        property OnMouseUpItem : TMouseButExEvent read FOnMouseUpItem write FOnMouseUpItem;
        property OnMouseMoveItem : TMouseMoveExEvent read FOnMouseMoveItem write FOnMouseMoveItem;
        property OnMouseEnterItem : TMouseMoveExEvent read FOnMouseEnterItem write FOnMouseEnterItem;
        property OnMouseLeaveItem : TMouseMoveExEvent read FOnMouseLeaveItem write FOnMouseLeaveItem;
        property OnMouseEnter : TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
        property OnMouseLeave : TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
     
        property OnNewItem : TNewItemEvent read FOnNewItem write FOnNewItem;
      end;
    Et enfin les Type que j'utilise

    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
     
    Type
        TImageEtape = Class;
     
     
        TZoneEtape = (Ze_Fleche, Ze_FlecheExt, Ze_FlecheOri, Ze_Cercle, Ze_Cadenas, Ze_BtnDel, Ze_BtnHidePicto, Ze_BtnEnEtape, Ze_Out);
        TZoneIndex = Record
             Zone : TZoneEtape;
             Index : Integer;
        End;
     
        TTypePicto = (tp_CercleEtape = 1,tp_CercleVide,tp_CercleCad = 10, tp_CadRedF = 4, tp_CadenasRedO = 5, tp_CadBlackF = 6, tp_CadBlackO = 7);
        TEtatEtape = (Et_Libre  = 10, Et_LibreC = 12, Et_Fleche = 1, Et_Cercle = 2, Et_Cadenas = 3, Et_Complet = 99);
     
        TMode = (M_Actif, M_Free, M_Modify);

    Si quelqu'un a une idée ou une piste merci d'avance
    A++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Les Zéros il y a 8 c'est une adresse en hexadecimal ... c'est un peu la base pour une architecture 32bits

    Etapes[ZoneMove.Index] ne serait pas à nil ?
    En tout cas, une erreur en 00... c'est un pointer à nil ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Assigned(Etapes[ZoneMove.Index]) then
    Essaye un truc, dans les options de debugger, cherche "Arrêter sur Exception Delphi" ça devrait aider ton dev ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Re
    Pardon je n'avais pas mis la ligne qui cré l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Etapes[FItemEnter.Index].OnMouseLeave(Self,Shift,CursInCtrl.X,CursInCtrl.Y,FItemEnter);

    ++

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par ShaiLeTroll
    En tout cas, une erreur en 00... c'est un pointer à nil ...
    Je dirais même plus : une erreur à l'adresse 0, c'est un pointeur procédure à nil
    Donc moi je pencherais plutôt pour... L'événement qui est à nil :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if Assigned(Etapes[FItemEnter.Index].OnMouseLeave) then
      Etapes[FItemEnter.Index].OnMouseLeave(Self,Shift,CursInCtrl.X, CursInCtrl.Y,FItemEnter);
    Au passage, tu es sûr du Self ? Ca serait pas plutôt l'étape en question.

    Ou alors en fait tu voulais appeler MouseLeave, et pas OnMouseLeave
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Expert éminent
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    3 898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 898
    Points : 8 529
    Points
    8 529
    Par défaut
    Citation Envoyé par sjrd
    Ou alors en fait tu voulais appeler MouseLeave, et pas OnMouseLeave


    Ben je crois que je suis bon pour l'appero

    Faut surtout que je fasse une pause, j'ai plus les yeux en fasse des troups!

    Ca marche bien mieux avec MouseLeave MERCI bien!

    Bonne soirée
    ++
    qwaz

    Edit: Au passage, merci a toi pour tes Tutos sur la création de composants! ca m'a ete tres utile, bonne continuation pour les autres volets!! /edit

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/01/2006, 10h43
  2. [vb.net]Gestion des exceptions avec les web services
    Par mvr dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/12/2005, 22h41
  3. Réponses: 2
    Dernier message: 14/02/2005, 14h26
  4. Réponses: 3
    Dernier message: 09/11/2004, 14h43
  5. INSO Filter : "USER-defined exception" avec ctx_do
    Par Wiztiti dans le forum Oracle
    Réponses: 2
    Dernier message: 01/06/2004, 16h14

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