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

Langage Delphi Discussion :

Connaitre l'évenement appelant


Sujet :

Langage Delphi

  1. #1
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut Connaitre l'évenement appelant
    Bonjour à tous,

    j'ai une procedure OnPaint pouvant être appelée par 2 procédures différentes (Onclick et OnmouMove).

    J'aimerais connaitre à partir du Sender de OnPaint l'évenement qui a déclenché le OnPaint.

    J'ai essayé ceci mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Sender.ClassType=TMouseMoveEvent then
    Message : '(' attendu mais THEN trouvé

    Je pourrais me débrouiller avec une variable mais je voudrais une technique un peu plus pro et propre

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    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 577
    Points : 25 225
    Points
    25 225
    Par défaut
    TMouseMoveEvent c'est un pointeur de méthode, équivalent du TMethod
    ClassType renvoie un TClass, une reférence de classe !
    Cela n'est absolument pas comparable !

    Sender en plus c'est un TObject, un TForm ou un TPaintBox par exemple !
    Ensuite OnPaint ne DOIT jamais être appelé manuellement !
    Si tu veux forcer le dessin durant le OnClick ou OnMouseMove de ton contrôle, tu dois faire un Invalidate, qui va forcer le redessinement du bouton par Paint et donc l'appel à OnPaint

  3. #3
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Si tu veux forcer le dessin durant le OnClick ou OnMouseMove de ton contrôle, tu dois faire un Invalidate, qui va forcer le redessinement du bouton par Paint et donc l'appel à OnPaint
    oui pour cela, nous sommes bien d'accord c'est ça que je voulais dire !

    N'y a t'il donc pas moyen de récupérer l'évennement qui à provoquer l'appel de onpaint (via invalidate) ?

  4. #4
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    En fait je dois savoir si c'est le onclick ou onmousemove qui fait le invalidate.

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    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 577
    Points : 25 225
    Points
    25 225
    Par défaut
    Pourquoi ne pas utiliser un objet intermédiaire !

    A la création de l'objet, tu lui passe le Control qu'il doit gérer !
    lors du click, tu appels une méthode de cet objet qui encpasule le Invalidate, qui met un flag Click
    lors du mouve, tu fais pareil, un flag mouve
    Lors du OnPaint, tu appels une 3 eme methode de l'objet qui regardes les flag, modifie le Canvas du Control géré, une fois traité sur les repasse à OFF
    il me semble que Invalidate produit un message, que le Paint n'est pas immédiat, du coup, tu pourrais avoir un Mouve et un Click très rapproché

    Evidement, tu peux juste mettre deux peuvres booléens dans la form !
    L'objet c'est juste un découpage, cela semble peut-être plus "pro"
    Un peu comme une séparation Vue-Controleur

  6. #6
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    lors du click, tu appels une méthode de cet objet qui encpasule le Invalidate, qui met un flag Click
    pour le flag, j'ai compris ...Mais pour ce qui est de l'encapsulation du invalidate

    ca donnerait un truc du genre : ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure Intermédiaire(objet);
    begin
       flag:=click;
       objet.invalidate;
    end;
    oui je sais, j'ai encore beaucoup à apprendre concernant la POO

    tu pourrais avoir un Mouve et un Click très rapproché
    exactement et cela m'ennuie beaucoup parce que un click est toujours suivi et précédé d'un mousemove !

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    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 577
    Points : 25 225
    Points
    25 225
    Par défaut
    euh presque ...
    Justement, la POO pour apprendre, il faut se lancer ! Au début, tu feras des erreurs, et petit à petit, tu ne pourras plus t'en passer
    Bon, pour la cas présent, c'est beaucoup d'effort pour pas grand chose, mais si tu as besoin d'avoir le même comportement dans plusieurs écrans ou même pour plusieurs controls au sein d'un même écran ...

    code appelant

    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FController := TController.Create(PaintBox1, PaintBox1.Canvas); // ne pas oublier le Free();
      // FController2 := TController.Create(PaintBox2, PaintBox2.Canvas); // avec le même code tu peux gérer plusieurs controls
    end;
     
    procedure TForm1.PaintBox1Click(Sender: TObject);
    begin
      FController.Click();
    end;
     
    procedure TForm1.PaintBox1MouseMove(Sender: TObject ... X, Y);
    begin
      FController.Mouse(X, Y);
    end;
     
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    begin
      FController.Paint();
    end;
    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
    constructor TController.Create(AControl: TControl; ACanvas: TCanvas);
    begin
      FControl := AControl;
      FCanvas := ACanvas;
    end;
     
    procedure TController.Click();
    begin
       FlagClick := true;
       // FlagMouve := false; // a mettre selon !
       FControl.Invalidate();
    end;
     
    procedure TController.Mouve(X, Y);
    begin
       FlagMouve := true;
       MouseInfo.X := X;
       MouseInfo.Y := Y;
       FControl.Invalidate();
    end;
     
    procedure TController.Paint();
    begin
      if FlagClick then 
      begin
        FCanvas.Draw...
        FlagClick := false;
      end;
      // else // idem si l'un exclu l'autre ...
      if FlagMouve then 
      begin
        FCanvas.Draw...
        FlagMouve := false;
      end;
    end;

  8. #8
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    c'est beaucoup d'effort pour pas grand chose
    Même pas peur !

    Ahhh...ça c'est vraiment "pro"
    Je vais mettre tout ça en place dès que je rentre.

    Merci à toi

    Juste une petite question stupide.

    Je sais comment fonctionne les constructeurs et destructeurs mais je ne suis pas certain de comprendre réellement leur utilité. Serait-ce une question d'intégrité ?

    J'ai l'habitude de créer mes objets dans le oncreate de la form

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 577
    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 577
    Points : 25 225
    Points
    25 225
    Par défaut
    OnCreate et OnDestroy de la TForm, sont des raccourcis, il se lance respectivement après le dernier constructeur (durant AfterConstruction) et avant le premier destructeur (durant BeforeDestruction)
    Cela permet de rapidement déclarer des taches à faire via l'IDE !

    Surtout que le TForm à deux constructeurs, CreateNew et Create, le premier crée l'objet, le second utilise CreateNew puis charge la DFM ... une erreur classique serait de ne surcharger que l'un et pas l'autre, du coup, un risque d'objet non initialisé ...

    Sinon, l'utilité, c'est juste que le constructeur est l'occasion pour initialiser des valeurs ou créer des objets internes, le destructeur devant se charger de nettoyer ce qui a été créés !

    Tant que OldCreateOrder est à false, OnCreate est tout à fait fiable !
    En C++Builder, on va plus facilement utilisé le constructeur car il est obligatoire et l'IDE le crée automatiquement, du coup, on ne vas pas utiliser OnCreate, cela ne change pas vraiment grand chose !
    Cela surcharge le constructeur Create, mais pas CreateNew, et on a le fameux risque d'objet non initialisé mais comme CreateNew est totalement méconnu et quasiment jamais utilisé, ce n'est pas un gros problème !

    Dans le genre CreateNew peut aussi piéger le développeur C++Builder avec des mécanismes typiquement Delphi (qui en théorie n'existe pas en C++ standard)
    [C++Builder] Méthodes Virtuelles appelés depuis un Constructeur
    [C++Builder] surcharge constructeur Form

  10. #10
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Bonjour ShaiLeTroll,

    encore une fois, je suis obligé de te remercier ... non j'déconne, c'est un plaisir

    J'ai mis en place le code que tu m'as gentillement proposé, j'ai juste eu à définir la class et hop.

    C'est vrai que c'est un peu long pour ce que je veux faire mais j'en retire surtout un apprentissage qui va me faire terriblement avancer en POO.

    Comme quoi...un simple exemple et me voila propulser dans la vrai POO.

    Encore merci.

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

Discussions similaires

  1. Connaitre l'action appellée au niveau du layout
    Par debutant_linux dans le forum Ruby on Rails
    Réponses: 2
    Dernier message: 22/10/2007, 21h00
  2. Réponses: 5
    Dernier message: 04/10/2007, 13h47
  3. Connaitre les évenements qu'effectue un utilisateur
    Par namstou3 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 03/10/2007, 11h36
  4. Connaitre l'objet appelant
    Par aurelien94 dans le forum Langage
    Réponses: 5
    Dernier message: 19/10/2006, 11h51
  5. Comment connaitre l'appelant d'une méthode
    Par Alec6 dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 12/07/2004, 14h51

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