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

C++Builder Discussion :

Probleme de composant inclus dans un autre.


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 37
    Points
    37
    Par défaut [résolu] Probleme de composant inclus dans un autre.
    Suite aux conseils lors d'une question précédente, j'inclus un TScrollBar dans mon Composant TTrameList de la manière suivante :

    section private de la classe tu composant:

    Constructeur du composant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    	Psb=new TScrollBar(Owner);
    	Psb->Parent=this;
    	Psb->Kind = sbVertical;
    	Psb->Align = alRight;
    	Psb->OnChange=SBChange;
    Voilà le problème : sous l'EDI après avoir placé le composant il affiche le scrollbar sous-jacent (cool). Le problème c'est que si je lance l'executable il en affiche deux cote à cote.

    Si je regarde le DFM de ma form, il un ScrollBar apparait dans mon TTrameList. Comme j'en cree un dans le constructeur, ca en fait deux au total.

    Comment prévenir cela ?

    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
            object tl_trame: TTrameList
              Left = 0
              Top = 13
              Width = 413
              Height = 419
              Align = alClient
              TabOrder = 0
              TabStop = True
              Color = 12048843
              Description = True
              ColorIn = 15790335
              ColorOut = 16773360
              ColorUnk = 13172735
              Font.Charset = ANSI_CHARSET
              Font.Color = clBlack
              Font.Height = -12
              Font.Name = 'Lucida Console'
              Font.Style = []
              LineHeight = 24
              NumSel = -1
              object TScrollBar
                Left = 387
                Top = 0
                Width = 13
                Height = 419
                Align = alRight
                Kind = sbVertical
                Max = 0
                PageSize = 0
                TabOrder = 1
              end
            end
          end

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Bon j'ai cru être malin et contourner le problème en mettant ceci dans le constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	if (ControlCount==0)
    		Psb=new TScrollBar(Owner);
    	else
    		Psb=(TScrollBar*)Controls[0];
    Manifestement ca ne marche pas... Les Objets du DFM doivent être créés après

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Pas de grand gourou de Builder à la rescousse ?

  4. #4
    Membre chevronné
    Avatar de Gilles Louïse
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2002
    Messages : 421
    Points : 1 911
    Points
    1 911
    Par défaut
    Très difficile à dire étant donné qu'on ne connaît pas votre composant. Si le ScroolBar est créé à la conception, je ne vois pas comment vous pouvez montrer le code de son constructeur étant donné que c'est C++ Builder qui se charge d'écrire le code. Ou alors est-ce un ScoolBar créé dynamiquement. Il se peut que votre composant ait déjà un ScroolBar actif, lequel n'est pas visible à la conception mais qui apparaît dès que c'est nécessaire. Par exemple mettez un TLabel quelconque sur la forme principale et mettez un ScroolBar horizontal en bas. En exécutant vous ne voyez qu'un ScrollBar, celui que vous avez créé mais si par exemple sur clic de la forme vous modifiez les coodonnées du TLabel en sorte qu'il sorte de la forme, alors le ScroolBar de la forme apparaît et il y en a alors deux visibles, celui de la forme et celui créé par vous.

    À bientôt
    Gilles

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Merci beaucoup pour votre réponse.

    Désolé j'avais posté mon composant dans un autre message.
    Le revoici :

    partie header. Le composant en question est TTrameList.

    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
    enum TTrameDir {tdUnknown, tdIn, tdOut};
     
    // Options pour Paint
    #define topts_sel 1    // élément sélectionné
    #define topts_desc 2   // afficher description
     
    //---------------------------------------------------------------------------
    class TTrame
    {
    private:
    	TTrame *Pnext;
    	TTrame *Pprev;
    	TTrameDir Pdirection;
    	AnsiString Pdata;
    	AnsiString *Pdesc;
    	int Ptypetrame;
     //	TTimeStamp Temps;
    protected:
    public:
    	int Pnumtrame;
    	__fastcall TTrame::TTrame(AnsiString Trame,AnsiString *Desc,TTrameDir Direction);
    	bool __fastcall IsFiltered(unsigned char *filterlist);
    	void __fastcall Paint(TRect *rect,TCanvas *canvas, unsigned char opts);
    	TTrame * __fastcall Next(void);
    	TTrame * __fastcall Prev(void);
    	TTrame * __fastcall NextF(unsigned char *filterlist);
    	TTrame * __fastcall PrevF(unsigned char *filterlist);
    	TTrameDir __fastcall Direction(void);
    	void __fastcall Link(TTrame *prev,TTrame *next);
    	AnsiString  __fastcall TrameRead(void);
    };
     
    //---------------------------------------------------------------------------
    class PACKAGE TTrameList : public TCustomControl
    {
    private:
    	TTrame *Phead;
    	TTrame *Ptop;
    	TTrame *Ptail;
    	TTrame *Psel;
    	TScrollBar *Psb;
    	TFont *FFont;
    	TColor Pcolorin;
    	TColor Pcolorout;
    	TColor Pcolorunk;
    	int Pnblines;
    	int Plineheight;
    	bool Pfocus;
    	bool Pdescription;
    	bool Pfalseclick;
    	unsigned char Pfilter[125];
    protected:
    	DYNAMIC void __fastcall DoEnter(void);
    	DYNAMIC void __fastcall DoExit(void);
    	DYNAMIC void __fastcall Click(void);
    	DYNAMIC void __fastcall MouseDown(TMouseButton Button,Classes::TShiftState Shift, int X, int Y);
    	DYNAMIC void __fastcall MouseUp(TMouseButton Button,Classes::TShiftState Shift, int X, int Y);
    	DYNAMIC void __fastcall KeyDown(Word &Key, Classes::TShiftState Shift);
    	DYNAMIC void __fastcall KeyUp(Word &Key, Classes::TShiftState Shift);
    	bool __fastcall CanResize(int &NewWidth, int &NewHeight);
    	void __fastcall Paint(void);
    	void __fastcall SBChange( TObject *Sender );
    	void __fastcall UpdateSB(void);
    	void __fastcall AjustTop(void);
    	virtual void __fastcall SetDescription( bool value );
    	virtual void __fastcall SetLineHeight( int value );
    	virtual void __fastcall SetColorIn( TColor value );
    	virtual void __fastcall SetColorOut( TColor value );
    	virtual void __fastcall SetColorUnk( TColor value );
    	TTrame * __fastcall FindTrame(int Num);
    //	void __fastcall SetSB(TScrollBar *Value);
    	void __fastcall SetNumSel( int Num );
    	int __fastcall RNumSel(void);
    public:
    	__fastcall TTrameList(TComponent* Owner);
    	__fastcall ~TTrameList();
     
    	void __fastcall Append(AnsiString Trame,AnsiString *Desc,TTrameDir Direction);
    	void __fastcall Up(void);
    	void __fastcall Down(void);
    	void __fastcall PageUp(void);
    	void __fastcall PageDown(void);
    	void __fastcall SetPos(int pos);
    	void __fastcall Filter(AnsiString Trame);
    	void __fastcall UnFilter(AnsiString Trame);
    	void __fastcall Clear(void);
    	AnsiString  __fastcall TrameRead(int numtrame);
    	TTrameDir  __fastcall TrameDir(int numtrame);
     
    	void __fastcall Change(void);
    __published:
    	__property Align;
    	__property Anchors;
    	__property Constraints;
    	__property TabOrder;
    	__property TabStop;
    	__property Color;
    	__property bool Description = { read=Pdescription,  write=SetDescription, default = false };
    	__property TColor ColorIn = { read=Pcolorin,  write=SetColorIn, default = 0x00FFF0F0 };
    	__property TColor ColorOut= { read=Pcolorout, write=SetColorOut,default = 0x00F0F0FF };
    	__property TColor ColorUnk= { read=Pcolorunk, write=SetColorUnk,default = 0x00FFFFF0 };
    	__property Font;
    	__property int LineHeight = { read=Plineheight, write=SetLineHeight, default=8 };
    	__property int NumSel = {read = RNumSel, write=SetNumSel};
    //	__property TScrollBar *ScrollBar =  {read=Psb, write=SetSB};
     
     
    	__property OnClick;
    	__property OnKeyUp;
    	__property OnKeyPress;
    	__property OnKeyDown;
    	__property OnEnter;
    	__property OnExit;
    };
    Voilà le constructeur du composant.

    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
    __fastcall TTrameList::TTrameList(TComponent* Owner)
    	: TCustomControl(Owner)
    {
    	// chercher si qq chose a voir dans controlstyle
    	TabStop = true;
    	Phead = NULL;
    	Ptail = NULL;
    	Ptop = NULL;
    	Pfocus = false;
    	DoubleBuffered = true;
    	SetLineHeight(16);
    //	if (ControlCount==0)
    		Psb=new TScrollBar(Owner);
    //	else
    //		Psb=(TScrollBar*)Controls[0];
    	Psb->Parent=this;
    	Psb->Kind = sbVertical;
    	Psb->Align = alRight;
    	Psb->OnChange=SBChange;
    }
    Quand je fais cela, Si je pose un TTrameList sur ma form, J'ai un scroll bar. Ensuite, à chaque fois que je fais (bouton droit sur la form) "view as text" suivi de "view as form", un nouveau scroll bar apparait.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    P.S. Je n'ai pas posté toute l'implémentation du composant pour ne pas surcharger, s'il y a besoin d'autres partie du code je peux les poster pas de problème.

  7. #7
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    A mon avis ça se situe au niveau de la destruction de l'objet.

    Rajouter dans le destructeur de l'objet, la destruction du TScrollBar.
    En effet, le propriétaire est ici owner qui est vraissemblablement une
    fiche, donc ici la destruction de l'objet n'entraine pas la destruction du Psb
    et à supposer qu'il retrouve un parent... qui n'est qu'une adresse ????
    Il faudrait en savoir plus sur BCB lui-même... !

    Ou bien modifier l'appel au constructeur du Psb en lui affectant
    this (l'objet) comme propriétaire et non pas owner (la fiche).
    La destruction du Psp sera alors directement liée à celle de l'objet.

    A plus !

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 38
    Points : 37
    Points
    37
    Par défaut
    Rajouter dans le destructeur de l'objet, la destruction du TScrollBar.
    Aucun changement après essai.

    Ou bien modifier l'appel au constructeur du Psb en lui affectant
    this (l'objet)
    En revanche, ceci règle bien mon problème. Mon TScrollBar n'apparait plus dans le DFM

    Cool, merci.

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

Discussions similaires

  1. Polygone inclus dans un autre
    Par Mic75 dans le forum Développement 2D, 3D et Jeux
    Réponses: 5
    Dernier message: 17/11/2007, 20h41
  2. Probleme avec deux div dans une autre
    Par orphen dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 05/11/2007, 15h10
  3. Bind variable incluse dans une autre bind variable
    Par kinder_pingui dans le forum SQL
    Réponses: 3
    Dernier message: 28/11/2006, 10h35
  4. Comment trouver des structures incluses dans d'autres
    Par Vulcanos dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/10/2006, 23h59
  5. Probleme appel de fct dans une autre classe
    Par crakotte_finance dans le forum C++
    Réponses: 6
    Dernier message: 09/10/2006, 21h22

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