Composant et Message Windows - Comment ?

Résolu
glt0732 Messages postés 17 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2004 - 21 juil. 2004 à 07:57
glt0732 Messages postés 17 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2004 - 21 juil. 2004 à 15:08
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, 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 je 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é :
 uses  SysUtils, Classes, Controls, ExtCtrls, Windows, Messages, Forms, Graphics;


Ensuite vient mes déclaration de Type :
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 :
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 ! :
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);
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:=9;
            AX:=10;
        end
        else
        begin
            inc(DX,10);
            inc(AX,10);
        end;
    end;                        //Fin de Boucle de pointillement sur la largeur
    if DY<9 then
    begin
        DY:=9;
        AY:=10;
    end
    else
    begin
        inc(DY,10);
        inc(AY,10);
    end;
end;                    //Fin de Boucle dee pointillement sur la hauteur
end;<table border=0 cellspacing=0 cellpadding=4 bgcolor=#E0E0E0><tr><td class=code>

 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é :  
<table border =0 cellspacing=0 cellpadding=4 bgcolor=#E0E0E0><tr><td class=code>procedure TGrid.WMSize(var Message:TWMSize);
begin
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 !

1 réponse

glt0732 Messages postés 17 Date d'inscription mercredi 30 juin 2004 Statut Membre Dernière intervention 29 juillet 2004
21 juil. 2004 à 15:08
C'est Cool on ma donnée la réponse sur un autre forum, alors tant qu'a faire profitez en.

En faite des le départ j'avais tout faux, et ben oui mon composant dérive de TImage qui lui même dérive de TGraphicControl, en résumé :
 TGrid <-- TImage <-- TGraphicControl

Et Malheureusement la Class TGraphicControl ne peux pas recevoir de Focus, et j'ai aussi apris que celle-ci ne pouvais pas recevoir les Message Windows, vous savez les "WM_Bidule".

Enfin bref la solution consiste en faite a dériver directement de TGraphicControl et non pas de TImage, et d'utiliser la Méthode Paint, surcharger bien entendus. (et oublier les message)

Alors étant donné que j'aime faire les chose bien, je vous laisse un petit bout de code, éxactement le même qu'au dessus mais celui-ci fonctionne, avis au débutant ! (Comme moi quoi !)

Alors pour commencer j'utilise beaucoup moin d'unités comme vous pouvez le voir :

unit Grid;

interface

uses
  SysUtils, Classes, Controls;


Ensuite j'ai 2 Champs, dont 1 pour le pas de la grille(FFactor), et 1 autre pour afficher ou pas la grille, et surtout la fameuse procedure Paint(Surcharger), suivit de mes propriété :

type
  TGrid =    class (TGraphicControl)
  private 
    FFactor:Integer; 
    FShowGrid:Boolean; 
  protected 
    procedure Paint; override; 
  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;


 Histoire de tout vous donnée, voici la procédure Register : 

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('GLTPerso', [TGrid]);
end;


Et maintenant passons aux chose sérieuse, pour commencer le constructeur, pour pouvoir redéfinir nos 2 propriété par défaut, qui sont Width et Height :

constructor TGrid.Create(AOwner: TComponent); 
begin 
  inherited Create(AOwner); 
  Factor:  =10; 
  Width:=  350; 
  Height:=200; 
 end ;


 Et la on surcharge la procédure Paint, pour pouvoir redessiner a notre façon notre composant, sans elle on peut pas, du moins je crois. 

procedure TGrid.Paint; 
begin 
  inherited; 
  TraceGrid; 
end;


Et maintenant le plus gros du travail, mais le moins chiant a comprendre, le tracé de la grille avec un pas de 10 pixels.

procedure TGrid.TraceGrid;
var 
    DX, AX, DY, AY, i, j, L, H:Integer; 
begin 
L:  =Width; H:= Height;
L:=Round(L/10); H:=Round(H/10);
DX:=0; DY:=0; AX:=1; AY:=1;
 for  j: =0 to H do  //Boucle de pointillement jusqu'a H =  Height/10
 begin 
    DX: =0; AX:= 1;  //Réinitialisation des valeurs au début de la largeur
     for  i: =0 to L do  //Boucle de pointillement jusqu'a L =  Width/10
     begin 
        Canvas.MoveTo(DX,DY);
        Canvas.LineTo(AX,AY);
        if DX<9 then
        begin
            DX: =9;
            AX:= 10;
         end 
        else
        begin
            inc(DX,10);
            inc(AX,10);
        end;
    end;  //Fin de Boucle de pointillement sur la largeur
    if DY<9 then
    begin
        DY: =9;
        AY:=10;
    end
    else
    begin
        inc(DY,10);
        inc(AY,10);
    end;
end/b;  //Fin de Boucle de pointillement sur la hauteur
end/b;


Note : les propriété Factor, et ShowGrid, ne sont pas encore implémenté, mais ceci n'empêche pas le composant TGrid de fonctionner.


Et voila vous vous doutez bien que mon composant est loin d'être finis, maintenant si cela vous interesse, vous n'avez plus qu'a le personnaliser, c'est déja un bon depart pour un débutant.

Et je remercie Pierre Castelain sur le Forum de Developpez.com, de m'avoir donner la réponse.
3
Rejoignez-nous