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

Lazarus Pascal Discussion :

Valeur d'un contrôle créé dynamiquement [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Valeur d'un contrôle créé dynamiquement
    Bonjour,
    Après quelques heures de recherches, je n'arrive pas à mes fins.
    Je cherche à récupérer les valeurs d'un nombre variable de TSpinEdit créés dynamiquement.

    Voici le code de la création des TSpinEdit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure Affichage;
    var
      i, j : integer;
      Sedit : TSpinEdit;  
    For i:=1 To FormAjout.DBGrid1.datasource.dataset.RecordCount do
    begin
      Sedit := TSpinEdit.Create(FormAjout);
      Sedit.Name := 'SpinEdit_'+ IntToStr(i);
      Sedit.Parent := FormAjout;
    [...]
      Sedit.Value := 0;
    end;
    Une de mes tentatives pour récupérer ces valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var i, spin : integer;
     
    begin
         For i:=0 To FormAjout.ComponentCount do
             begin
                  if FormAjout.Components[i] is TSpinEdit then
                       spin := FormAjout.Components[i].Value;
             end;
    Me retourne une erreur "Error: identifier idents no member "Value""

    Si quelqu'un a une méthode ou un explication pour moi... !

    Lazarus en version 1.6.4

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Hello,

    Sans avoir testé, je pense qu'il faut faire un transtypage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    spin := TSpinEdit(FormAjout.Components[i]).Value;
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Cela fonctionne, génial, un grand merci M.Dlb !
    Tu as plus d'explications sur cela ? J'avoue que je ne comprends pas tout sur ce point...

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut,
    Citation Envoyé par cartebleue Voir le message
    Tu as plus d'explications sur cela ? J'avoue que je ne comprends pas tout sur ce point...
    Citation Envoyé par cartebleue Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      spin := FormAjout.Components[i].Value;
    Me retourne une erreur "Error: identifier idents no member "Value""
    Au moment de la compilation, le compilateur ne sait pas de quel composant il s'agit.
    Certains n'ayant pas de membre value, il ne prend pas de risque et te renvoie dans les cordes pour y revoir ta copie.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    if FormAjout.Components[i] is TSpinEdit : is teste l'identité de type de l'objet (au sens de descendant de TObject) au type à comparer (l'objet testé est-il compatible avec le type proposé, cad en est-il un ou un de ses descendants).
    Pour autant, FormAjout.Components[i] est une référence dans un tableau typé, renvoyée en tant qu'objet du type TComponent.
    Le compilateur ne peut donc résoudre sa propriété Value, qui n'existe qu'en tant que TSpinEdit, descendant du type TComponent.
    Il est donc nécessaire de demander au compilateur de considérer l'objet comme de tel ou tel type, comme l'a écrit M.Dlb.
    Une autre syntaxe serait : with FormAjout.Components[i] as TSpinEdit do Value := i;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci à tous, très intéressantes remarques !

  7. #7
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Duplicate name
    Salut !

    Pour faire suite au code publié sur le premier post, j'ai quelques interrogations supplémentaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sedit := TSpinEdit.Create(FormAjout);
    D'après ce que j'ai compris, le propriétaire de cet objet est bien "FormAjout". Donc après l'action FormAjout.Close; je devrais pouvoir rouvrir le form et créer de nouveau ces objets ?

    Malheureusement, je tombe sur une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Duplicate name: a component named Spinedit_1 already exists
    Une piste pour moi ?

  8. #8
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut

    FormAjout.Close ferme ta fenêtre mais ne l'a détruit pas
    Il ne faut donc pas oublié également de "libérer" ton objet "SpinEdit_1" si tu veux le réassigner ailleur.

    Sinon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      FormAjout := TForm.Create(nil) // ici je ne me rappel plus mais de mémoire je crois qu'il faut plutôt utiliser "CreateNew" je ne sais plus trop pourquoi par contre :(
      SpinEdit_1 := TSpinEdit.Create(FormAjout);
      With SpinEdit_1 do
      begin
         top:=100;
         parent := FormAjout;
      end;
      Formajout.ShowModal;
      ....
      //FormatAjout.Close;  
      FreeAndNil(Formajout); //--> à la place de Close
    cf : http://wiki.freepascal.org/Form_Tuto...rm_dynamically

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  9. #9
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    BeanzMaster,
    Merci pour ta réponse.

    Si j'essaie avec FreeAndNil(Formajout); j'ai systématiquement une erreur "External SIGSEGV".

    Pour info, mon Form n'est pas créé dynamiquement. Ce sont seulement les SpinEdit qui sont ajoutés dynamiquement.
    Il me semblait donc que la fermeture du Form, ouvert avec un ShowModal, entraînait le Free et donc le Destroy.

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 730
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par cartebleue Voir le message
    Il me semblait donc que la fermeture du Form, ouvert avec un ShowModal, entraînait le Free et donc le Destroy.
    Le ShowModal affiche la form d'une manière modale et sa fermeture la cache ("hide"), ne la détruit pas.

    Faut faire autrement, par exemple créer la form dynamiquement.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci Jipété.

    J'ai refait un programme avec un Form1 et un bouton. L'appui sur le bouton ouvre un second Form (Form2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         Form2.ShowModal;
         FreeAndNil(form2);
    end;
    Lorsque je lance l'exécution : le Form2 s'ouvre correctement, je le referme et je reclique sur le bouton : erreur SIGSEGV...
    Je comprends bien que je n'utilise pas la création dynamique de formulaire mais c'est volontaire...

    Y a-t-il une solution ? Qu'est-ce que je ne comprends pas correctement ?!

  12. #12
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par cartebleue Voir le message
    Merci Jipété.

    J'ai refait un programme avec un Form1 et un bouton. L'appui sur le bouton ouvre un second Form (Form2) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
         Form2.ShowModal;
         FreeAndNil(form2);
    end;
    Lorsque je lance l'exécution : le Form2 s'ouvre correctement, je le referme et je reclique sur le bouton : erreur SIGSEGV...
    Je comprends bien que je n'utilise pas la création dynamique de formulaire mais c'est volontaire...

    Y a-t-il une solution ? Qu'est-ce que je ne comprends pas correctement ?!
    Tu doit déréférencer ta form dans les options de ton projet

    Nom : 2018-04-26_145007.jpg
Affichages : 281
Taille : 64,9 Ko

    ensuite :

    Tu place l'unté de formajout dans les uses puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    FormAjout := TFormAjout.Create(nil); //----> CREATION DYNAMIQUE DE LA FENETRE
    SpinEdit_1 := TSpinEdit.Create(FormAjout);
    With SpinEdit_1 do
    begin
       top:=100;
       parent := FormAjout;
    end;
    Formajout.ShowModal;
    FreeAndNil(FormAjout);
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  13. #13
    Candidat au Club
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Super merci à tous, j'ai réussi à avancer dans mon projet grâce à vos précieux conseils !!

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 05/05/2011, 11h10
  2. Récupérer la valeur d'un contrôle dynamiquement créé
    Par Digilougm dans le forum ASP.NET
    Réponses: 3
    Dernier message: 21/07/2010, 15h45
  3. Récupérer valeur contrôle en dynamique via requête
    Par nicburger dans le forum Access
    Réponses: 10
    Dernier message: 15/09/2005, 15h41
  4. Réponses: 2
    Dernier message: 27/03/2005, 19h15
  5. Réponses: 2
    Dernier message: 04/02/2005, 11h03

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