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

Composants VCL Delphi Discussion :

pb avec composant visuel créé dynamiquement


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Points : 91
    Points
    91
    Par défaut pb avec composant visuel créé dynamiquement
    Bonjour,

    J'utilise des composants dynamique que je voudrais stocker dans un tableau dynamique

    Par contre à la création d'un second composant j'ai un message de débordement de pile. 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
    var
      TabComponent  : array of TComponent
     
     for i:=0 to length(FLD_Label)-1 do
        begin
          Setlength(TabComponent, i+1);
     
         TabComponent[i] := TDBedit.Create(self);
         with TabComponent[i] do
         begin
           Name := FLD_Type[i]+inttostr(i);
           Parent := ScrollBox1;
           Left := Left_value;
           Top :=  Top_Value;
           Width := DBEdit_Code.Width;
         end;
     
        with TLabel.Create(self) do
        begin
          Name := 'Label'+inttostr(i);
          Parent := ScrollBox1;
          Left := Left_value;
          Top :=  Top_Value -15 ;
          Caption := FLD_Label[i]+' :';
        end;
    end;
    Merci de votre aide

    [edit]Balises de code ajoutées par Pascal Jankowski[/edit]

  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Pourquoi ne places-tu ton instruction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Setlength(TabComponent, i+1);
    dans ta boucle ?

    et si avant la boucle tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Setlength(TabComponent,length(FLD_Label));

    D'autre part si tu crées un tableau dynamique uniquement pour retrouver tes composants tu peux peut-être t'inspirer de ce post :

    Cordialement

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Points : 91
    Points
    91
    Par défaut
    En fait je veux surtout les supprimer à la fermeture de la form

  4. #4
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Tlabel et TDBEdit sont des descendants de TComponent , il suffit donc de transmettre au contructeur Create via la propriété Owner, le propriétaire du composant. Comme cela le propriétaire sera en charge de la libération de ses composants locataires.

    Partant de ce principe tu n'as pas besoin de les libérer toi-même cela se fera automatiquement dès destruction du composant propriétaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
         with TDBedit.Create(ScrollBox1) do
         begin
           Name := FLD_Type[i]+inttostr(i);
           Parent := ScrollBox1;
           ...
         end
    Dans ce cas c'est scrollBox1 (owner) qui libérera le TBEdit.

    Dans le cas des composants qui ne dérivent pas d'un TComponent alors là il faudra libérer soi-même les composants créés.

    Cordialement

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Points : 91
    Points
    91
    Par défaut
    Merci,

    Maintenant mon soucis est l'affectation de certaines propriétés (comme DATAFIELD et DATASOURCE) pour les TDBEdit et TDBMemo. Le composant le plus proche des 2 dans la hiérarchie des classes et TCUSTOMEDIT, mais il ne dispose de ces propriétés.

    Comme je cherche à faire une fonction générique pour leur création dynamique, je coince....

  6. #6
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Je ne comprends pas bien où est le problème.

    Soit plus explicite.

    Cordialement

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Points : 91
    Points
    91
    Par défaut
    Je voudrais crée mes composants avec la fonction suivante

    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
    var
      Component1 : TCComponent
    begin
      case AnsiIndexStr(UpperCase(FLD_Type), ['EDIT', 'MEMO', 'RADIOBUTTON', 'LABEL']) of
        0 : Component1 := TDBEdit.Create(self);
        1 : Component1 := TDBMemo.Create(self);
        2 : Component1 := TRadioButton.Create(self);
        3 : Component1 := TLabel.Create(self);
      end;
     
      with Component1 do
      begin
        Name := FLD_Type+inttostr(FLD_num);
        Parent := ScrollBox1;
        Left := Left_value;
        Top :=  Top_Value;
        if UpperCase(FLD_Type)='LABEL' then
        begin
          Caption := Caption_value;
        end;
        if UpperCase(FLD_Type) <> 'LABEL' then
        begin
          [b]DataField[/b] := 'FLD'+IntToStr(FLD_num+1);
          [b]DataSource[/b] := DataSource1;
          Width := Width_Value;
          FLD[FLD_num].Name_Zone := Name;
          FLD[FLD_num].Height_Zone := Height;
        end;
      end;
    Mais la compilation bloque sur le gras puique ces propriétés n'existent pas pour le TCOMPONENT

  8. #8
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Il faut "caster" dans ce cas précis :

    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
     
      case AnsiIndexStr(UpperCase(FLD_Type), ['EDIT', 'MEMO', 'RADIOBUTTON', 'LABEL']) of
        0 : Component1 := TDBEdit.Create(self);
        1 : Component1 := TDBMemo.Create(self);
        2 : Component1 := TRadioButton.Create(self);
        3 : Component1 := TLabel.Create(self);
      end; 
      //Transtypage ci-dessous
      if component1 is TDBEdit
        then with TDBEdit(component1) do
                begin
                   DataField := 'FLD'+IntToStr(FLD_num+1);
                   DataSource := DataSource1;
                end
       else
      if component1 is TDBMemo
        with TDBMemo(component1) do
                begin
                   DataField := 'FLD'+IntToStr(FLD_num+1);
                   DataSource := DataSource1;
                end;
      //fin de transtypage
      With component1 do .....
    Cordialement

  9. #9
    Expert éminent sénior

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Points : 19 104
    Points
    19 104

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 287
    Points : 91
    Points
    91
    Par défaut
    merci

Discussions similaires

  1. Problème avec composant PicButton en création dynamique
    Par KlausGunther dans le forum Composants VCL
    Réponses: 12
    Dernier message: 03/01/2015, 12h32
  2. Création et destruction dynamique de composants visuels
    Par Dr.Gang dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/10/2009, 17h19
  3. Réponses: 2
    Dernier message: 19/09/2008, 18h15
  4. [Creation composant visuel] Problème avec le focus
    Par Ingham dans le forum Composants VCL
    Réponses: 9
    Dernier message: 23/09/2004, 16h59
  5. Réponses: 7
    Dernier message: 08/08/2003, 18h09

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