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 :

[DelphiXE] Création d'un composant multi conteneur


Sujet :

Composants VCL Delphi

  1. #1
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut [DelphiXE] Création d'un composant multi conteneur
    Bonjour,

    Je m'attaque à la création d'un composant visuel qui possède 3 parties distinctes étant chacune un TPanel.

    Mon soucis est lors de l'utilisation en designtime du composant.
    Lorsque je pose un autres composants (genre un Tedit) dans une des 3 parties.
    Si je bascule en mode Text de la form ce composant n'apparait pas.

    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
     
    TNewPanel = class(TRzCustomPanel)
      private
          FPan_Top    : TRzPanel;
          FPan_Client : TRzPanel;
          FPan_Bottom : TRzPanel;
      public
        constructor Create( AOwner: TComponent ); override;
    end;
     
    constructor TNewPanel.Create(AOwner: TComponent);
    begin
      Inherited Create(AOwner);
     
      FPan_Top := TRzPanel.Create(Self);
      FPan_Top.Parent := Self;
      FPan_Top.Align := alTop;
      FPan_Top.Visible := True;
     
      FPan_Bottom := TRzPanel.Create(Self);
      FPan_Bottom.Parent := Self;
      FPan_Bottom.Align := alBottom;
      FPan_Bottom.Visible := True;
     
      FPan_Client := TRzPanel.Create(Self);
      FPan_Client.Parent := Self;
      FPan_Client.Align := alclient;
      FPan_Client.Visible := True;
    end;
    y a t il quelque chose à faire de spécial pour que les composants posées dans le panel (Ex : FPan_Top) soit bien enregistré ?

    Merci

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Ne manquerait-il pas un inherited dans le constructeur TGinPanel ?
    L'absence d'Owner expliquerait cela (à verifier).

    @+

  3. #3
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Je l'ai juste oublié quand j'ai mis le code sur le forum (Le code est plus complexe que çà ) et il est bien ^^

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2003
    Messages : 51
    Points : 60
    Points
    60
    Par défaut
    Salut,

    Sur ce type de composant, je crois me souvenir qu'il faut déclarer les composants "internes" (en l'occurence tes panels) comme étant des sous-composants.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    constructor TNewPanel.Create(AOwner: TComponent);
    begin
      Inherited Create(AOwner);
     
      FPan_Top := TRzPanel.Create(Self);
      FPan_Top.Parent := Self;
      FPan_Top.Align := alTop;
      FPan_Top.Visible := True;
      FPan_Top.SetSubComponent(true)
    end;
    De cette manière, Delphi devrait réellement prendre ton sous-composant comme étant un conteneur (enfin bon en théorie )

    Bon courage

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Merci pour ta réponse mais malheureusement ca ne fonctionne pas

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 702
    Points : 25 568
    Points
    25 568
    Par défaut
    Ton TEdit apparait-il tout de même en dehors de ton TNewPanel ?
    Ou il est complètement absent de la DFM ?

    D'ailleurs, l'IDE considère que le futur parent c'est TNewPanel ou l'un des FPan_* ?

    Tu devrais intercepter CM_CONTROLCHANGE (provoqué à chaque InsertControl dans un TWinControl), tu devrais ainsi pouvoir choper qui est le parent (ou forcer le Panel en dessous du curseur, si tu peux le choper)

    En Delphi XE, tu pourrais utiliser un TGridPanel (ou TFlowPanel) pour faire cela !?

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Ton TEdit apparait-il tout de même en dehors de ton TNewPanel ?
    Ou il est complètement absent de la DFM ?
    L'édit apparait bien au niveau de la form

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type
      TForm2 = class(TForm)
        NewPanel1: TNewPanel;
        Edit1: TEdit;
    Mais n'apparait pas du tout dans le Dfm

    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
     
    object Form2: TForm2
      Left = 327
      Top = 163
      BorderStyle = bsSingle
      Caption = 'Form2'
      ClientHeight = 578
      ClientWidth = 1024
      Color = 12827830
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object NewPanel1: TNewPanel
        Left = 161
        Top = 119
        Width = 497
        Height = 329
        Addon.PanTop.Labels.FontCenter.Charset = DEFAULT_CHARSET
        Addon.PanTop.Labels.FontCenter.Color = 3355443
        Addon.PanTop.Labels.FontCenter.Height = -16
        Addon.PanTop.Labels.FontCenter.Name = 'Arial'
        Addon.PanTop.Labels.FontCenter.Style = [fsBold]
        Addon.PanTop.Labels.FontRight.Charset = DEFAULT_CHARSET
        Addon.PanTop.Labels.FontRight.Color = 3355443
        Addon.PanTop.Labels.FontRight.Height = -11
        Addon.PanTop.Labels.FontRight.Name = 'Arial'
        Addon.PanTop.Labels.FontRight.Style = [fsUnderline]
        Addon.PanTop.Labels.RightLabelSize = 0
        Addon.PanTop.Images.ImageIndex = -1
        Addon.PanTop.Visible = True
        Addon.PanTop.BorderSide = gsBottom
        Addon.PanTop.BorderColor = 3749311
        Addon.PanTop.Enabled = True
        Addon.PanTop.Padding.Left = 2
        Addon.PanTop.Padding.Top = 2
        Addon.PanTop.Padding.Right = 2
        Addon.PanTop.Padding.Bottom = 2
        Addon.PanBottom.Labels.FontCenter.Charset = DEFAULT_CHARSET
        Addon.PanBottom.Labels.FontCenter.Color = 3355443
        Addon.PanBottom.Labels.FontCenter.Height = -16
        Addon.PanBottom.Labels.FontCenter.Name = 'Arial'
        Addon.PanBottom.Labels.FontCenter.Style = [fsBold]
        Addon.PanBottom.Labels.FontRight.Charset = DEFAULT_CHARSET
        Addon.PanBottom.Labels.FontRight.Color = 3355443
        Addon.PanBottom.Labels.FontRight.Height = -11
        Addon.PanBottom.Labels.FontRight.Name = 'Arial'
        Addon.PanBottom.Labels.FontRight.Style = [fsUnderline]
        Addon.PanBottom.Labels.RightLabelSize = 0
        Addon.PanBottom.Images.ImageIndex = -1
        Addon.PanBottom.Visible = False
        Addon.PanBottom.Enabled = True
        Addon.PanBottom.Height = 0
        Addon.PanBottom.Padding.Left = 2
        Addon.PanBottom.Padding.Top = 2
        Addon.PanBottom.Padding.Right = 2
        Addon.PanBottom.Padding.Bottom = 2
        GradientColorStart = 16316149
        GradientColorStop = 14603986
      end
    end
    D'ailleurs, l'IDE considère que le futur parent c'est TNewPanel ou l'un des FPan_* ?

    Tu devrais intercepter CM_CONTROLCHANGE (provoqué à chaque InsertControl dans un TWinControl), tu devrais ainsi pouvoir choper qui est le parent (ou forcer le Panel en dessous du curseur, si tu peux le choper)
    Je vais tester cela pour voir ce que cela donne.
    Chose que j'ai remarqué, c'est que si je pose le TEdit dans le panel supérieur, si je le déplace il détecte bien les limites du panel et ne peux pas en sortir.
    Donc je suppose que le parent doit bien être le panel

    En Delphi XE, tu pourrais utiliser un TGridPanel (ou TFlowPanel) pour faire cela !?
    Je ne peux pas, j'utilise un TRzPanel pour certaine des capacités d'affichage dont on a besoin pour le design de l'application

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 702
    Points : 25 568
    Points
    25 568
    Par défaut
    Comment as-tu ajouté Addon ?
    ce n'est pas PanTop, PanClient ou PanBottom qui sont publiés ?
    Tu n'as pas utilisé DefineProperties pour ajouter Addon ?

    SetSubComponent permet d'avoir un stockage sous la forme Obj.Prop.Prop au dans la DFM, plus besoin de DefineProperties

    Le Problème c'est comment peut-il insérer un TEdit dans la syntaxe Obj.Prop.Prop, tu perd la forme hierarchique que l'on a avec
    object object object end end end

    Et le Owner, normalement c'est la TForm, hors PanTop, PanClient ou PanBottom ont comme Owner TNewPanel puisqu'ils sont SetSubComponent
    ça doit faire paniquer le système de Flux !

    Pour une fois, je vais le dire, hors je le fais rarement : "fait une Frame"
    Argh, je l'ai écrit ...

    Sinon la bidouille tu change le AOwner (et surtout SetSubComponent(false) dans ce cas), ça doit poser surement d'autre soucis !
    Lorsque tu supprime un TNewPanel comme il reste Parent des Panels, il va aussi les libérer (en pratique il y a double système de libération Parent\Owner, ce n'est pas bien documenté, mais cela semble indispensable sinon ça ferait du dégat avec les Handles Windows)
    Entre la Frame et la Bidouille, lequelle est le plus moche ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    constructor TNewPanel.Create(AOwner: TComponent);
    begin
      Inherited Create(AOwner);
     
      FPan_Top := TRzPanel.Create(AOwner);
    ...
      FPan_Bottom := TRzPanel.Create(AOwner);
    ...
      FPan_Client := TRzPanel.Create(AOwner);
    ...
    end;

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Addon est un TPersistent

    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
     
     TPanelList = class(TPersistent)
        private
          FPanTop: TPanelPart;
          FPanBottom: TPanelPart;
          FParent : TObject;
        protected
     
        public
          constructor Create(AOwner : TComponent; ARzPanTop, ARzPanBottom : TRzPanel);
          property Parent : TObject read FParent write FParent;
        published
          property PanTop : TGinPanelPart read FPanTop write FPanTop;
          property PanBottom : TGinPanelPart read FPanBottom write FPanBottom;
      end;
    ou dans le Create je lui fais passer les objects Panel pour les traiter et gérer les options, mais je ne pense pas que cela soit ca qui fasse le soucis avec les panel

    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
     
    constructor TPanelList.Create(AOwner: TComponent; ARzPanTop, ARzPanBottom : TRzPanel);
    begin
      inherited Create;
     
      FPanTop             := TPanelPart.Create;
      FPanTop.Parent      := AOwner;
      FPanTop.Panel       := ARzPanTop;
      FPanTop.Align       := alTop;
      FPanTop.BorderSide  := gsBottom;
      FPanTop.BorderColor := $003935BF;
      FPanTop.Visible     := True;
      FPanTop.DrawPanel;
     
      FPanBottom        := TPanelPart.Create;
      FPanBottom.Parent := AOwner;
      FPanBottom.Panel  := ARzPanBottom;
      FPanBottom.Align  := alBottom;
      FPanBottom.Visible := False;
      FPanBottom.DrawPanel;
    end;
    -- NewPanel --
    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
     
     TNewPanel = class(TRzCustomPanel)
      private
        FPan_Top    : TRzPanel;
        FLab_TopCenter : TRzLabel;
        FLab_TopRight  : TRzLabel;
        FImg_TopLeft   : TImage;
     
        FPan_Bottom : TRzPanel;
        FLab_BottomCenter : TRzLabel;
        FLab_BottomRight  : TRzLabel;
        FImg_BottomLeft : TImage;
     
        FAboutInfo: TRzAboutInfo;
        FPanList : TPanelList;
        FImageList: TImageList;
      protected
      public
        constructor Create( AOwner: TComponent ); override;
        property Canvas;
        property DockManager;
      published
        property About: TRzAboutInfo read FAboutInfo write FAboutInfo stored False;
        property Addon : TPanelList read FPanList write FPanList;
        property ImageList  : TImageList read FImageList write FImageList;
    -- Create du NewPanel --
    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
     
    constructor TGinPanel.Create(AOwner: TComponent);
    begin
      inherited Create(AOwner);
     
      //---------------------------
      // Configuration du panel
      // de base
      //---------------------------
      BorderOuter := fsFlatRounded;
      Font.Color := rgb(51,51,51);
      Font.Name := 'Arial';
      Font.Size := 10;
      Font.Style := [];
      GradientColorStart := $00F8F6F5;
      GradientColorStop := $00DED6D2;
      GradientColorStyle := gcsCustom;
      VisualStyle := vsGradient;
      Height := 200;
      SetSubComponent(True);
     
      //---------------------------
      // Gestion du panel supérieur
      //---------------------------
      FPan_Top := TRzPanel.Create(Self);
      FPan_Top.Parent := Self;
      FPan_Top.Height := 36;
      FPan_Top.SetSubComponent(True);
      // Création de l'image à gauche
      FImg_TopLeft := TImage.Create(FPan_Top);
      FImg_TopLeft.Parent := FPan_Top;
      FImg_TopLeft.Align := alLeft;
      FImg_TopLeft.Width := FPan_Top.Height;
      FImg_TopLeft.Visible := True;
      // Création du label au centre
      FLab_TopCenter := TRzLabel.Create(FPan_Top);
      FLab_TopCenter.Parent := FPan_Top;
      FLab_TopCenter.Visible := True;
      // Création du label à droite
      FLab_TopRight := TRzLabel.Create(FPan_Top);
      FLab_TopRight.Parent := FPan_Top;
      FLab_TopRight.Visible := True;
     
      //---------------------------
      // Gestion du panel inférieur
      //---------------------------
      FPan_Bottom := TRzPanel.Create(Self);
      FPan_Bottom.Parent := Self;
      FPan_Bottom.Height := 36;
      FPan_Bottom.Visible := False;
      // Création de l'image de gauche
      FImg_BottomLeft := TImage.Create(FPan_Bottom);
      FImg_BottomLeft.Parent := FPan_Bottom;
      FImg_BottomLeft.Align := alLeft;
      FImg_BottomLeft.Width := FPan_Bottom.Height;
      FImg_BottomLeft.Visible := True;
      // Création Création du label central
      FLab_BottomCenter := TRzLabel.Create(FPan_Bottom);
      FLab_BottomCenter.Parent := FPan_Bottom;
      FLab_BottomCenter.Visible := True;
      // Création du label de droite
      FLab_BottomRight := TRzLabel.Create(FPan_Bottom);
      FLab_BottomRight.Parent := FPan_Bottom;
      FLab_BottomRight.Visible := True;
     
      //---------------------------
      // Création des composants
      // de propriétés
      //---------------------------
      FPanlist := TPanelList.Create(Self,FPan_Top,FPan_Bottom);
      FPanList.Parent := Self;
     
      FPanlist.FPanTop.FRzLabels    := TLabelPart.Create(Self,FLab_TopCenter,FLab_TopRight);
      FPanlist.FPanBottom.FRzLabels := TLabelPart.Create(Self,FLab_BottomCenter,FLab_BottomRight);
      FPanList.FPanTop.FImgs := TImgPart.Create(Self,FImg_TopLeft,FImageList);
      FPanList.FPanBottom.FImgs := TImgPart.Create(Self,FImg_BottomLeft,FImageList);
    end;
    Sinon pour les Frame, impossible d'utiliser ca car on doit pouvoir utiliser le composant en designtime

  10. #10
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Bon, bin j'ai réglé le problème différemment en n'autorisant pas l'insertion de composants dans ces deux zones en utilisant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      FPan_Top.ControlStyle := FPan_Top.ControlStyle - [CSACCEPTSCONTROLS];
    Ce qui fait qu'on pose un composant et il est directement pris en charge par celui de base.

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

Discussions similaires

  1. Création d'un composant de maniere dynamique
    Par loupdeau dans le forum MFC
    Réponses: 19
    Dernier message: 28/02/2005, 18h10
  2. Création dynamique de composants et destruction
    Par cpdump dans le forum Composants VCL
    Réponses: 4
    Dernier message: 19/01/2005, 18h57
  3. aide sur création d'un composant
    Par laetus dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/07/2004, 11h45
  4. Création d'un composant et couleurs
    Par gibet_b dans le forum Composants VCL
    Réponses: 4
    Dernier message: 06/07/2004, 14h44
  5. Création d'un Serveur Multi Client
    Par N*E*R*D dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 16/03/2004, 18h13

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