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

Delphi Discussion :

Problème création composant conteneur


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Par défaut Problème création composant conteneur
    Salut à tous, j'éssaie de créer un composant qui pourrait contenir des composant graphiques, comme par exemple des boutons.
    Voici la définition:

    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
     
    unit ComponentContainer;
     
    interface
     
    uses
      SysUtils, Classes, Graphics, Controls, Dialogs;
     
    type
      TComponentContainer = class(TCustomControl)
      private
        mcontrols: array of TControl;
      protected
        procedure Paint; override;
      public
        constructor Create(AOwner:TComponent); override;
        procedure addControl(ctrl:TControl);
        procedure deleteControl(id:integer);
        procedure refreshControls();
      published
        property Align;
        property Caption;
        property Color;
        property Cursor;
        property DragCursor;
        property DragMode;
        property Enabled;
        property Font;
        property Hint;
        property ParentFont;
        property ParentShowHint;
        property PopupMenu;
        property Visible;
        property Anchors;
      end;
     
    procedure Register;
    et les procédures addControl et refreshControls:
    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
     
    procedure TComponentContainer.addControl(ctrl:TControl);
    var
    i:integer;
    begin
         i:=length(mcontrols);
         setlength(mcontrols,i+1);
         ctrl.parent:=self;
         mcontrols[i]:=ctrl;
         refreshControls();
    end;
     
    procedure TComponentContainer.refreshControls();
    var
    ctop:integer;
    i:integer;
    begin
         ctop:=self.top;
         for i := 0 to Length(mcontrols) - 1 do
         begin
           mcontrols[i].Top:= ctop;
           mcontrols[i].Left:=left+3;
           mcontrols[i].width:=width-6;
           mcontrols[i].visible:=true;
           mcontrols[i].refresh();
           ctop := ctop + mcontrols[i].Height + 3;
         end;
    refresh();       
    end;
     
    procedure TComponentContainer.Paint;
    var
    i:integer;
    begin
      inherited Paint;
      with Canvas do
        begin
          Brush.Style:=bsSolid;
          Brush.Color:=Color;
          Pen.Color:=clBlack;
          Rectangle(0,0,Width,Height);
        end;
     
          for i := 0 to Length(mcontrols) - 1 do
               mcontrols[i].refresh();
    end;
    J'ai testé un exemple simple, en mettant 2 boutons sur une form, quand je cliques sur l'un, j'ajoute l'autre dans le composant. Le bouton disparait de la form, mais ne s'affiche pas. Quelqu'un aurait une idée?

    Merci d'avance !

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Février 2005
    Messages
    317
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 317
    Par défaut
    Petite précision, en fait si ma classe est encapsulée dans une classe parente:

    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
     
    unit DragComponentContainer;
     
    interface
     
    uses
      SysUtils, Classes, Graphics, Controls, Dialogs,ComponentContainer;
     
    type
      TDragComponentContainer = class(TCustomControl)
      private
        m_minWidth: integer;
        m_minHeight: integer;                  
        procedure CanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
      protected
        procedure Paint; override;
      public
        RowsCont: TComponentContainer;
        ColsCont: TComponentContainer;
        DataCont: TComponentContainer;
        BtnsCont: TComponentContainer;
        constructor Create(AOwner:TComponent); override;
      published
        property minwidth:integer read m_minWidth write m_minWidth;
        property minheight:integer read m_minHeight write m_minHeight;
        property Align;
        property Caption;
        property Color;
        property Cursor;
        property DragCursor;
        property DragMode;
        property Enabled;
        property Font;
        property Hint;
        property ParentFont;
        property ParentShowHint;
        property PopupMenu;
        property Visible;
        property Anchors;
        property OnCanResize;
     
      end;
     
    procedure Register;
     
    implementation
     
    constructor TDragComponentContainer.Create(AOwner:TComponent);
    begin
      inherited Create(AOwner);
      RowsCont:=TComponentContainer.create(self);
      ColsCont:=TComponentContainer.create(self);
      DataCont:=TComponentContainer.create(self);
      BtnsCont:=TComponentContainer.create(self);
     
      onCanResize:=CanResize;
     
      RowsCont.Parent:=self;
      ColsCont.Parent:=self;
      DataCont.Parent:=self;
      BtnsCont.Parent:=self;
     
      Width:=250;
      Height:=150;
      minwidth:=width;
      minheight:=Height;
     
      ColsCont.Width:=Width-40 - 50;
      ColsCont.Height:=15;
      ColsCont.Left:=40-1;
      ColsCont.top:=0;
      ColsCont.visible:=true;
      ColsCont.color:=clBlue;
      ColsCont.anchors:=[akLeft, akTop, akRight];
     
      RowsCont.Width:=40;
      RowsCont.Left:=0;
      RowsCont.height:=height-ColsCont.height +1;
      RowsCont.top:=ColsCont.height-1;
      RowsCont.visible:=true;
      RowsCont.color:=clGreen;
      RowsCont.anchors:=[akLeft, akTop, akBottom];
     
      DataCont.Width:= ColsCont.Width;
      DataCont.Left:=ColsCont.Left;
      DataCont.height:=height-ColsCont.height +1;
      DataCont.top:=RowsCont.top;
      DataCont.visible:=true;
      DataCont.color:=clFuchsia;
      DataCont.anchors:=[akLeft, akTop, akRight, akBottom];
     
      BtnsCont.Color:=clSilver;
      BtnsCont.top:=0;
      BtnsCont.Height:=height;
      BtnsCont.left:=ColsCont.left+ ColsCont.Width+5;
      BtnsCont.Width:=width-BtnsCont.left;
      BtnsCont.visible:=true;
      BtnsCont.anchors:=[akTop, akRight, akBottom];
     
    end;
     
    procedure Register;
    begin
      RegisterComponents('Samples', [TDragComponentContainer]);
    end;
     
    procedure TDragComponentContainer.CanResize(Sender: TObject; var NewWidth, NewHeight: Integer; var Resize: Boolean);
    begin
           if((NewWidth<minWidth)) then NewWidth:=minWidth;
           if((NewHeight<minHeight)) then NewHeight:=minHeight;  
           resize:=true;
    end;
     
    procedure TDragComponentContainer.Paint;
    begin
      inherited Paint;
      with Canvas do
        begin
          Brush.Style:=bsSolid;
          Brush.Color:=clBtnFace;
          Pen.Color:=clRed;
          Rectangle(0,0,Width,Height);
          //Rectangle(rowsBlockWidth+colsBlockWidth+5,0,btnsBlockWidth,height);
        end;
      RowsCont.Repaint;
      ColsCont.Repaint;
      DataCont.Repaint;
      BtnsCont.Repaint;
    end;
    Lorsque j'utilise directement un TComponentContainer ça marche, mais si j'utilise ceux définis dans TDragComponentContainer, comme BtnsCont ça ne marche pas :s
    C'est peut être une question de géométrie, mais je vois pas :s

  3. #3
    Expert confirmé
    Avatar de Qwazerty
    Homme Profil pro
    La très haute tension :D
    Inscrit en
    Avril 2002
    Messages
    4 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Activité : La très haute tension :D
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 128
    Par défaut
    SAlut
    Je debut dans la conception de composant :/ avant de poster moi meme une question, j'ai fais une recherche pour voir un peu ce qui etait deja present (c bien hein ) et je suis tombé sur ton post.
    Ma remarque ne sera peut etre pas judicieuse mais je ne comprend pas l'utilité de la procedure refreshcomponement, j'avais cru comprendre en lisant les cours de creation de compossants que lorsqu'on faisait appelle a refresh (donc a Paint) l'ordre etait transmis egalement aux enfants.
    De plus lors d'un appelle a refreshcomponement les composants présents sur le Container sont refraichis puis a l'appelle de Refresh(paint) un rectangle plein et redessiné par dessus les composants qui sont de nouveau rafraichi.
    Mais bon comme je l'ai dis plus haut je debut et donc peut etre que je ne suis pas les bon resonnements!
    Je vais de se pas rediger mes propres interogations. :p
    a++
    Qwaz

    MagicQwaz := Harry Potter la baguette en moins
    Le monde dans lequel on vit
    Ma page perso DVP
    Dernier et Seul Tutoriel : VBA & Internet Explorer
    Dernière contribution : Lien Tableau Structuré et UserForm
    L'utilisation de l’éditeur de message

  4. #4
    Membre émérite Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Par défaut
    Salut,

    pour insérer des controls dedans, il faut que ton TComponentContainer accepte les controls

    dans le constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
      ControlStyle := ControlStyle + [csAcceptControls];

  5. #5
    Membre émérite
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Par défaut
    J'avoue que je ne comprends pas bien l'intérêt de ce travail. N'importe quel TPanel ferait l'affaire, et si l'on a besoin de pouvoir faire défiler le groupe de composants, il y a le TScrollBox (onglet "Supplément").

  6. #6
    Membre Expert
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Par défaut
    Je confirme.
    JE developpe bon nombre de composant type conteneur a partir de TCustomPanel afin d'eliminer de ma classe tout ce qui est inutile mais present dans les TPanel.

    Sinon plutot que de partir d'un TControl qui n'ets pas ce qu'il y a de mieux pour les objets conteneur, pourquoi ne pas partir un poil plus bas : TWinControl, ancetre commun de tous les objets conteneur .....
    Note : LA property Parent des Control est de type TWinControl ..... et sachant que le Parent d'un control est le composant conteuneur qui le contient ... je vous laisse imaginer la suite

Discussions similaires

  1. Problème avec composant PicButton en création dynamique
    Par KlausGunther dans le forum Composants VCL
    Réponses: 12
    Dernier message: 03/01/2015, 12h32
  2. Réponses: 1
    Dernier message: 05/09/2014, 16h28
  3. Création des composants conteneurs
    Par Djelangelo dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/07/2011, 18h51
  4. Problème création composant EClassNotFound
    Par Djelangelo dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/04/2011, 13h58
  5. Problème : création de composants
    Par programaniac dans le forum VB.NET
    Réponses: 18
    Dernier message: 18/02/2008, 08h20

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