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 :

[Création de compo]Surcharger un événement mais permettre de l'utiliser à l'extérieur


Sujet :

Composants VCL Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 27
    Points : 23
    Points
    23
    Par défaut [Création de compo]Surcharger un événement mais permettre de l'utiliser à l'extérieur
    voila

    dans mon composant j'ai besoin de faire un truc sur un evenement
    mais cette evenement doit etre accesible de l'exterieur mais doit tjs faire mon truc...
    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
    unit CustomCRILStringGrid2;
    ...
     
      TCustomStringGrid2 = class(TStringGrid)
      private
        { Déclarations privées }
        FDblClick: Boolean;                 //
    ...
     
      public
        { Déclarations publiques }
        procedure GridMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer); virtual;
        Constructor Create(AOwner: TComponent); override;
    ...
     
     
    Constructor TCustomStringGrid2.Create(AOwner: TComponent);
    begin
            inherited Create(AOwner);
            OnMouseMove :=  GridMouseMove;
    end;
     
    procedure TCustomStringGrid2.GridMouseMove(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    begin
       MouseToCell(X, Y, mCol, mRow);
    end;
    et j'aimerais pouvoir faire :
    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
     
       ObjetGrid := TCustomCRILStringGrid2.Create(Self);
       ObjetGrid.Parent := Self;
       with ObjetGrid do
       begin
         Left := 8;
         Top := 205;
         Width := 530;
         Height := 185;
         DrawArrow := True;
         FixedRows := 1;
         DefaultDrawing := False;
        OnMouseMove := GridMouseMove2;
    ...
     
    procedure TForm1.GridMouseMove2(Sender: TObject; Shift: TShiftState;
      X, Y: Integer);
    var
       ACol,ARow:integer;
    begin
       ObjetGrid.MouseToCell(X,Y,ACol,ARow);
       Label1.Caption := 'Option : ' + IntToStr(ACol) + ' ' + IntToStr(ARow);
    end;
    et que les deux fonction soit lancer sur l'evenement

  2. #2
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    en fait si je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjetGrid.GridMouseMove(Sender,Shift,X, Y);
    dans la fonction GridMouseMove2 j'optient l'execution que je veux

    mais c pas possible de faire ca ...

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 207
    Points : 188
    Points
    188
    Par défaut
    Avec un thread ??? (sans aucune conviction )

  4. #4
    Membre à l'essai
    Inscrit en
    Avril 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    Donc pour résumer, tu veux faire 2 choses quand l'utilisateur bouge la souris:
    - Faire le MouseToCell dans le composant
    - Faire autre chose dans ta form

    La solution la plus simple serait de déclarer un évènement supplémentaire dans ta grille, et forcer l'utilisateur à se lier à cet évènement.

    C'est difficile de trouver une solution propre, à cause de:
    - Dans la VCL, la plupart des propriétés sont écrites directement, sans passer par une méthode SetXXX qu'on pourrait surcharger
    - Les propriétés sont liées de manière statique. Donc ca ne sert pas à grand chose de surcharger la propriété OnMouseMove, car c'est toujours la définition initiale qui vaut dans la plupart des cas.

  5. #5
    Membre chevronné
    Avatar de Pierre Castelain
    Inscrit en
    Avril 2002
    Messages
    523
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 523
    Points : 1 943
    Points
    1 943
    Par défaut
    Je n'ai pas bien compris ce que tu cherche à faire mais il existe à priori au moins deux solutions à ton problème.
    Les deux solutions utilisent la redéfinition (override) de la méthode MouseMove. Dans le premier cas, on ajoute directement le code à exécuter dans la méthode. Dans le second cas, on ajoute un événement au composant. Cet événement sera appelé par la méthode MouseMove. Cela nous fait donc 2 événement identiques. Je ne suis pas sûr que cela ait un quelconque intérêt, mais bon...
    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
     
    interface
     
      TStringGrid2 = class(TStringGrid)
      private
        { Private declarations }
        FMouseCol: Integer;
        FMouseRow: Integer;
      protected
        procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
      public
        { Public declarations }
        constructor Create(AOwner: TComponent); override;
     
        property MouseCol: Integer read FMouseCol;
        property MouseRow: Integer read FMouseRow;
      end;
     
      TStringGrid3 = class(TStringGrid)
      private
        FOnMouseMoveBis: TMouseMoveEvent;
      protected
        procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
      public
        property OnMouseMoveBis: TMouseMoveEvent read FOnMouseMoveBis
          write FOnMouseMoveBis;
      end;
     
    implementation
     
    { TStringGrid2 }
     
    constructor TStringGrid2.Create(AOwner: TComponent);
    begin
      inherited;
      FMouseCol:= -1;
      FMouseRow:= -1;
    end;
     
    procedure TStringGrid2.MouseMove(Shift: TShiftState; X, Y: Integer);
    begin
      inherited;
      MouseToCell(X, Y, FMouseCol, FMouseRow);
    end;
     
    { TStringGrid3 }
     
    procedure TStringGrid3.MouseMove(Shift: TShiftState; X, Y: Integer);
    begin
      inherited;
      if Assigned(FOnMouseMoveBis) then
        FOnMouseMoveBis(self, Shift, X, Y);
    end;
    Il existe également une autre solution consistant à récupérer le message WM_MOUSEMOVE mais la technique précédente est un peu plus générale et certaienemtn plus POO.

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par Pierre Castelain
    Les deux solutions utilisent la redéfinition (override) de la méthode MouseMove.
    Justement je veux pas redéfinire... je veux ajouter du code...

    Pour resumé ce que je veux faire :
    je veux faire (dans tout les cas) un
    MouseToCell(X, Y, mCol, mRow);
    pour avoir mCol, mRow en permanance (d'ou OnMouseMove)
    mais que ce soit totalement transparent pour l'utilisateur de mon objet.
    cad qu'il puisse metre ou non une evenement OnMouseMove

    Citation Envoyé par _gtm_
    La solution la plus simple serait de déclarer un évènement supplémentaire dans ta grille, et forcer l'utilisateur à se lier à cet évènement.
    aurais tu un exemple ?

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2002
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 20
    Points : 20
    Points
    20
    Par défaut
    Ma solution est mauvaise, pars plutot sur l'idée de Pierre. Ca marche, et je n'y avais pas pensé car je croyais que MouseMove était privée et que donc on ne pouvait pas la surcharger.

    En simplifiant un peu:

    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
     
     TStringGrid2 = class(TStringGrid) 
      private 
        { Private declarations } 
        FMouseCol: Integer; 
        FMouseRow: Integer; 
      protected 
        procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; 
      public 
        { Public declarations } 
        constructor Create(AOwner: TComponent); override; 
     
        property MouseCol: Integer read FMouseCol; 
        property MouseRow: Integer read FMouseRow; 
      end;
     
    procedure TStringGrid2.MouseMove(Shift: TShiftState; X, Y: Integer); 
    begin 
      MouseToCell(X, Y, FMouseCol, FMouseRow); 
      inherited; 
    end;
    Edit: tu n'as besoin que d'un évènement en fait, car le MouseToCell n'a pas besoin d'être dans un évènement.

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2002
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 27
    Points : 23
    Points
    23
    Par défaut
    oui c ca, je vient just de le faire marcher ...

    merci beaucoup les ga !!!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 24/09/2006, 08h13
  2. [Création de compo] Stocker une TList de records dans un dfm
    Par Benjamin GAGNEUX dans le forum Composants VCL
    Réponses: 6
    Dernier message: 29/10/2004, 11h01
  3. [C#] [WinForms] Surcharge d'évènement
    Par stailer dans le forum Windows Forms
    Réponses: 4
    Dernier message: 07/10/2004, 19h55
  4. [Création de composant] Surcharge de OnMouseMove
    Par yoghisan dans le forum Composants VCL
    Réponses: 2
    Dernier message: 18/02/2004, 22h34
  5. Réponses: 2
    Dernier message: 29/10/2003, 23h47

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