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éer par programme un TEdit...


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Créer par programme un TEdit...
    Bonjour,

    je suis débutante en Delphi et je galère !

    En fait, j'ai une liste, et je dois la décomposer pour mettre chaque élément de la liste dans une ligne d'une ScrollBox. Puis chaque élément doit être décomposé dans un TEdit, puis un Combobox puis la dernière partie dans un TEdit, tout celà devant être contenu dans la ScrollBox.
    Je sais pas si c'est très clair !


    Le problème en fait est que je ne sais pas comment créer par programme un Edit ou un ComboBox ou un Scrollbox.

    Si quelqu'un peut m'aider, je vous remercie d'avance !
    Camille

  2. #2
    En attente de confirmation mail Avatar de Matt2094
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    295
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 295
    Points : 237
    Points
    237
    Par défaut
    Si j'ai bien compris, ton problème est de créer des composants pendant l'éxécution de ton programme. Pour cela, cherche dans la F.A.Q du côté de la création dynamique de composants.

  3. #3
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Bonjour et bienvenue sur le forum de Developpez.com
    D'une façon générale, il suffir de créer l'objet à l'aide de la focntion "create" (voir l'aide en ligne pour plus de détail sur sa syntaxe)
    des exemples génériques... (en supposant qu'on les pose sur une fiche "form1" et qu'on décide que cette "form1" sera responsable de leur destruction
    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
     
    procedure CreerdesObjets;
    var
    unEdit:Tedit;
    UneCombo:Tcombobox;
    UneListe:Tlist;
    begin
    UnEdit:=Tedit.create(Form1);
    UneCombo:=TCombobox.create(Form1);
    UneList:=Tlist.create(self)
    with UneList do
    begin
    ...
    Des instructions de traitements
    end;
    Unelist.free; // on libére la mémoire puisqu'on a pas dédié cette opération à un autre composant (form1, en l'occurence)
    end;
    Voilà un petit début.. le reste se trouve dans l'aide, les tutos, les sources et la faq
    Bon dev
    Cordialement,
    Hauwke

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Merci beaucoup
    Merci pour votre aide. J'ai plus le temps de regarder ça aujourd'hui mais dès demain je regarderai si ça marche.

    Merci encore, je pensais pas obtenir une réponse aussi vite !

    Restez pas loin, je vais surement avoir encore besoin de vous !!!!

    Cam

  5. #5
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 902
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 902
    Points : 6 026
    Points
    6 026
    Par défaut
    Citation Envoyé par Douine
    dès demain je regarderai si ça marche.
    Ca je n'en doute pas

    Cependant, les instructions et le code fournis constituent des pistes et des orientations qu'il faudra nécessairement adapter à ton besoin: en vrac
    • le parent des composants crées
    • le positionnement dans la scrollbox
    • l'écartement des "lignes" de composants créés
    • ...

    Aussi, ne te décourage pas...
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Pour compléter, tu devras d'abord boucler sur ta liste. Pour chaque élément, créer un TComboBox et un TEdit. Tu dois leur affecter une position grâce à Left, Top, Width et Height, ainsi que le ScrollBox1 en tant que Parent :
    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
    procedure RemplirScrollBox(ScrollBox : TScrollBox; Liste : array of TElement);
    var I : integer;
    begin
      // D'abord il faut supprimer tous les contrôles qui existaient auparavent dans la scrollbox
      while ScrollBox.ControlCount > 0 do
        ScrollBox.Controls[0].Free;
    
      // Ensuite on boucle sur la liste
      for I := Low(Liste) to High(Liste) do
      begin
        // On crée la combo box
        with TComboBox.Create(ScrollBox) do
        begin
          Parent := ScrollBox;
          Left := 16;
          Top := 18 + 24*I;
          Width := 16;
          Height := 16;
          Checked := Liste[I].ValeurBooleenne;
          Visible := True;
        end;
        // On crée l'edit
        with TEdit.Create(ScrollBox) do
        begin
          Parent := ScrollBox;
          Left := 40;
          Top := 16 + 24*I;
          Width := ScrollBox.Width-56; // la largeur restante
          Text := Liste[I].ValeurChaine;
          Visible := True;
        end;
      end;
    end;
    Il ne te reste plus qu'à adapter TElement, ValeurBooleenne et ValeurChaine aux types réels de ta liste, et puis appeler cette routine avec en paramètres la scroll box et la liste

    Bon dev'
    Sébastien
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Ca Marche !!!!
    Merci beaucoup à tous !

    Ca marche, c'est trop bien !!!


    Mais c'est pas fini encore... Y'a encore du boulot, alors vous risquez de me revoir bientôt !!!

    A+,
    Camille

  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
    Reviens nous voir quand tu veux, sache que nous t'accueillerons toujours avec un très grand plaisir.

    Cordialement
    L'équipe de modération de Delphi
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Toujours à propos de ma combobox !
    Citation Envoyé par sjrd
    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
    procedure RemplirScrollBox(ScrollBox : TScrollBox; Liste : array of TElement);
    var I : integer;
    begin
      // D'abord il faut supprimer tous les contrôles qui existaient auparavent dans la scrollbox
      while ScrollBox.ControlCount > 0 do
        ScrollBox.Controls[0].Free;
    
      // Ensuite on boucle sur la liste
      for I := Low(Liste) to High(Liste) do
      begin
        // On crée la combo box
        with TComboBox.Create(ScrollBox) do
        begin
          Parent := ScrollBox;
          Left := 16;
          Top := 18 + 24*I;
          Width := 16;
          Height := 16;
          Checked := Liste[i].ValeurBooleenne;
          Visible := True;
        end;
        // On crée l'edit
        with TEdit.Create(ScrollBox) do
        begin
          Parent := ScrollBox;
          Left := 40;
          Top := 16 + 24*I;
          Width := ScrollBox.Width-56; // la largeur restante
          Text := Liste[i].ValeurChaine;
          Visible := True;
        end;
      end;
    end;
    Re-salut !

    merci pour ton message, ça marche nickel !

    Je voudrais maintenant ajouter une propriété dans la combobox pour que si l'utilisateur clique sur un choix particulier de la combo (par exemple, j'ai une liste du style : =, <>, := ... et qu'il choisit 'parmi' ) ça affiche une nouvelle boite TEdit. (ça je sais faire maintenant )

    Est-ce que je peux rajouter dans le code au-dessus un truc du genre : OnChange do (if (Text = 'parmi') then edit2 := ' '); ?

    Bon en fait, je sais que je peux pas puisque ça marche pas, mais est-ce que j'y suis presque ou est-ce que c'est pas du tout comme ça qu'il faut faire ???

    Voilà, encore un de mes nombreux soucis !
    Merci beaucoup de vos réponses et de votre patience avec moi !!!!

    Camille

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Bonjour Camille.

    J'anticipe un peu sur la prochaine étape, à savoir "Comment récuperer les instances des composants
    dynamiques afin de les manipuler?"

    On reprend le code de SJRD (à 1 ou 2 modif près):

    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
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, Buttons;
    
    type
      TForm1 = class(TForm)
        ScrollBox1       : TScrollBox;
        BtnManipuler     : TButton;
        BtnCreer         : TButton;
        procedure FormCreate(Sender: TObject);
        procedure BtnManipulerClick(Sender: TObject);
        procedure BtnCreerClick(Sender: TObject);
      private
      public
      end;
    
    TElement = record
      Id: byte;           { $01: ComboBox; $02: Edit }
      Name: string;
      ValeurChaine: string;
    end;
    
    TListElem = array of TElement;
    
    var
      Form1: TForm1;
      Liste: TListElem ;
    implementation
    
    {$R *.DFM}
    procedure CreerListeElmt(var Liste: TListElem);
    begin
      SetLength(Liste, sizeof(TElement)*4);
      
      { Tcombobox 1 }
      Liste[1].Id := $01;
      Liste[1].Name := LowerCase('combo1');
      Liste[1].ValeurChaine := '';
      
      { Tedit 1 }
      Liste[2].Id := $02;
      Liste[2].Name := LowerCase('edt1');
      Liste[2].ValeurChaine := '';
      
      { Tedit 2 }
      Liste[3].Id := $02;
      Liste[3].Name := LowerCase('edt2');
      Liste[3].ValeurChaine := '';
      
      { Tcombobox 2 }
      Liste[4].Id := $01;
      Liste[4].Name := LowerCase('combo2');
      Liste[4].ValeurChaine := '';
    end;
    
    procedure RemplirScrollBox(ScrollBox: TScrollBox; Liste: array of TElement);
    var
      I : integer;
      CountCB, CountEDT: byte; { compteurs de composants: gère le positionnement vertical }
    begin
      CountCB := 0;
      CountEDT := 0;
    
      while ScrollBox.ControlCount > 0 do
        ScrollBox.Controls[0].Free;
    
      for I := Low(Liste) to High(Liste) do
      begin
        Case Liste[i].Id of
          $01:                                     
          begin
            with TComboBox.Create(ScrollBox) do
            begin
              Parent := ScrollBox;
              Left := 10;
              Top := 10 + 24*CountCB;
              Width := 200;
              Height := 16;
              Name := Liste[i].Name;
              Items.Add(Liste[i].ValeurChaine);
              Visible := True;
              Inc(CountCB);
            end;
          end;
          $02:
          begin
            with TEdit.Create(ScrollBox) do
            begin
              Parent := ScrollBox;
              Left := 220;
              Top := 10 + 24*CountEDT;
              Width := ScrollBox.Width-230; // la largeur restante
              Name := Liste[i].Name;
              Text := Liste[i].ValeurChaine;
              Visible := True;
              Inc(CountEDT);
            end;
          end;
          else
        end;
      end;
    end;
    
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      CreerListeElmt(Liste);
    end;
    
    procedure TForm1.BtnCreerClick(Sender: TObject);
    begin
      RemplirScrollBox(Form1.ScrollBox1, Liste);
    end;
    
    procedure TForm1.BtnManipulerClick(Sender: TObject);
    var
      i: integer;
    begin
     
      { récupère le 1er combobox }
      with scrollBox1 do
      begin
       for i:= ComponentCount-1 downto 0 do
         if ((Components[i] is TComboBox) and (TComboBox(Components[i]).Name = LowerCase('combo1'))) then
           with Components[i] as TComboBox do
             ItemIndex := Items.Add('Le texte de combo1');
      end;
     
      { récupère le 2ème edit }
      with scrollBox1 do
      begin
       for i:= ComponentCount-1 downto 0 do
         if ((Components[i] is TEdit) and (TEdit(Components[i]).Name = LowerCase('edt2'))) then
           with Components[i] as TEdit do
             Text := 'Le texte de edt2';
      end;
    end;
    
    end.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Ca môrche pô
    J'ai essayé d'adapter ce que tu m'as donné, mais j'y suis pas arrivée.


    En fait, j'arrive pas à faire que les combobox que j'ai créées aient une procédure OnChange.
    Parce qu'il faut utiliser leur nom, et moi je sais pas quel nom elles ont. Et puis je vais pas créer une procédure par combobox, je voudrais qu'elles utilisent toutes la même !

    Enfin bref, là je vais aller manger et me vider le cerveau et je m'y remets cette aprèm.

    En tout cas, merci pour le code que tu m'as écrit, je l'ai bien utilisé !!


    Merci !
    Camille

  12. #12
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Salut ,

    - Imagines que tu aies trois TComboBox.
    -
    Imagines que ce que les évènements que tu vois dans ton éditeur d'objet (OnCreate, OnClick, OnChange, etc...), ne sont en fait que de simples propriétés (de bêtes variables), dans lesquelles tu stockes un type de variable particulières qu'on appelle variable procédurale (une procédure en fait).

    - De là, va faire un tour sur mon post ici :
    http://www.developpez.net/forums/sho...d.php?t=150023 (post numéro 2)
    - Et sur celui là : http://www.developpez.net/forums/sho...3&postcount=10

    A partir de là tu regardes dans l'aide delphi quel genre de procédure attend un TComboBox.OnChange --> réponse : un TNotifyEvent.
    Là, tu suis le lien TNotifyEvent de ton fichier d'aide et tu vois :
    TNotifyEvent =procedure(Sender:TObject) of object;
    Tu en déduis que tu peux mettre dans ta variable n'importe qu'elle procédure (appartenant à une classe à cause du "of object") ayant ceci comme paramètres : (Sender:TObject)

    Bref tu en déclare une dans la classe de ta fiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TForm1 = class(TForm)    
      private
        { Déclarations privées }
        procedure TaProcedure(Sender:TObject);
      public
        { Déclarations publiques }    
      end;
    et dans la partie implementation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.TaProcedure(Sender: TObject);
    begin
     
    end;
    Ensuite tu affecte tes "variables" au moment du OnCreate de ta fiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ComboBox1.OnChange:=TaProcedure;
      ComboBox2.OnChange:=TaProcedure;
      ComboBox3.OnChange:=TaProcedure;
    end;
    Maintenant que tu as compris, on va simplifier
    Dans un projet tout neuf (une fiche) :
    - Tu places 2 ComboBox
    - Tu va dans ton inspecteur d'objet, onglet évènement de l'une de tes Combobox, sur OnChange tu cliques deux fois.
    --> Delphi te crée automatiquement une procédure ad'hoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.ComboBox1Change(Sender: TObject);
    begin
     
    end;
    --> tu peux changer son nom dans l'inspecteur d'objet
    --> pour ta deuxième Combobox, tu peux lui indiquer la même procédure que pour la première

    Suite à ceci, c'est Delphi qui fera pour toi ce qu'on a vu plus haut, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ComboBox1.OnChange:=ComboBox1Change;
      ComboBox2.OnChange:=ComboBox1Change;
      ComboBox3.OnChange:=ComboBox1Change;
    ...
    end;
    Sauf que tu ne le vois pas , parce que c'est géré dans le code de la classe TForm, et effectué grace aux informations que Delphi à stocké dans son fichier .dfm (clic droit sur ta fiche-->voir comme texte) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ...
    object ComboBox1: TComboBox
        Left = 224
        Top = 208
        Width = 145
        Height = 21
        ItemHeight = 13
        TabOrder = 3
        Text = 'ComboBox1'
        OnChange = ComboBox1Change
      end
    ...
    J'espère qu'en plus de répondre à ta question, celà pourra te servir.

    Bidouilleuse Delphi

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    En fait, j'arrive pas à faire que les combobox que j'ai créées aient une procédure OnChange.
    Parce qu'il faut utiliser leur nom, et moi je sais pas quel nom elles ont.
    Regardes à nouveau mon code.
    Dans TElement on stoque le nom des composants dans la variable Name.
    Celle ci est initialisée dans la procedure CreerListeElmt(var Liste: TListElem);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Liste[1].Name := LowerCase('combo1');
    Cette variable est exploitée dans la procédure TForm1.BtnManipulerClick(Sender: TObject); afin de récupèrer le composant par son nom.

    A ce stade et suivant les recommandations de Waskol, tu peux attribuer un évenement pour chacun des composants.

    ---------------
    pour waskol: il est bien gratiné le défi .

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Toujours moi... mais j'avance !!
    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
     
    procedure TFicheGenerationExercices.ComboBoxCDChange(Sender: TObject);
    var i:integer;
    //marge_haut:integer; // marge au dessus du edit 2
    begin
      with ScrollBoxDC do
       for i:= ComponentCount-1 downto 0 do
         if ((Components[i] is TComboBox) and (TComboBox(Components[i]).Text = 'parmi')) then
         begin
            // On crée l'edit 2
                with TEdit.Create(ScrollBoxDC) do
                begin
                     Parent := ScrollBoxDC;
                     Left := 255;
                     Top := 16 + TComboBox(Components[i]).Top;
                     Width := 130;
                     Text := '(...,...,...)';
                     Visible := True;
                end;
          end
    end;
    Voilà ma procédure, qui est lancé chaque fois qu'on sélectionne 'parmi' dans mes combobox !
    Donc ça marche, c'est génial.

    Juste un truc : j'ai voulu faire que le 2ème edit (edit2) ne se crée que lorsqu'on sélectionne 'parmi' dans la combo.
    Mais le code ci dessus me donne une erreur : en fait, il a pas l'air de connaitre le i dans la ligne : Top := TComboBox(Components[i]).Top;
    L'erreur est : "index de liste hors limite".

    Keske je peux faire ????


    Encore merci pour vos réponses, c'est génial de voir à quel point vous êtes rapides et efficaces !!

    Camille

  15. #15
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 80
    Points : 197
    Points
    197
    Par défaut
    Essaie de récupérer la valeur du TComboBox(Component[i]).Top avant de faire ton Create, pour voir ?
    Tu es dans la création d'un composant de ton ScrollBoxDC, alors je ne sais pas si ton Component[i] est toujours affecté...
    "Always code as if the person who ends up maintaining your code is a violent psychopath who knows where you live." (Code for the Maintainer)
    I usually maintain my own code, so the as-if is true!

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Merci bien !
    Merci bien, ça a marché.
    C'était vraiment tout bête en fait !

    A une prochaine,
    Camille

  17. #17
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Re,

    A la place de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    with ScrollBoxDC do
    for i:= ComponentCount-1 downto 0 do
    Je mettrais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    with ScrollBoxDC do
    if ComponentCount>0 then
        for i:= ComponentCount-1 downto 0 do
    sinon, effectivement...

    (c'est surement ça)
    Bidouilleuse Delphi

  18. #18
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    @Waskol : cela n'a aucune incidence. Le Pascal gère très bien les boucles for qui ne doivent pas s'exécuter une seule fois.

    Dans la mesure où tes combobox doivent contenir uniquement une des valeurs proposées dans Items (et pas autre chose), tu devrais utiliser le style csDropDownList (propriété Style), et utiliser la propriété ItemIndex au lieu de Text.
    Cela empêchera l'utilisateur de saisir une valeur qui corromprait tes calculs.

    Sinon, histoire d'optimiser un peu (beaucoup) le 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
    procedure TFicheGenerationExercices.ComboBoxCDChange(Sender: TObject);
    var ComboBox : TComboBox;
    begin
      assert(Sender is TComboBox); // juste au cas où
      ComboBox := TComboBox(Sender);
      if ComboBox.ItemIndex = ITEM_PARMI then with TEdit.Create(ScrollBoxDC) do
      begin
        Parent := ScrollBoxDC;
        Left := 255;
        Top := 16 + ComboBox.Top;
        Width := 130;
        Text := '(...,...,...)';
        Visible := True;
      end;
    end;
    Cela permet de n'exécuter le traitement que pour la combo box qui vient d'être changée

    Ceci dit, il vaudrait encore mieux créer l'edit en même temps que la combo et que l'autre edit, mais placer sa propriété Visible à False. Puis ne plus jouer que sur la propriété Visible pour l'afficher/le cacher.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  19. #19
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par sjrd
    @Waskol : cela n'a aucune incidence. Le Pascal gère très bien les boucles for qui ne doivent pas s'exécuter une seule fois.
    Je ne savais pas du tout !
    Comme quoi on en apprend tous les jours
    Bidouilleuse Delphi

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Points : 754
    Points
    754
    Par défaut
    Retour sur le bug de Camille:

    Rappel:
    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
    procedure TFicheGenerationExercices.ComboBoxCDChange(Sender: TObject);
    var i:integer;
    //marge_haut:integer; // marge au dessus du edit 2
    begin
      with ScrollBoxDC do
       for i:= ComponentCount-1 downto 0 do
         if ((Components[i] is TComboBox) and (TComboBox(Components[i]).Text = 'parmi')) then
         begin
            // On crée l'edit 2
                with TEdit.Create(ScrollBoxDC) do
                begin
                     Parent := ScrollBoxDC;
                     Left := 255;
                     Top := 16 + TComboBox(Components[i]).Top;
                      Width := 130;
                     Text := '(...,...,...)';
                     Visible := True;
                end;
          end
    end;
    La ligne incriminée est celle ci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Top := 16 + TComboBox(Components[i]).Top;
    Etant inclus dans l'instruction With TEdit, Components référence la liste de composants du TEdit donc ComponentCount =0!
    Il fallait écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Top := 16 + TComboBox(ScrollBoxDC.Components[i]).Top;
    Remarque:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     with TEdit.Create(ScrollBoxDC) do
                begin
                ShowMessage(IntToStr(ScrollBoxDC.ComponentCount));
    ComponentCount est incrémenté d'une unité puisque désormais la ScrollBox contient un nouveau composant.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Comment créer plusieurs TEdit par programmation?
    Par rebelor dans le forum Delphi
    Réponses: 2
    Dernier message: 02/06/2007, 17h30
  2. créer un champ paradox par programme
    Par ouldfella dans le forum Bases de données
    Réponses: 1
    Dernier message: 19/04/2006, 13h31
  3. création de plusieurs TEdit par programmation
    Par faten7 dans le forum C++Builder
    Réponses: 4
    Dernier message: 15/04/2006, 21h22
  4. [Interbase]Comment créer une source ODBC par programme ?
    Par touhami dans le forum Bases de données
    Réponses: 1
    Dernier message: 13/03/2006, 16h40
  5. Comment créer un nouveau dossier par programmation ?
    Par annecyrond dans le forum Langage
    Réponses: 3
    Dernier message: 27/03/2003, 07h59

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