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 :

Créer et initialiser un composant TStatusBar :help:


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 135
    Points : 66
    Points
    66
    Par défaut Créer et initialiser un composant TStatusBar :help:
    Bonjour,

    Je cherche à créer dynamiquement par ma Form1 une StatusBar dans une Form2.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
       StatusBar2 = new TStatusBar(this);
       StatusBar2->Parent = Form2;
       StatusBar2->SimplePanel = false;
    voici le début de mon code, j'ai des erreur dès que je lance mon application avec une violation d'accès....dans le module fichier.cpp (principal)
    J'ai mis également dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TStatusBar *StatusBar2;
    Je n'ai aucune erreur à la compilation.

    Merci
    ;-)

  2. #2
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Je viens d'essaye ton code et cela marche tres bien chez moi

    Ou as tu place ton code ? S'il est place dans la methode OnCreate() de la Form, il est possible qu'à moment la, le pointeur this ne soit pas encore affecté (j'ai place mon code derriere un bouton)...

    A ce moment la, il faut que tu deplace ton code...
    Quand j'entend ce que j'entend et que je vois ce que je vois, il est normal de penser ce que je pense !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 135
    Points : 66
    Points
    66
    Par défaut
    Le problème est que cette statusBar doit impérativement être crée à l'ouverture de la Form2 et le code concernant l'ouverture de la Form2 est placé dans l'événement CreateForm1.

    Mon soucis vient surtout du fait que ce message d'erreur (violation d'accès...) durant l'éxécution est créé lorsque j'accéde à ma StatusBar dans un événement de ma Form2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form1->StatusBar2->Panels->Items[0]->Text = "item 0";
    ;-)

  4. #4
    Membre à l'essai
    Inscrit en
    Mai 2002
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    C'est normal,
    tu n'as pas creer de panels dans ta nouvelle StatusBar...
    Il faut donc que tu creer un panels apres avoir creer la status bar
    Quand j'entend ce que j'entend et que je vois ce que je vois, il est normal de penser ce que je pense !

  5. #5
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    voici une solution
    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
     
    //le .h de ta form principale
    //---------------------------------------------------------------------------
     
    #ifndef Unit1H
    #define Unit1H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm1 : public TForm
    {
    __published:	// Composants gérés par l'EDI
            TButton *Button1;
            void __fastcall FormCreate(TObject *Sender);
            void __fastcall FormDestroy(TObject *Sender);
            void __fastcall Button1Click(TObject *Sender);
    private:	// Déclarations de l'utilisateur
    public:		// Déclarations de l'utilisateur
            __fastcall TForm1(TComponent* Owner);
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm1 *Form1;
    //---------------------------------------------------------------------------
    #endif
    //le .cpp de la FormPrincipale
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit1.h"
    #include "Unit2.h"
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
     
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
       Form2= new TForm2(NULL);
       Form2->MaStatusBar->Panels->Items[2]->Text="Création depuis la Form1";
     
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormDestroy(TObject *Sender)
    {
       delete  Form2;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
        Form2->ShowModal();
    }
    //---------------------------------------------------------------------------
     
    //le .h de la Form2
    //---------------------------------------------------------------------------
     
    #ifndef Unit2H
    #define Unit2H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <Controls.hpp>
    #include <StdCtrls.hpp>
    #include "Comctrls.hpp"
    #include <Forms.hpp>
    //---------------------------------------------------------------------------
    class TForm2 : public TForm
    {
    __published:	// Composants gérés par l'EDI
            void __fastcall FormDestroy(TObject *Sender);
    private:	// Déclarations de l'utilisateur
            TStatusBar *StatusBar2;
    public:		// Déclarations de l'utilisateur
            __fastcall TForm2(TComponent* Owner);
             __property TStatusBar* MaStatusBar = { read = StatusBar2 };
    };
    //---------------------------------------------------------------------------
    extern PACKAGE TForm2 *Form2;
    //---------------------------------------------------------------------------
    #endif
    le .cpp de la Form2
    //---------------------------------------------------------------------------
     
    #include <vcl.h>
    #pragma hdrstop
     
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm2 *Form2;
    //---------------------------------------------------------------------------
    __fastcall TForm2::TForm2(TComponent* Owner)
            : TForm(Owner)
    {
        StatusBar2= new TStatusBar(this);
        StatusBar2->Parent = this;
        StatusBar2->SimplePanel = false;
        StatusBar2->Panels->Add();
        StatusBar2->Panels->Add();
        StatusBar2->Panels->Add();
        StatusBar2->Panels->Items[0]->Width=220;
        StatusBar2->Panels->Items[1]->Width=50;
        StatusBar2->Panels->Items[2]->Width=150;
        StatusBar2->Panels->Items[0]->Text="Bienvenue dans la VCL";
        StatusBar2->Panels->Items[1]->Text="V 1.1";
    }
    //---------------------------------------------------------------------------
     
    void __fastcall TForm2::FormDestroy(TObject *Sender)
    {
        delete  StatusBar2;    
    }
    //---------------------------------------------------------------------------
    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 135
    Points : 66
    Points
    66
    Par défaut
    Merci mais ton code fonctionne?
    Parce que lorsque tu écris:
    Form2->MaStatusBar->Panels->Items[2]->Text="Création depuis la Form1";
    Form2 pointe sur MaStatusBar n'est pas StatusBar2?

    C'est juste pour comprendre car je ne vois pas où tu as déclaré MaStatusBar.
    ;-)

  7. #7
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut
    StatusBar2 est un champ privé de la classe TForm2
    il est par conséquent pas atteignable par Form1
    c'est la raison pour laquelle j'ai creé une Property MaStatusBar en lecture seule qui permet de travailler avec StatusBar2
    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 135
    Points : 66
    Points
    66
    Par défaut
    Réponse à DjmSoftware:
    Je n'ai pas encore essayé ton code DjmSoftware mais franchement, c'est ce que j'appelle du code bien écrit!!!
    On le sent, il y en a dans ta tête!!!
    Juste une remarque,
    1/-J'ai créé une fonction dans le .cpp de ma form principale.
    Elle utilise la StatusBar2. Comment et où dois-je la déclarer dans mon .h de ma form principale pour que cette fonction soit accéssible par toutes mes autres form créées dynamiquement?

    2/-Dans ton code tu crées dynamiquement la StatusBar2 dans l'événement de FormCreate de la Form2. Quelles sont les modifications à faire si je veux créer dynamiquement ma StatusBar2 dans l'événement OnCreate de ma FormPrincipal?

    J'avais pas pensé à tes delete dans les FormDestroy, faut-il le faire pour chaque Form?

    Comment savoir si une Form existe ou non? (si elle est créée afin de ne pas détruire quelque chose de non créer?)
    ;-)

  9. #9
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    merici pour tant d'éloges,
    pour répondre a ta question

    1/-J'ai créé une fonction dans le .cpp de ma form principale.
    Elle utilise la StatusBar2. Comment et où dois-je la déclarer dans mon .h de ma form principale pour que cette fonction soit accéssible par toutes mes autres form créées dynamiquement?
    ta fonction doiît être dans la partie publique de ta classe

    Dans ton code tu crées dynamiquement la StatusBar2 dans l'événement de FormCreate de la Form2. Quelles sont les modifications à faire si je veux créer dynamiquement ma StatusBar2 dans l'événement OnCreate de ma FormPrincipal?
    dans ce ta Form2 doit être crée statiquement par C++Builder
    le problème est que dans la Form principale tu ne sais pas si la form2 a déja été crée tu risque par conséquent des viiolations d'accès au moment de la création de la statusBar car le menbre <this> n'est peut être pas
    initialisé
    la solution que je t'ai proposé est meilleure tu dispose d'une property déclarée dans la partie publique permettant d'accéder a la status bar depuis n'importe quelle forme crée
    tu n'a même besoin de ta fonction
    simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Form2->MaStatusBar.....faitquelquechose
    J'avais pas pensé à tes delete dans les FormDestroy, faut-il le faire pour chaque Form?

    Comment savoir si une Form existe ou non? (si elle est créée afin de ne pas détruire quelque chose de non créer?)
    tu dois coder FormDestroy uniquement si tu a crée dynamiquement des
    objets
    cette méthode te permet de libérer la mémoire précédemment allouée

    pour tester si la Form Existe tu peux tester sa valeur qui doit être différente de NULL
    cette méthode fonctionnne uniquement si tu a initialisé les pointeurs a NULL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TForm2 *Form2=NULL;
    d'autre part quand tu détruis ton pointeur Form2 n'oubie pas de le réinitaliser à NULL

    PS: le code que j'ai posté fonctionne parfaitement

    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 135
    Points : 66
    Points
    66
    Par défaut
    Un grand merci à toi DjmSoftware, juste des dernières questions avant de cloturer ce sujet:
    Citation Envoyé par DjmSoftware
    le problème est que dans la Form principale tu ne sais pas si la form2 a déja été crée tu risque par conséquent des viiolations d'accès au moment de la création de la statusBar car le menbre <this> n'est peut être pas
    initialisé
    la solution que je t'ai proposé est meilleure tu dispose d'une property déclarée dans la partie publique permettant d'accéder a la status bar depuis n'importe quelle forme crée
    tu n'a même besoin de ta fonction
    Je crée ma Form2 juste avant ma StatusBar2 donc je ne dois pas avoir de problèmes!

    tu dois coder FormDestroy uniquement si tu a crée dynamiquement des
    objets
    cette méthode te permet de libérer la mémoire précédemment allouée
    Si mes Form créées dynamiquements ont le owner = Application et les objets owner = this, dois-je tout de même deleter dans cet événement? Puisque dès que je ferme mon application, en principe toutes mes créations dynamiques doivent être détruites proprement, j'écris celà parceque si je mets justement un delete Form2; par exemple, j'obtiens effectivement une erreur de violation mais sans celà toute mon application fonctionne!

    PS: le code que j'ai posté fonctionne parfaitement
    Je sais , j'espère avoir encore affaire à toi à l'avenir vu combien tes codes sont clairs!
    ;-)

  11. #11
    Membre chevronné
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de compte
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Points : 2 187
    Points
    2 187
    Billets dans le blog
    1
    Par défaut
    Salut,
    Si mes Form créées dynamiquements ont le owner = Application et les objets owner = this, dois-je tout de même deleter dans cet événement? Puisque dès que je ferme mon application, en principe toutes mes créations dynamiques doivent être détruites proprement, j'écris celà parceque si je mets justement un delete Form2; par exemple, j'obtiens effectivement une erreur de violation mais sans celà toute mon application fonctionne!
    si tu crée tes fiches avec comme Owner TApplication et les objects avec this
    en principe c'est le container qui se charge de la destruction

    personellement je ne fait pas trop confiance a ce genre de codage,
    je préfére mettre le paramètre NULL comme OWner et me charger de la destruction des forms que j'ai crée

    Cordialement
    vous trouverez mes tutoriels à l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les règles du forum

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

Discussions similaires

  1. [JSNI] Initialisation de composant JS
    Par MrDuChnok dans le forum GWT et Vaadin
    Réponses: 0
    Dernier message: 22/10/2010, 15h27
  2. Réponses: 2
    Dernier message: 08/03/2010, 14h25
  3. For each sur Composant ? Initialiser des composants.
    Par 19cmos83 dans le forum Interfaces Graphiques en Java
    Réponses: 8
    Dernier message: 11/10/2007, 11h02
  4. Créer un mail sans composants
    Par [Silk] dans le forum Composants VCL
    Réponses: 7
    Dernier message: 12/09/2005, 17h07
  5. Créer un événement à mon composant
    Par natie_49 dans le forum Composants VCL
    Réponses: 12
    Dernier message: 22/06/2005, 11h01

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