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 :

Intercepter un Message Windows ? Créer un Composant Grille !


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut Intercepter un Message Windows ? Créer un Composant Grille !
    Voila j'ai un gros probléme, et même l'aide de Delphi ne m'a pas donnée la réponse, enfin si, mais ça marche pas ! Alors s'il vous plait Aidez-Moi.

    Un petit résumé de ce que je voudrais faire :
    En faite je suis débutant sur Delphi depuis 1 mois a peu prés, et je suis aussi débutant sur ce forum, enfin le probléme n'est pas là. Mon probléme est que je suis en train d'éssayer de créer mon premier composant, et j'y arrive, mais c'est laborieux.

    Le gros probléme est que j'ai besoin d'éxécuter un redimensionnement de mon composant, et pour cela je voulais intercepter un message Windows nommé WM_Size, pour savoir quand est-ce que peut redimensionner mon composant. Cela m'a été conseiller de la par de l'aide de Delphi 7, mais malheureusement ceci ne fonctionne pas.
    Je dérive du composant TImage, et quand je redimenssionne mon composant sur une TForm celui-ci ce redimensionne mais pas le Canvas et cela est trés gênant, bien entendus le redimensionnement se fait a la conception, et non a l'éxécution.

    Alors pour vous éclairer je vous laisse tout le code source, qui je doit dire n'est pas énorme.

    Donc pour commencer voici les unités que j'utilise, Etant donnée qu'il ne les mets pas automatiquement, je les rajoute moi-même, alors j'espére que j'en est pas oublié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    uses
      SysUtils, Classes, Controls, ExtCtrls, Windows, Messages, Forms, Graphics;
    Ensuite vient mes déclaration de Type :
    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
    type
      TGrid = class(TImage)
      private
        FFactor:Integer;
        FShowGrid:Boolean;
      protected
        procedure WMSize(var Message:TWMSize); message WM_Size;
      public
        constructor Create(AOwner:TComponent);override;
        procedure TraceGrid;
      published
        property Factor:Integer read FFactor write FFactor;
        property ShowGrid:Boolean read FShowGrid write FShowGrid;
        property Width default 350;
        property Height default 200;
      end;
    Ici je vous passe les détailles de la procédure Register, pour vous montrer la redéfinition du Constructeur Hérité, avec un appel a la procédure TraceGrid :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    constructor TGrid.Create(AOwner:TComponent);
    begin
    inherited Create(AOwner);
    Factor:=10;
    Width:=350;
    Height:=200;
    TraceGrid;
    end;
    Ici je m'était dit que ce n'était pas nécéssaire de vous montrer la façon dont je trace la grille, et puis finalement vaut mieux avoir toutes les clé en main, Non ! Alors voici la procédure TraceGrid, et si il y a plus simple dit le moi ! :
    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
    procedure TGrid.TraceGrid;//Traçage de la grille
    var
        DX, AX, DY, AY, i, j, L, H:Integer;
    begin
    L:=Width; H:=Height;
    L:=Round(L/10); H:=Round(H/10); //la hauteur et largeur est divisé par le pas de la grille
    DX:=0; DY:=0; AX:=1; AY:=1;
    for j:=0 to H do        //Boucle de pointillement sur la hauteur
    begin
        DX:=0; AX:=1;       //Réinitialisation des valeurs au début de la largeur
        for i:=0 to L do            //Boucle de pointillement sur la largeur
        begin
            Canvas.MoveTo(DX,DY);
            Canvas.LineTo(AX,AY);
            if DX<9 then
            begin
                DX&#58;=9;
                AX&#58;=10;
            end
            else
            begin
                inc&#40;DX,10&#41;;
                inc&#40;AX,10&#41;;
            end;
        end;                        //Fin de Boucle de pointillement sur la largeur
        if DY<9 then
        begin
            DY&#58;=9;
            AY&#58;=10;
        end
        else
        begin
            inc&#40;DY,10&#41;;
            inc&#40;AY,10&#41;;
        end;
    end;                    //Fin de Boucle de pointillement sur la hauteur
    end;

    Et maintenant voici le petit bout de code qui me pose probléme, ici je ne fais que remplacer les anciennes valeur de Width et Height, en ré-appelant la procédure TraceGrid a la fin de la procédure, et ça fonctionne pas, alors soit c'est mon message qui déconne, ou c'est la procédure qui n'est pas appelé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TGrid.WMSize&#40;var Message&#58;TWMSize&#41;;
    begin
    Width&#58;=Message.Width;
    Height&#58;=Message.Height;
    TraceGrid;
    end;
    Note : La procédure Register est juste en dessous de l'implementation, et toutes les procédure suives aprés, je ne pense pas que cela est de l'importance, mais je vous le dit quand même.

    Voila comme vous pouvez le voir ce composant est loin d'être compliquer,
    sachant qu'il n'est pas finis, alors Merci a vous !

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2002
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Essaies pour commencer d'ajouter inherited dans ta proc WM_Size
    comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TGrid.WMSize&#40;var Message&#58;TWMSize&#41;; 
    begin 
    Inherited ;
    Width&#58;=Message.Width; 
    Height&#58;=Message.Height; 
    TraceGrid; 
    end;

  3. #3
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    Et bien malheuseusement ceci ne fonctionne pas, dans l'aide de Delphi il n'en parle pas non plus, par contre il y a un exemple pour les composant CLX, ou inherited est placé a la fin de la procédure, mais pour la VCL il n'en mette pas du tout, j'ai essayer ces 2 solutions la, ça fonctionne pas non plus. C'est un Bug ?

    Pour ceux qui veulent voir le fichier d'aide :
    Guide du concepteur de composants\Personnalisation d'une Grille\Redimensionnement des Cellules
    Sur Delphi 7

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 410
    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 410
    Points : 5 801
    Points
    5 801
    Par défaut
    salut


    avant de dire que c'est un bug il serait de bon ton de regarder les sources
    de la vcl
    Le composant Timage derive de TGraphicControl qui lui meme et derive de Tcontrol et non de twincontrol
    le Tcontrol n'as pas de propriete wmsize donc son decendant
    ne peut le derive

    a mon avis c'est donc a toi de gerer ton affichage en grille

    @+ Phil
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    a mon avis c'est donc a toi de gerer ton affichage en grille

    Re-salut, la je ne comprend plus rien, déja que je ne comprend pas grand chose, je sens que ca va être compliquer, enfin bref !

    Moi je pensait que les Message Windows ne dépendait pas de Delphi, et que c'était externe a celui-ci, donc les propriété et tout le tralala, on s'en fous étant donnée que l'on va chercher des evenement a windows et non a Delphi, et on va les chercher a l'extérieur de Delphi, Non !

    Sinon, j'aimerais bien que l'on m'explique comment faire Merci !

  6. #6
    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
    Les messages ne sont envoyés qu'aux contrôles fenêtrés (ceux dérivant de TWinControl). Ton composant dérive de TGraphicControl, il est donc normal qu'il en les reçoive pas.
    Ce que je ferais à ta place :
    1 - Je dériverais directement de TGraphicControl car je ne vois pas à quoi te sert de trafiquer un TImage. En plus cela complique énormément la gestion puisqu'il faudrait tenir compte en théorie de la propriété Picture.
    2 - Je dériverais la procédure Paint au lieu de récupérer les messages de redimensionnement. Ton tracé doit être réalisé quand le composant nécessite d'être rafraichi, pas uniquement quand il est redimensionné.

    Cela devrait donner quelque chose de ce genre :
    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
     
      TGrid = class&#40;TGraphicControl&#41;
      private
        FFactor&#58;Integer;
        FShowGrid&#58;Boolean;
      protected
        procedure Paint; override;
      public
        constructor Create&#40;AOwner&#58;TComponent&#41;;override;
        procedure TraceGrid;
      published
        property Factor&#58;Integer read FFactor write FFactor;
        property ShowGrid&#58;Boolean read FShowGrid write FShowGrid;
        property Width default 350;
        property Height default 200;
      end;
     
    &#123; TGrid &#125;
     
    constructor TGrid.Create&#40;AOwner&#58; TComponent&#41;;
    begin
      inherited Create&#40;AOwner&#41;;
      Factor&#58;=10;
      Width&#58;=350;
      Height&#58;=200;
    end;
     
    procedure TGrid.Paint;
    begin
      inherited;
      TraceGrid;
    end;
     
    procedure TGrid.TraceGrid;
    var
        DX, AX, DY, AY, i, j, L, H&#58;Integer;
    begin
      ...
    end;

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2004
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 146
    Points : 91
    Points
    91
    Par défaut
    Hé ben, j'ai juste une chose a dire, t'est un Chef, cela fonctionne trés trés bien, Alors Merci !!!

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

Discussions similaires

  1. Réussir à intercepter le message windows BOUTON OK
    Par fleur_de_rose dans le forum MFC
    Réponses: 4
    Dernier message: 24/02/2006, 16h59
  2. [VB.NET][2.0] Interception de messages Windows
    Par DotNET74 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/02/2006, 20h26
  3. Intercepter les messages windows
    Par schneed dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/12/2005, 15h12
  4. Interception des messages windows
    Par sunchai dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/08/2005, 11h31
  5. Réponses: 2
    Dernier message: 06/04/2004, 09h39

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