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 :

Comment utiliser un composant que l'on crée soi-même ?


Sujet :

Composants VCL Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 187
    Par défaut Comment utiliser un composant que l'on crée soi-même ?
    Voici un code permettant de faire un bouton avec une couleur (si un modo veut l'ajouter à la faq) :
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics,
     Controls, Forms,  Dialogs, StdCtrls, Buttons;
     
    type
          TColorBtn = class(TButton)
        private
          IsFocused: boolean;
          FCanvas: TCanvas;
          F3DFrame: boolean;
          FButtonColor: TColor;
          procedure Set3DFrame(Value: boolean);
          procedure SetButtonColor(Value: TColor);
          procedure CNDrawItem(var Message: TWMDrawItem);
            message CN_DRAWITEM;
          procedure WMLButtonDblClk(var Message: TWMLButtonDblClk);
            message WM_LBUTTONDBLCLK;
          procedure DrawButtonText(const Caption: string; TRC: TRect;
            State: TButtonState; BiDiFlags: Longint);
          procedure CalcuateTextPosition(const Caption: string;
            var TRC: TRect; BiDiFlags: Longint);
        protected
          procedure CreateParams(var Params: TCreateParams); override;
          procedure SetButtonStyle(ADefault: boolean); override;
        public
          constructor Create(AOwner: TComponent); override;
          destructor Destroy; override;
        published
          property ButtonColor: TColor read FButtonColor
            write SetButtonColor default clBtnFace;
          property Frame3D: boolean read F3DFrame write Set3DFrame
            default False;
      end;
     
      TForm1 = class(TForm)
        bouton1: TColorBtn;
      private
        { Private declarations }
      public
        { Public declarations }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    constructor TColorBtn.Create(AOwner: TComponent);
    begin
      Inherited Create(AOwner);
      FCanvas:= TCanvas.Create;
      FButtonColor:= clBtnFace;
      F3DFrame:= False;
    end;
     
    destructor TColorBtn.Destroy;
    begin
      FCanvas.Free;
      Inherited Destroy;
    end;
     
    procedure TColorBtn.CreateParams(var Params: TCreateParams);
    begin
      Inherited CreateParams(Params);
      with Params do Style:= Style or BS_OWNERDRAW;
    end;
     
    procedure TColorBtn.Set3DFrame(Value: boolean);
    begin
      if F3DFrame <> Value then F3DFrame:= Value;
    end;
     
    procedure TColorBtn.SetButtonColor(Value: TColor);
    begin
      if FButtonColor <> Value then begin
        FButtonColor:= Value;
        Invalidate;
      end;
    end;
     
    procedure TColorBtn.WMLButtonDblClk(var Message: TWMLButtonDblClk);
    begin
      Perform(WM_LBUTTONDOWN, Message.Keys, Longint(Message.Pos));
    end;
     
    procedure TColorBtn.SetButtonStyle(ADefault: Boolean);
    begin
      if IsFocused <> ADefault then IsFocused:= ADefault;
    end;
     
    procedure TColorBtn.CNDrawItem(var Message: TWMDrawItem);
    var
      RC: TRect;
      Flags: Longint;
      State: TButtonState;
      IsDown, IsDefault: Boolean;
      DrawItemStruct: TDrawItemStruct;
    begin
      DrawItemStruct:= Message.DrawItemStruct^;
      FCanvas.Handle:= DrawItemStruct.HDC;
      RC:= ClientRect;
      with DrawItemStruct do begin
        IsDown:= ItemState and ODS_SELECTED <> 0;
        IsDefault:= ItemState and ODS_FOCUS <> 0;
        if not Enabled then State:= bsDisabled
        else if IsDown then State:= bsDown
        else State:= bsUp;
      end;
      Flags:= DFCS_BUTTONPUSH or DFCS_ADJUSTRECT;
      if IsDown then Flags:= Flags or DFCS_PUSHED;
      if DrawItemStruct.ItemState and ODS_DISABLED <> 0 then
        Flags:= Flags or DFCS_INACTIVE;
      if IsFocused or IsDefault then begin
        FCanvas.Pen.Color:= clWindowFrame;
        FCanvas.Pen.Width:= 1;
        FCanvas.Brush.Style:= bsClear;
        FCanvas.Rectangle(RC.Left, RC.Top, RC.Right, RC.Bottom);
        InflateRect(RC, -1, -1);
      end;
      if IsDown then begin
        FCanvas.Pen.Color:= clBtnShadow;
        FCanvas.Pen.Width:= 1;
        FCanvas.Rectangle(RC.Left, RC.Top, RC.Right, RC.Bottom);
        InflateRect(RC, -1, -1);
        if F3DFrame then begin
          FCanvas.Pen.Color:= FButtonColor;
          FCanvas.Pen.Width:= 1;
          DrawFrameControl(DrawItemStruct.HDC, RC, DFC_BUTTON, Flags);
        end;
      end else
        DrawFrameControl(DrawItemStruct.HDC, RC, DFC_BUTTON, Flags);
      FCanvas.Brush.Color:= FButtonColor;
      FCanvas.FillRect(RC);
      InflateRect(RC, 1, 1);
      if IsFocused then begin
        RC:= ClientRect;
        InflateRect(RC, -1, -1);
      end;
      if IsDown then OffsetRect(RC, 1, 1);
      FCanvas.Font:= Self.Font;
      DrawButtonText(Caption, RC, State, 0);
      if IsFocused and IsDefault then begin
        RC:= ClientRect;
        InflateRect(RC, -4, -4);
        FCanvas.Pen.Color:= clWindowFrame;
        Windows.DrawFocusRect(FCanvas.Handle, RC);
      end;
      FCanvas.Handle:= 0;
    end;
     
    procedure TColorBtn.CalcuateTextPosition(const Caption: string;
          var TRC: TRect; BiDiFlags: Integer);
    var
      TB: TRect;
      TS, TP: TPoint;
    begin
      with FCanvas do begin
        TB:= Rect(0, 0, TRC.Right + TRC.Left, TRC.Top + TRC.Bottom);
        DrawText(Handle, PChar(Caption), Length(Caption), TB,
          DT_CALCRECT or BiDiFlags);
        TS := Point(TB.Right - TB.Left, TB.Bottom - TB.Top);
        TP.X := ((TRC.Right - TRC.Left) - TS.X + 1) div 2;
        TP.Y := ((TRC.Bottom - TRC.Top) - TS.Y + 1) div 2;
        OffsetRect(TB, TP.X + TRC.Left, TP.Y + TRC.Top);
        TRC:= TB;
      end;
    end;
     
    procedure TColorBtn.DrawButtonText(const Caption: string; TRC: TRect;
      State: TButtonState; BiDiFlags: Integer);
    begin
      with FCanvas do begin
        CalcuateTextPosition(Caption, TRC, BiDiFlags);
        Brush.Style:= bsClear;
        if State = bsDisabled then begin
          OffsetRect(TRC, 1, 1);
          Font.Color:= clBtnHighlight;
          DrawText(Handle, PChar(Caption), Length(Caption), TRC,
            DT_CENTER or DT_VCENTER or BiDiFlags);
          OffsetRect(TRC, -1, -1);
          Font.Color:= clBtnShadow;
          DrawText(Handle, PChar(Caption), Length(Caption), TRC,
            DT_CENTER or DT_VCENTER or BiDiFlags);
        end else
          DrawText(Handle, PChar(Caption), Length(Caption), TRC,
            DT_CENTER or DT_VCENTER or BiDiFlags);
        end;
    end;
     
    procedure Register;
    begin
      RegisterComponents('Samples', [TColorBtn]);
    end;
     
    end.
    Maintenant que le code est disponible, mon problème se trouve ailleurs :
    Que mettre sur la form1 pour pouvoir utiliser ce ColorBtn ?
    J'ai essayé en mettant un button1 en changeant sa déclaration de form1 mais ça fonctionne pas!

    Je ne suis plus très loin du but, il me manque une toute petite manip... Klk1 aurait une idée ?

    Thx in advance.

  2. #2
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 187
    Par défaut
    J'étais en train d'essayer ceci :
    http://atlantis.developpez.com/flash/icomposant/

    Mais ça ne fonctionne pas!
    Merci SJRD pour ta réponse Pour le moment je comprend que dalle mais je vais m'y mettre de suite

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Billets dans le blog
    1
    Par défaut
    En premier lieu, si tu veux utiliser la méthode qu'Atlantis décrit, tu dois séparer le code de ton composant du code la fiche.

    Ensuite et bien soit tu passes par l'assistant comme sur la vidéo, soit implémente le recensement de ton composant dans l'EDI manuellement comme l'explique le tutoriel de SRJD

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 187
    Par défaut
    Un grand merci pour vos réponses à tous deux mais ça m'a l'air fort bien compliquer!!!

    En chipottant un petit peu, j'ai réussi à le faire via une méthode plus simple :
    1- Component/ New component
    Là, on donne la classe. Dans mon cas Tbutton.
    2- On déclare le TColorBtn comme au premier post.
    3- On sauvegarde le .pas
    4- Component/ Install component
    On donne comme path le fichier .pas qu'on vient de sauver.

    Ca fonctionne et me parait moins matheux comme méthode Ca a également comme avantage de pouvoir ajouter le nouveau composant sur la palette de notre choix

    Pour une fois que j'arrive à faire un truc par moi même

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 187
    Par défaut
    Une dernière étape au cas ou klk1 aurait le même problème un jour :
    Ajouter le fichier .dcu du .pas créé dans le dossier lib (dans mon cas E:\Program Files\Borland\Delphi7\Lib.

    Voila

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 187
    Par défaut Comment gerer le texte d'un Tbutton
    Me revoila avec mes boutons

    J'essaye de comprendre le code de mon tout premier post pour savoir ou le texte s'ecrit sur le Tbutton mais je ne comprend rien du tout

    Mon but serait de repositionner le texte.
    Pour etre plus precis, je cherche a avoir trois lignes centrees ou j'affecterai :
    ligne1 : string1
    ligne2 : string2
    ligne3 : string3

    Ca doit etre faisable, non ?
    Que faut il changer a la declaration du Tbutton ?

    Thx in advance

Discussions similaires

  1. PortCom comment utiliser le composant dynamiquement
    Par freespiritbcd dans le forum C++Builder
    Réponses: 14
    Dernier message: 22/05/2008, 14h40
  2. comment utiliser le composant TAgent
    Par karimro dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/11/2007, 13h16
  3. Comment utiliser le composant XPManifest ?
    Par 21247692 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 09/11/2007, 10h19
  4. Comment utiliser le composant TUDPSocket ?
    Par zodd dans le forum Web & réseau
    Réponses: 11
    Dernier message: 16/11/2005, 12h09
  5. Comment utiliser un composant sans son nom ?
    Par aliwassem dans le forum Langage
    Réponses: 4
    Dernier message: 03/10/2005, 20h47

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