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

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    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
    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:
    Je n'ai aucune erreur � la compilation.

    Merci

  2. #2
    Membre averti
    Inscrit en
    Mai 2002
    Messages
    18
    D�tails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 18
    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...

  3. #3
    Membre confirm�
    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
    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 averti
    Inscrit en
    Mai 2002
    Messages
    18
    D�tails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 18
    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

  5. #5
    Membre Expert
    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
    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 confirm�
    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
    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 Expert
    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
    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 confirm�
    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
    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 Expert
    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
    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

    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 confirm�
    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
    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 Expert
    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
    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