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

Delphi Discussion :

[Composant] création d'evenement.


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut [Composant] création d'evenement.
    Bonjour,

    J'ai crée un composant qui dérive de TShape.
    J'aimerais que celui-ci puisse réagir en fonction de certains evenements: OnClick, OnKeyUp, OnKeyDown, OnKeyPress, OnMouseEnter et OnMouseLeave;
    J'aimerais savoir si quelqu'un pourrait me dire comment crée ces evenements afin de pouvoir leur ajouté un traitement, comme par exemple:
    Changer la couleur du TShape si la souris est au dessus de mon composant et que je j'appuie sur une touche du clavier.

    Je vous remercie d'avance,
    Nicolas.

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    Tu as deux façons de faire:

    1) si un des descendant de TShape a les méthodes MouseDown, MouseUp, Click, MouseOver etc. alors tu les surcharges...

    2) Sinon, il fgaut que tu les interceptes avec les messages de Win... WM_MOUSEUP, WM_MOUSEDOWN (à vérifier)...

    Bonne chance

  3. #3
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Le soucis est que Tshape et ses desendant n'ont pas ces évenements, ou du moins j'en ai pas encore trouvé qui en avait. Donc il faut que je crée ces évenements pour mon composants. Donc du peux que j'ai trouvé, je dois créer une property, genre: property OnMouseEnter.
    Aprés ca, je ne sais pas du tout ce que je dois faire pour crée cette proprièté afin que lorsque mon pointeur de souris entre sur mon composant il puisse executer le code que je souhaite.

    Pour ta deuxieme solution, elle est logique mais compliqué a réaliser je pense. Il doit exister sous Delphi un moyen de faire ce que je souhaite sans en passer par la. Surtout que j'ai lu qu'il etait possible de faire ce que je souhaite mais je n'ai pas trouvé d'explication qui m'aiderait suffisament pour le réaliser

    Merci.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    Tu disposes du code source de delphi ?

  5. #5
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 434
    Points : 5 846
    Points
    5 846
    Par défaut
    salut

    le mieux serait que tu regarde le tcontrol dans la vcl
    celui ci te fournit les evenement a utilisé ainsi que le message

    la property seras de ce type la
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
       FOnClick: TNotifyEvent
       ...
        procedure Click; dynamic;
        procedure WMLButtonUp(var Message: TWMLButtonUp); message WM_LBUTTONUP;
       ...
        property OnClick: TNotifyEvent read FOnClick write FOnClick ;
    ensuite il te faut redefinir

    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
     
    procedure TMyShape.Click;
    begin
      if Assigned(FOnClick) then
        FOnClick(Self);
    end;
     
    procedure TMyShape.WndProc(var Message: TMessage);
    var
       KeyState: TKeyboardState;  
    begin
     if (Message.Msg >= WM_MOUSEFIRST) and (Message.Msg <= WM_MOUSELAST) then
      begin
        if not (csDoubleClicks in ControlStyle) then
          case Message.Msg of
            WM_LBUTTONDBLCLK, 
            WM_RBUTTONDBLCLK, 
            WM_MBUTTONDBLCLK:
              Dec(Message.Msg, WM_LBUTTONDBLCLK - WM_LBUTTONDOWN);
          end;
        case Message.Msg of
          WM_MOUSEMOVE: Application.HintMouseMessage(Self, Message);
          WM_LBUTTONDOWN, WM_LBUTTONDBLCLK:
            begin
              if FDragMode = dmAutomatic then
              begin
                BeginAutoDrag;
                Exit;
              end;
              Include(FControlState, csLButtonDown);
            end;
          WM_LBUTTONUP: Exclude(FControlState, csLButtonDown);
            end;
        end;
      end;
      Dispatch(Message);
    end;
     
    procedure TMyShape.WMLButtonUp(var Message: TWMLButtonUp);
    begin
      inherited;
       if csClicked in ControlState then
      begin
        Exclude(FControlState, csClicked);
        if PtInRect(ClientRect, SmallPointToPoint(Message.Pos)) then Click;
      end;
      DoMouseUp(Message, mbLeft);
    end;

    voila grosso modo les element minimun a redefinir

    @+ Phil

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour

    TShape est dérivé depuis TGraphicControl. Les évenement des clavier ne sont pas implémenter depuis les TGraphicControl mais depuis les TWinControl. En fair l'implémentation revient à reécrire une bonne partie de delphi (pour la reconduction des messages des clavier ou des focus, des routines de delphi teste si l'objet est un twinControl et saute la reconduction dans les autres cas).
    A mon avis, il vaudrait mieux soit abandoner l'idée d'utiliser le clavier, soit reprendre votre composant e t le dérivé de TCustomControl. TCustomCOntrol contient les propriété de TGRaphicControl plus les possibilité des TWinControl.

    Extrait de l'aide de delphi ( les caractères gras sont un ajout personel):

    Pour TGRaphicControl:

    TGraphicControl prend en charge les contrôles légers simples qui n'ont pas besoin de la capacitéd'accepter une entrée clavier ou de contenir d'autres contrôles.Etant donnéque les contrôles légers n'englobent pas d'objets écran Windows,ils sont plus rapides et utilisent moins de ressources que les contrôles basés sur TWinControl.

    TGraphicControl fournit une propriétéCanvas pour accéder àla surface de dessin du contrôle et une méthode Paint virtuelle appelée en réponse àdes requêtes de dessin reçues par le contrôle parent.

    Pour TCustom control :
    Dans la plupart des descendants de TWinControl,la tâche de dessin de la surface du contrôle relève de l'objet écran Windows sous-jacent.Si un contrôle présente des caractéristiques qui ne peuvent pas être restituées par un objet écran Windows,il requiert un accès àun objet canevas pour effectuer son propre dessin.

    TCustomControl est l'une des deux classes de base pour les contrôles qui dessinent leurs propres surfaces.Etant donnéque TCustomControl est dérivée de TWinControl,les instances de ses descendants peuvent recevoir la focalisation et servir de conteneurs.

    Les classes de contrôle qui effectuent leur propre restitution d'écran et n'ont pas besoin des fonctions de TWinControl doivent être des descendants de TGraphicControlau lieu de TCustomControl.Les objets TGraphicControl peuvent se restituer eux-mêmes avec moins de charge,étant donnéqu'ils ne comportent aucun objet écran Windows sous-jacent.

    Les objets TCustomControl ont une méthode Paint,qui est appelée lorsque le contrôle doit restituer son image.Les contrôles personnalisés se dessinent eux-mêmes en utilisant la propriétéCanvas.

  7. #7
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup je pense et espere qu'avec tout ca je vais arriver a m'en sortir
    Juste pour information, j'utilise Delphi 7 entreprise mais je n'ai pas trouvé le source. Pourriez-vous m'indiquez ou le trouver ?
    Merci beaucoup.

    Nico

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    292
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 292
    Points : 222
    Points
    222
    Par défaut
    pour un tshape tu va trouver dans ta clause uses
    Tu fais un ctrl click sur ExtCtrls, il va t'amener dans l'unité.

    Tu peux aussi faire un ctrl click sur le type TShape.

  9. #9
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 70
    Points : 49
    Points
    49
    Par défaut
    J'ai exactement le même souci actuellement. J'utilise un Tshape et je voudrais de me servir d'une procédure du style onmouseleave (inverse de on mousemove) mais tout ce qui est dit ci dessus ne me semble pas très clair. Comment intercepter un message ? Ma question est surtout comment implémenter onmouseleave pour mon TShape ???

  10. #10
    Rédacteur
    Avatar de evarisnea
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2005
    Messages
    1 957
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 957
    Points : 4 384
    Points
    4 384
    Par défaut

    Citation Envoyé par Nicolos_A
    Merci beaucoup je pense et espere qu'avec tout ca je vais arriver a m'en sortir
    Juste pour information, j'utilise Delphi 7 entreprise mais je n'ai pas trouvé le source. Pourriez-vous m'indiquez ou le trouver ?
    Merci beaucoup.

    Nico
    tu parles des sources du compilo ou de la VCL ? parce que les sources du compilo ne sont pas disponibles. en revanche, les sources de la VCL sont disponibles dans le sous répertoire source du répertoire d'installation de delphi. ou pour faire court, tu cliques sur un symbole appartenant à une unité en maintenant la touche controle pour ouvrir l'unité dans laquelle est déclarée le symbole. ou encore tu fais un menu contextuel sur le nom d'une unité (dans la partie uses) et tu choisis l'option ouvrir le fichier source (si ma mémoire est bonne)

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

Discussions similaires

  1. création d'evenements personnalisés
    Par chicore dans le forum Langage
    Réponses: 1
    Dernier message: 02/06/2006, 21h22
  2. Réponses: 5
    Dernier message: 16/02/2006, 16h27
  3. [Composant] Création de catégorie de propriété
    Par Andry dans le forum Composants VCL
    Réponses: 6
    Dernier message: 31/08/2005, 14h39
  4. [Composant] Création d'un JComponent
    Par Kuroro dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 11/05/2005, 10h56

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