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 :

Problème avec un composant fait maison


Sujet :

C++Builder

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut Problème avec un composant fait maison
    Bonjour,
    J'ai suivi cette aide très bien faite :http://chgi.developpez.com/compo/ pour créer deux composants (eet bientôt un 3ème)

    Mon 1er fonctionne très bien.
    Mais le 2ème à un soucis. Il fonctionnait bien ce hier et ce soir, après l'avoir complété, comme la compilation réussissait, je croyais que tout fonctionnait encore. J'obtien le composant mais j'ai un message d'erreur au moment ou je le pose sur une fiche.
    Violation d'accès à l'adresse 4002B43F dans le module 'rtl60.bpl'. Lecture de l'adresse 00000000.
    C'est un composant non visuel descendant de TComponent. De quelle partie du code le problème peut-il venir?

    J'ai également une liste qui me permette de stocker des informations (j'ai utilisé une classe dérivée de TPersistent) et je voudrais pouvoir l'éditer dans l'inspecteur d'objets mais :
    1) comment dire à l'inspecteur d'objet qu'il n'y a que un seule type de classe dedans pour pouvoir l'éditeur comme une liste de sous propriété
    2) Comment avoir TComponentEditor dans la liste au moment de la création d'un nouveau composant (il n'y est pas).

    Voici le début du fichier cpp :
    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
    static inline void ValidCtrCheck(TGestionUsers *)
    {
            new TGestionUsers(NULL);
    }
    //---------------------------------------------------------------------------
    __fastcall TGestionUsers::TGestionUsers(TComponent* Owner)
            : TComponent(Owner)
    {
     
    }
    //---------------------------------------------------------------------------
    __fastcall TGestionUsers::~TGestionUsers()
    {
     
    }
    //---------------------------------------------------------------------------
    namespace Gestionusers
    {
            void __fastcall PACKAGE Register()
            {
                     TComponentClass classes[1] = {__classid(TGestionUsers)};
                     RegisterComponents("gandf", classes, 0);
            }
    }
    Voila, c'est tout pour l'instant
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de dvsoft
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2002
    Messages : 176
    Points : 622
    Points
    622
    Par défaut
    bonjour

    J'ai également une liste qui me permette de stocker des informations (j'ai utilisé une classe dérivée de TPersistent) et je voudrais pouvoir l'éditer dans l'inspecteur d'objets mais :
    1) comment dire à l'inspecteur d'objet qu'il n'y a que un seule type de classe dedans pour pouvoir l'éditeur comme une liste de sous propriété
    2) Comment avoir TComponentEditor dans la liste au moment de la création d'un nouveau composant (il n'y est pas).
    Pour avoir accès aux éditeurs de propriétés dans l’inspecteur d’object, il faut creer une class derivée de

    Designeditors::TStringProperty.

    ajouter a cette class les methodes:

    virtual Designintf::TPropertyAttributes __fastcall GetAttributes(void);
    virtual void __fastcall GetValues(Classes::TGetStrProc Proc);

    Ajouter au projet le paquet:

    designide.bpi

    puis, il faut enregsitrer le l'éditeur avec la methode

    RegisterPropertyEditor(.....)

    ATTENTION, quand tu utilise <designide.bpi> avec Builder6, il faut faire 2 paquets,

    1 pour de designeTime
    1 pour le runTime

    Pour avoir plus d’aide, tu devrais poster la déclaration de ta class

    Voila,
    Bon courage
    Alain

  3. #3
    Membre confirmé
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juillet 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2004
    Messages : 289
    Points : 635
    Points
    635
    Par défaut
    Au niveau de ton erreur, tu lis un pointeur non initialisé (NULL)

    Bonne chance

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Merci pour ces réponses. Pour l'éditeur, je verrais quand tout fonctionnera.

    J'ai trouvé ce qu'il ne va 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
    class PACKAGE TGestionUsers : public TComponent
    {
    private:
            TGestionServeurUtilisateur FGestServUtil;
            TList *FUsersList;
     
            TNotifyEvent FOnClearUsersList;
     
    protected:
            virtual TDataClient* __fastcall GetUsers ( int Index );
            virtual void __fastcall SetUsers (int Index, TDataClient *ADataClientList);
     
     
    public:
            __fastcall TGestionUsers(TComponent* Owner);
            virtual __fastcall ~TGestionUsers();
            virtual bool __fastcall LoadUsersListFromFile (AnsiString AFile);
            virtual bool __fastcall SaveUsersListToFile (AnsiString AFile);
            virtual void __fastcall ClearUsersList ();
     
    __published:
            __property TDataClient *UsersList[int Index] = {read=GetUsers, write=SetUsers}; // en mettant en commentaire cette ligne, tout fonctionne.
            __property TNotifyEvent OnClearUsersList =  {read=FOnClearUsersList, write=FOnClearUsersList};
     
    };
    TDataClient est une classe dérivé de TPersistent. En fait c'est une classe qui stocke des informations par rapport aux clients connectés sur des serveurs et qui fournit des fonctions qui permettent de les gérer.

    Ce que j'essaie de faire c'est d'utiliser un TList pour gérer facilement l'ajout et la suppression d'utilisateur. Mais je n'arrive pas à faire comprendre à C++Builder que la TList pointe sur des TDataClient pour ainsi avoir un éditeur comme pour un TFieldDef d'un TTable. C'est à dire un éditeur avec le bouton "..." qui permet d'ajouter des utilisateurs par défaut avec les propriétés qui vont bien (comme quand l'on rajoute des champs avec le TTable).

  5. #5
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Je résoud partiellement le problème en mettant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    __fastcall TGestionUsers::TGestionUsers(TComponent* Owner)
            : TComponent(Owner)
    {
    FUsersList = new TList;
    FUsersList->Clear();
    }
    //---------------------------------------------------------------------------
    __fastcall TGestionUsers::~TGestionUsers()
    {
    delete FUsersList;
    }
    Par contre, il me met :
    Indice de liste hors limites (-2147483648)
    quand je met cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            __property TDataClient *UsersList[int Index] = {read=GetUsers, write=SetUsers};
    au moment de la pose du composant sur une form.

    Je ne comprend pas ce qu'il fait quand on pose un composant. Quel bout de code parcours-t-il à ce moment la?

  6. #6
    Rédacteur
    Avatar de dvsoft
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2002
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2002
    Messages : 176
    Points : 622
    Points
    622
    Par défaut
    bonjour

    __property TDataClient *UsersList[int Index] = {read=GetUsers, write=SetUsers};
    L'editeur de property de C++Builder ne peut pas prendre en charge cette propriete.

    Exemple pour une propriete de type TStringList
    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
     
           private:
               TStringList* FMaList;
           ....
           protected:
               void __fastcall SetList(TStringList* Value);
     
          ...
          __published:
             __property TStringList* MaList={read=FMaList,write=SetList};
     
          ...
          void __fastcall SetList(TStringList* Value)
          {
              FMalist->Assign(Value);
          }
    Par contre si tu utilise une class de Type TList, tu doit fournis, une class interface, qui prend en charge l'edition de ces propriètées, et comme
    deja dit, enregistrer l'editeur de propriete de cette class

    Ce qui est un peut plus compliquer

    Pour te donner un peut plus d'indication, tu devrais nous poster ta class
    TDataClient

    Bon courage
    Alain

  7. #7
    Membre confirmé
    Homme Profil pro
    Consultant technique
    Inscrit en
    Juillet 2002
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 519
    Points : 523
    Points
    523
    Par défaut
    Je n'ai pas mis les evènement du genre OnChange puisque cela n'apporte rien pour la résolution du problème et j'ai également enlevé toutes les propriétés et fonctions qui n'ont aucun rapport avec le problème.
    Ce composant me sert à gérer le stockage et la manipulation de client qui se connacte sur plusieurs sert (TIdTcpServer x 2 et TIdUdpServer x 2) et je compte par la suite modifier le tout pour prendre en compte un nombre indéterminé de serveur. Chaque sert peut être indépendant des autres oubien être en relation directe. Les pointeurs servent à garder une trace du TIdPeerThread qui gère le client connecté.
    Voici uniquement le .h

    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
    class TDataClient : public TPersistent
     {
      private:
            AnsiString FNickName, FStringCrypt, FRegisterTo, FPassword, FIDSession, FIP;
            int FPortOnServeur1, FPortOnClient1, FPortOnServeur2, FPortOnClient2;
            int FCompressionValue;
            TCompressionType FCompressionType;
            bool FProtocolTCP1, FProtocolUDP1, FProtocolTCP2, FProtocolUDP2, FBusy, FCompression, FCrypted;
            TList *FPrivateChat; // Chat privé avec une seule personne
            TList *FPrivateChatWith; // Chat privé entre plusieurs personnes
     
      public:
            __fastcall TDataClient();
            virtual __fastcall ~TDataClient();
            virtual void __fastcall SetPointeurTCP1(void *APointeurTCP1);
            virtual void __fastcall SetPointeurUDP1(void *APointeurUDP1);
            virtual void __fastcall SetPointeurTCP2(void *APointeurTCP2);
            virtual void __fastcall SetPointeurUDP2(void *APointeurUDP2);
            virtual void* __fastcall GetPointeurTCP1();
            virtual void* __fastcall GetPointeurUDP1();
            virtual void* __fastcall GetPointeurTCP2();
            virtual void* __fastcall GetPointeurUDP2();
            virtual void __fastcall ClearPrivateChat();
            virtual void __fastcall ClearPrivateChatWith();
            virtual void __fastcall Clear();
            virtual bool __fastcall AddUserToPrivateChat(int IDPrivateChat, int CompressionValue, AnsiString NickName, AnsiString RegisterTo, AnsiString StringCrypt, TCompressionType CompressionType, bool Compression, bool Crypted);
            virtual bool __fastcall AddUserToPrivateChatWith(int IDPrivateChat, int CompressionValue, AnsiString NickName, AnsiString RegisterTo, AnsiString StringCrypt, TCompressionType CompressionType, bool Compression, bool Crypted);
            virtual void __fastcall DelUserToPrivateChatWith(int IDPrivateChat, AnsiString NickName);
            virtual void __fastcall DelPrivateChat(int IDPrivateChat);
            virtual void __fastcall DelPrivateChatWith(int IDPrivateChat);
     
      protected:
            virtual void __fastcall SetNickName(AnsiString ANickName);
            virtual void __fastcall SetStringCrypt(AnsiString AStringCrypt);
            virtual void __fastcall SetRegisterTo(AnsiString ARegisterTo);
            virtual void __fastcall SetPassword(AnsiString APassword);
            virtual void __fastcall SetIDSession(AnsiString AIDSession);
            virtual void __fastcall SetIP(AnsiString AIP);
            virtual void __fastcall SetPortOnServeur1(int APortOnServeur1);
            virtual void __fastcall SetPortOnClient1(int APortOnClient1);
            virtual void __fastcall SetPortOnServeur2(int APortOnServeur2);
            virtual void __fastcall SetPortOnClient2(int APortOnClient2);
            virtual void __fastcall SetProtocolTCP1(bool AProtocolTCP1);
            virtual void __fastcall SetProtocolUDP1(bool AProtocolUDP1);
            virtual void __fastcall SetProtocolTCP2(bool AProtocolTCP2);
            virtual void __fastcall SetProtocolUDP2(bool AProtocolUDP2);
            virtual void __fastcall SetBusy(bool ABusy);
            virtual void __fastcall SetCompressionValue(int ACompressionValue);
            virtual void __fastcall SetCompressionType(TCompressionType ACompressionType);
            virtual void __fastcall SetCrypted(bool ACrypted);
            virtual void __fastcall SetCompression(bool ACompression);
      __published:
            __property AnsiString NickName =  {read=FNickName, write=SetNickName};
            __property AnsiString StringCrypt =  {read=FStringCrypt, write=SetStringCrypt};
            __property AnsiString RegisterTo =  {read=FRegisterTo, write=SetRegisterTo};
            __property AnsiString Password =  {read=FPassword, write=SetPassword};
            __property AnsiString IDSession =  {read=FIDSession, write=SetIDSession};
            __property AnsiString IP =  {read=FIP, write=SetIP};
            __property int PortOnServeur1 =  {read=FPortOnServeur1, write=SetPortOnServeur1};
            __property int PortOnClient1 =  {read=FPortOnClient1, write=SetPortOnClient1};
            __property int PortOnServeur2 =  {read=FPortOnServeur2, write=SetPortOnServeur2};
            __property int PortOnClient2 =  {read=FPortOnClient2, write=SetPortOnClient2};
            __property bool ProtocolTCP1 =  {read=FProtocolTCP1, write=SetProtocolTCP1, default=false};
            __property bool ProtocolUDP1 =  {read=FProtocolUDP1, write=SetProtocolUDP1, default=false};
            __property bool ProtocolTCP2 =  {read=FProtocolTCP2, write=SetProtocolTCP2, default=false};
            __property bool ProtocolUDP2 =  {read=FProtocolUDP2, write=SetProtocolUDP2, default=false};
            __property bool Busy =  {read=FBusy, write=SetBusy, default=false};
            __property int CompressionValue =  {read=FCompressionValue, write=SetCompressionValue, default=9};
            __property TCompressionType CompressionType =  {read=FCompressionType, write=SetCompressionType, default=ctUncompressed};
            __property bool Crypted =  {read=FCrypted, write=SetCrypted, default=false};
            __property bool Compression =  {read=FCompression, write=SetCompression, default=false};
     
    };
    //******************************************************************************
    class PACKAGE TGestionUsers : public TComponent
    {
    private:
            TList *FUsersList;
            TNotifyEvent FOnUsersChange, FOnUsersAdd, FOnUsersDel, FOnClearUsersListChange;
     
    protected:
            virtual void __fastcall SetUsersList ( TList *AUsersList);
            virtual TList* __fastcall GetUsersList ();
            virtual TDataClient* __fastcall GetUsers ( int Index );
            virtual void __fastcall SetUsers (int Index, TDataClient *ADataClientList);
     
    public:
            __fastcall TGestionUsers(TComponent* Owner);
            virtual __fastcall ~TGestionUsers();
            virtual bool __fastcall AddUserToClientList (/*plein de paramètres*/);
            virtual void __fastcall DelUsers ( int Index );
            virtual void __fastcall DelUsersByNickName ( AnsiString ANickName );
            virtual void __fastcall DelUsersByRegisterTo ( AnsiString ARegisterTo );
            virtual void __fastcall DelUsersByIDSession ( AnsiString AIDSession);
            virtual void __fastcall ClearUsers ();
            virtual void __fastcall ModifyUserInClientList (/*plein de paramètres*/);
            virtual TDataClient* __fastcall RecupUserInClientList (int Index);
            virtual bool __fastcall LoadUsersListFromFile (AnsiString AFile);
            virtual bool __fastcall SaveUsersListToFile (AnsiString AFile);
            virtual void __fastcall ClearUsersList ();
     
    __published:
            __property TDataClient *UsersList[int Index] = {read=GetUsers, write=SetUsers};
            __property TNotifyEvent OnUsersChange =  {read=FOnUsersChange, write=FOnUsersChange};
            __property TNotifyEvent OnUsersAdd =  {read=FOnUsersAdd, write=FOnUsersAdd};
            __property TNotifyEvent OnUsersDel =  {read=FOnUsersDel, write=FOnUsersDel};
            __property TNotifyEvent OnClearUsersListChange =  {read=FOnClearUsersListChange, write=FOnClearUsersListChange};
     
    };
    FPrivateChat et FPrivateChatWith sont des listes d'une classe proche de TDataClient client mais en beaucoup plus simplifié.

Discussions similaires

  1. Problème avec un composant ComboBox
    Par florette dans le forum Composants VCL
    Réponses: 4
    Dernier message: 08/05/2006, 13h07
  2. Problème avec le composant JScrollPane
    Par vidocq dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 04/04/2006, 09h02
  3. problème avec le composant TSQLQuery
    Par vbcasimir dans le forum Bases de données
    Réponses: 6
    Dernier message: 31/05/2005, 16h45
  4. Problème avec le composant TXMLDocument
    Par kurul1 dans le forum C++Builder
    Réponses: 9
    Dernier message: 14/04/2005, 15h36
  5. Problème avec des composants non déclarés
    Par vbcasimir dans le forum Bases de données
    Réponses: 1
    Dernier message: 20/01/2005, 11h17

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