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

Delphi Discussion :

Création dynamique de Combobox : le contrôle '' n'a pas de fenêtre parente


Sujet :

Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut Création dynamique de Combobox : le contrôle '' n'a pas de fenêtre parente
    Bonjour,

    Je suis en train de créer un contrôle contenant (entre-autres) des Combobox.
    Seulement voilà, dans le constructeur de mon contrôle, j'ajoute des Items de cette facon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with MyComboBox do
    begin
     
       Items.Add( 'Kikoo' );
       Items.Add( 'Arf' );
       Items.Add( 'Erf' );
     
    end;
    Lorsque je drag'n drop mon cotrôle sur une fiche, j'obtiens alors un message d'erreur : " Le contrôle '' n'a pas de fenêtre parente ".
    Toutes les autres propriétés fonctionnent correctement.

    Le plus fou, c'est que si je compile mon controle sans ces lignes et que je crée un projet avec une fiche avec celui-ci posé dessus, ensuite je remodifie mon controle pour y ré-ajouter ces lignes, je relance mon appli et là tout marche parfaitement, les items sont bien ajoutés et visibles !

    Je ne comprends pas trop.

    Merci pour votre aide !

  2. #2
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Salut
    La raison est simple: si tu ajoutes ces Items, le contrôle a besoin de se redessiner et donc d'un parent...
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MyComboBox.Parent := ControleParent;
    Si ça ne marche toujours pas, cela veut dire qu'il te faut ajouter les Items après la création: par exemple quand le contrôle apparait pour la première fois

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    Oui j'ai bien affecté la propriété Parent.

    Celà signifie donc que je ne peux pas avoir une liste d'Items tout prêts dans un contrôle utilisateur ? C'est très ennuyeux Y-aurait-il une astuce ?

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par All Jinx
    Celà signifie donc que je ne peux pas avoir une liste d'Items tout prêts dans un contrôle utilisateur ?
    Bien sûr que si: tu as sa propriété Items que tu remplis: c'est une TStrings

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    En créant ma propre liste, je rencontre le même problème, voici mon code :

    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
     
     
    constructor grpslctJeux.Create;
    begin
     
      inHerited Create(owner);
      setBounds(8, 0, 489, 113);   // Taille du panel
      self.BevelOuter := bvNone;
     
      cbx_stylecourse := TCombobox.Create(self);
      with cbx_stylecourse do
      begin
        Parent := self;
        Left := 16 ;
        Top := 16 ;
        Width := 121 ;
        ItemHeight := 13 ;
        Style := csDropDownList ;
        Caption := 'Style de la course' ;
        Font.Height := -11 ;
        Font.Name := 'MS Sans Serif' ;
        ParentFont := False ;
        TabOrder := 0 ;
      end;
     
      glst_items := TStringList.Create ;
      glst_items.Append('test');
     
      cbx_stylecourse.Items :=  glst_items ; // C'est cette ligne qui provoque mon erreur lorsque je fait glisser mon controle sur une fiche :cry: 
     
    end;
    Je ne vois pas trop comment faire autrement.

  6. #6
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par All Jinx
    Je ne vois pas trop comment faire autrement.
    Mais non. Qand je te parle de la propriété Items, c'est celle que tu trouves dans l'éditeur de propriété
    Il n'y a aucun code à taper

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    Ah ok, mais bon si je dois les saisirs à la main dans l'éditeur de propriété à chaque fois que je crée une instance de mon contrôle sur une fiche, c'est pas du tout interessant
    Il doit forcément y a voir un moyen je pense

  8. #8
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par All Jinx
    Ah ok, mais bon si je dois les saisirs à la main dans l'éditeur de propriété à chaque fois que je crée une instance de mon contrôle sur une fiche, c'est pas du tout interessant
    Si la liste est la même, tu peux copier/coller les composants

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    C'est un composant redondant dans beaucoup d'applications

    ( Merci pour ton aide Pedro c'est sympa )

  10. #10
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    En regardant ton code, j'ai vu ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    setBounds(8, 0, 489, 113);   // Taille du panel
    Je ne sais pas si c'est bien règlementaire de spécifier la taille à la création
    Essaie de désactiver cette ligne pour voir
    en utilisant le bon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    with MyComboBox do
    begin
     
       Items.Add( 'Kikoo' );
       Items.Add( 'Arf' );
       Items.Add( 'Erf' );
    end;

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 59
    Points : 49
    Points
    49
    Par défaut
    Pas de problème avec setBounds apparament.

    Bon j'ai contourné le problème en utilisant une TFrame en classe parent, ca fera très bien l'affaire.

    Merci quand même

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

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Je sais c'est ancien mais dans
    cbx_stylecourse := TCombobox.Create(self);
    cbx_stylecourse.Parent:=self;

    self fait référence à : grpslctJeux
    or si grpslctJeux n'est pas un contrôle fenêtré tu auras l'erreur.

    Il faut que grpslctJeux descende d'un TWinControl (TForm, TPanel ...)
    et qu'à self lui-même tu lui donnes un parent aussi un contrôle fenêtré (souvent la form initiale).

    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
     
     
    type 
      grpslctJeux = class(TCustomPanel)
        cbx_stylecourse := TCombobox;
        constructor Create(AOwner: TComponent); override;
      end;
     
    constructor grpslctJeux.Create(AOwner: TComponent);
    begin
      inHerited;
      self.Parent:=TWinControl(AOwner);
      setBounds(8, 0, 489, 113);   // Taille du panel
      self.BevelOuter := bvNone;
     
      cbx_stylecourse := TCombobox.Create(self);
      with cbx_stylecourse do
      begin
        Parent := self;
        Left := 16 ;
        Top := 16 ;
        Width := 121 ;
        ItemHeight := 13 ;
        Style := csDropDownList ;
        Caption := 'Style de la course' ;
        Font.Height := -11 ;
        Font.Name := 'MS Sans Serif' ;
        ParentFont := False ;
        TabOrder := 0 ;
      end;
     
      glst_items := TStringList.Create ;
      glst_items.Append('test');
     
      cbx_stylecourse.Items :=  glst_items ; // C'est cette ligne qui provoque mon erreur lorsque je fait glisser mon controle sur une fiche :cry: 
     
    end;
    Le problème ne venait pas du ComboBox ni du strings, mais de ton composant lui-même : self.Parent:=TWinControl(AOwner).
    Cdlt

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

Discussions similaires

  1. Le contrôle n'a pas de fenêtre parente
    Par bossattac dans le forum Composants VCL
    Réponses: 1
    Dernier message: 06/06/2014, 17h21
  2. [XL-2010] Création dynamique de combobox -> j'en perds ma variable !
    Par Julien12 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 30/05/2012, 09h19
  3. Erreur création dynamique de contrôle
    Par thierrybatlle dans le forum Access
    Réponses: 1
    Dernier message: 10/02/2006, 11h00
  4. Réponses: 2
    Dernier message: 27/11/2005, 00h43
  5. Création dynamique de contrôles
    Par qi130 dans le forum Composants VCL
    Réponses: 5
    Dernier message: 17/12/2004, 13h19

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