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 :

Parent d'un composant


Sujet :

C++Builder

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 57
    Points : 37
    Points
    37
    Par défaut Parent d'un composant
    Bonjour à tous !

    J'ai créé un composant héritant de TWinControl. Je l'ai construit et installé, il fonctionne très bien, je peux sans problème le placer sur une form.

    Le problème est que si dans le code de ce composant, j'essaye d'appeler this->Parent, et que je lance un exécutable où ce composant est placé dans une form, ce this->Parent me renvoie directement l'écran et non la form.

    J'avoue que je ne comprend pas trop ce comportement ... en plaçant le composant dans une form, son parent ne devrait-il pas être automatiquement la form elle même ? Si je redimenssionne la form, le composant bouge bien avec elle, comme si c'était son parent.

    En résumé, j'ai un code qui ressemble à :

    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
     
    __fastcall TWeekCalendar::TWeekCalendar(TComponent* Owner)
       : TWinControl(Owner)
    {
     
    //initialisation, création dynamique d'un Edit ed_Edit1
    (...)
    }
     
    __fastcall TWeekCalendar::UneFonctionPerso()
    {
     
       ed_Edit1->Parent = this->Parent;
         ed_Edit1->Left = this->Left;
          ed_Edit1->Top = this->Top;
    (...)
    }
    et lorsque je test this->Left alors que le TWeekCalendar est placé dans une form, on me renvoie this->ClientOrigin.x, comme si la form n'existait pas.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Je sens que je n'étais pas clair du tout :p !

    C'est difficile à comprendre, donc difficile à expliquer ...

    C'est un peu comme si le composant n'avait pas d'autre parent que l'écran lui même, alors que je viens de le placer sur une form.

  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
    J'm'y connais pas des masses mais le fait qu'il soit placé sur une form ne fait-il pas que sa propriété Owner est la form, et non pas son parent ?

  4. #4
    Rédacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Points : 1 271
    Points
    1 271
    Par défaut
    Normallement, les deux sont positionnés...
    Ce comportement est bizarre.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    Possible, mais comment lui fixer la propriété Parent d'un composant puisque par définition, la classe du composant ne contient que le composant lui même ...

    Ceci dit, j'apporte une précision à mon problème : je cherche à placer une form au dessus de la form Parent du composant, je met donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //dans le constructeur du composant
     
    f_Form1 = new TForm (this);
    f_Form1->Parent = this->Parent;
    f_Form1->BorderStyle = bsNone;
     
    //lorsque cette form doit s'afficher sur la fenêtre, c'est à dire dans     
    //ce cas précis OnClick sur le composant :
     
    f_Form1->Left = this->Left;
    f_Form1->Top = this->Top + this->Height;
    f_Form1->Visible = true;
    Le résultat est le suivant : la fenêtre s'affiche hors de la Form qui contient le composant (le composant étant un Edit, appelé ici par this), comme si son parent était l'écran lui même (En gros, si mon composant avait les coordonnées {10,10} dans sa form parente avec une hauteur de 10, ma form dynamique sera placée en {10,20}, mais sur l'écran)

    Un début de solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //dans le constructeur du composant
     
    f_Form1 = new TForm (this);
    f_Form1->BorderStyle = bsNone;
     
    //lorsque cette form doit s'afficher sur la fenêtre, c'est à dire dans     
    //ce cas précis OnClick sur le composant :
     
    f_Form1->Parent = this->Parent;
    f_Form1->Left = this->Left;
    f_Form1->Top = this->Top + this->Height;
    f_Form1->Visible = true;
    Là, le comportement est plus logique : la fenêtre créée dynamiquement (f_Form1) est "collé dans" la form principal (this->Parent).
    En fait, j'ai remarqué que le constructeur d'un composant est appelé au moment du placement de ce composant sur une form (ou autre chose). Et que par conséquent, la notion de Parent est souvent faussée. Je place donc son Parent uniquement lorsque je suis sur qu'il existe et que j'en ai besoin.

    C'est donc la réponse à ma question, simplement je me rends compte que je voudrais plutot que cette form dynamique soit au dessus de la fenêtre principal, toujours visible.



    Merci de votre écoute, je met à résolu, et désolé pour le charabia

  6. #6
    Membre chevronné

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 375
    Points : 1 760
    Points
    1 760
    Par défaut
    Salut !

    soit au dessus de la fenêtre principal, toujours visible.
    Dans ce cas,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TForm *F = new TForm(Owner); //normalement Owner est Application
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    F->FormStyle = fsStayOnTop; // F n'a pas besoin de parent !
    A plus !

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 57
    Points : 37
    Points
    37
    Par défaut
    C'est fait, merci ! Reste plus qu'a la refermer lorsqu'elle perd le focus, sauf si elle le perd pour le bouton de fermeture/ouverture, auquel cas c'est le OnClick de ce bouton qui doit le gérer (sinon, je ferme la fenêtre une première fois OnDeactivate de celle ci, le bouton de fermeture/ouverture ne voit pas la fenêtre et l'ouvre aussitot ...)

    Du coup j'ai (appelé dans OnDeactivate de la fenêtre crée dynamiquement mais aussi OnClick du bouton de fermeture) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
       if (f_Form1->Visible == true)
       {
     
          if (!bt_DropDownButton->Focused()) 
          {
             f_Form1->Visible = false;
          }
     
       }
    Le problème c'est que ça ne fonctionne pas : "E2122 L'appel de fonction s'est terminée par une exception non gérée 0xc0000005 à l'adresse 0x37a6" dans l'évaluateur d'objet (Peut être parce qu'en passant sur l'évaluateur, tester le focus n'a plus de sens ?), et Focused() me renvoie toujours false (alors que j'appelle ce bout de code dans le OnClick du bouton).

    Je vais arrêter de vous ennuyer et chercher un peu, mais comme l'enchainement se fait bien j'en profite !

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

Discussions similaires

  1. Changer le parent d'un composant
    Par attwad dans le forum wxPython
    Réponses: 4
    Dernier message: 11/12/2008, 07h21
  2. Forcer un parent pour un composant
    Par romaintaz dans le forum JSF
    Réponses: 9
    Dernier message: 24/12/2007, 10h59
  3. parent/owner et composants créés dynamiquement
    Par OutOfRange dans le forum Delphi
    Réponses: 2
    Dernier message: 26/09/2006, 15h46
  4. Composant perso disparaît lors du redimensionnement du composant parent
    Par GENERYS dans le forum Agents de placement/Fenêtres
    Réponses: 5
    Dernier message: 05/10/2005, 22h07
  5. Composant TImage sur fenêtre MDI Parent
    Par charles.apollon dans le forum C++Builder
    Réponses: 6
    Dernier message: 10/02/2005, 15h47

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