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

Langage Delphi Discussion :

Index liste hors limite dans StringList


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut Index liste hors limite dans StringList
    Bonjour à tous

    Je viens vous soumettre une erreur de liste hors limite dans un stringlist que je n'arrive pas à solutionner (je suis en D7 edition perso)

    L'erreur se situe sur cette ligne dans la 2ème partie de mon code (voir ci-après)
    StrAnniv.Insert(10,EdNom.text); // erreur liste hors limite (10)

    Avez vous une idée pour y remédier
    Merci
    A vous lire
    Cordialement

    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
    // a la validation, on ajoute les données de la nouvelle fiche
    procedure TForm1.SpdBtnValidFicheClick(Sender: TObject);
    var
    StrAnniv: TStringList;
    begin
    StrAnniv:=TStringList.Create;
    
    DateNaissance:=FormatDateTime('dd/mm/yyyy', DateTimePicker1.Date);
    DateAnniversaire:=FormatDateTime('dd mmmm', DateTimePicker1.Date);
    
    if check1.Checked=false then  // si checkbox1 non coché on ajoute les valeurs ou on passe au checkbox suivant
    begin
    Listbox1.items[0]:=DateAnniversaire + ' ' + EdNom.text + ' ' + EdPrenom.text;
    StrAnniv.Insert(0,EdNom.text);
    StrAnniv.Insert(1,EdPrenom.text);
    StrAnniv.Insert(2,EdTelfixe.text);
    StrAnniv.Insert(3,EdTelport.text);
    StrAnniv.Insert(4,Edmail.text);
    StrAnniv.Insert(5,Edadresse.text);
    StrAnniv.Insert(6,DateNaissance);
    StrAnniv.Insert(7,EdAge.text);
    StrAnniv.Insert(8,DateAnniversaire);
    StrAnniv.Insert(9,EdFete.text);
    Check1.Checked:=true
    end
     else
      begin
    if check2.checked=false then
    begin
    Listbox1.items[1]:=DateAnniversaire + ' ' + EdNom.text + ' ' + EdPrenom.text;
    StrAnniv.Insert(10,EdNom.text);  // erreur index hors limite sur cette ligne
    StrAnniv.Insert(11,EdPrenom.text);
    StrAnniv.Insert(12,EdTelfixe.text);
    StrAnniv.Insert(13,EdTelport.text);
    StrAnniv.Insert(14,Edmail.text);
    StrAnniv.Insert(15,Edadresse.text);
    StrAnniv.Insert(16,DateNaissance);
    StrAnniv.Insert(17,EdAge.text);
    StrAnniv.Insert(18,DateAnniversaire);
    StrAnniv.Insert(19,EdFete.text);
    Check2.Checked:=true;
    
    StrAnniv.SaveToFile('Fiches Anniversaire.ann');
    
    StrAnniv.Free;
    
    Editcount.text:=IntToStr(Listbox1.count); // comptabilise le nombre d'enregistrements
    end;
    end;
    end;

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Tu ne peux insérer une ligne à la position x que si la liste contient au moins x éléments.
    Tu devrais peut-être utiliser un tableau avec un nombre d'éléments prédéterminé plutôt que d'utiliser une liste dont la taille est dynamique.

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    Bonsoir Goustifruit

    D'accord mais pourquoi je n'ai pas d'erreur et les données sont bien enregistrées dans ma stringlist lorsque je garde la première partie du code (ci dessous) ??

    Sinon quand tu parles de tableau avec un nombre d'éléments prédéterminé, tu veux dire les Array of .... ?? c'est ça ?

    A te lire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if check1.Checked=false then  // si checkbox1 non coché on ajoute les valeurs ou on passe au checkbox suivant
    begin
    Listbox1.items[0]:=DateAnniversaire + ' ' + EdNom.text + ' ' + EdPrenom.text;
    StrAnniv.Insert(0,EdNom.text);
    StrAnniv.Insert(1,EdPrenom.text);
    StrAnniv.Insert(2,EdTelfixe.text);
    StrAnniv.Insert(3,EdTelport.text);
    StrAnniv.Insert(4,Edmail.text);
    StrAnniv.Insert(5,Edadresse.text);
    StrAnniv.Insert(6,DateNaissance);
    StrAnniv.Insert(7,EdAge.text);
    StrAnniv.Insert(8,DateAnniversaire);
    StrAnniv.Insert(9,EdFete.text);
    Check1.Checked:=true

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    322
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2009
    Messages : 322
    Points : 310
    Points
    310
    Par défaut
    Qu'est-ce que ton EdNom.text contient?

    Est-ce qu'il est vide?

    ...

    Comme tes données sont ajoutées les unes après les autres, pourquoi ne pas utiliser simplement StrAnniv.add(...).

    Ce qui est beaucoup plus naturel dans les circonstances.

    ...

    Ton problème est un erreur d'algo:

    Ton programme est construit comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if condition then begin
    .... ici tu ajoutes dix éléments
    end else begin
    ... ici tu insères le onzième élément alors que la liste est vide puisque les dix premier ne sont repli que si la première condition est remplie
    end;
    ...

    Comme je ne comprend pas vraiment le but de ton algo je ne peux pas vraiment le corriger :

    Peut-être que c'est cela que tu veux faire dans la réalité :
    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
    // a la validation, on ajoute les données de la nouvelle fiche
    procedure TForm1.SpdBtnValidFicheClick(Sender: TObject);
    var
        StrAnniv: TStringList;
    begin
        StrAnniv:=TStringList.Create;
     
        DateNaissance:=FormatDateTime('dd/mm/yyyy', DateTimePicker1.Date);
        DateAnniversaire:=FormatDateTime('dd mmmm', DateTimePicker1.Date);
     
        if check1.Checked=false then begin // si checkbox1 non coché on ajoute les valeurs ou on passe au checkbox suivant
     
            Listbox1.items[0]:=DateAnniversaire + ' ' + EdNom.text + ' ' + EdPrenom.text;
            StrAnniv.Insert(0,EdNom.text);
            StrAnniv.Insert(1,EdPrenom.text);
            StrAnniv.Insert(2,EdTelfixe.text);
            StrAnniv.Insert(3,EdTelport.text);
            StrAnniv.Insert(4,Edmail.text);
            StrAnniv.Insert(5,Edadresse.text);
            StrAnniv.Insert(6,DateNaissance);
            StrAnniv.Insert(7,EdAge.text);
            StrAnniv.Insert(8,DateAnniversaire);
            StrAnniv.Insert(9,EdFete.text);
            Check1.Checked:=true
            if check2.checked=false then begin
                Listbox1.items[1]:=DateAnniversaire + ' ' + EdNom.text + ' ' + EdPrenom.text;
                StrAnniv.Insert(10,EdNom.text);  // erreur index hors limite sur cette ligne
                StrAnniv.Insert(11,EdPrenom.text);
                StrAnniv.Insert(12,EdTelfixe.text);
                StrAnniv.Insert(13,EdTelport.text);
                StrAnniv.Insert(14,Edmail.text);
                StrAnniv.Insert(15,Edadresse.text);
                StrAnniv.Insert(16,DateNaissance);
                StrAnniv.Insert(17,EdAge.text);
                StrAnniv.Insert(18,DateAnniversaire);
                StrAnniv.Insert(19,EdFete.text);
                Check2.Checked:=true;
                StrAnniv.SaveToFile('Fiches Anniversaire.ann');
            end;
        end;
        StrAnniv.Free;
        Editcount.text:=IntToStr(Listbox1.count); // comptabilise le nombre d'enregistrements
    end;

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 021
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 021
    Points : 40 934
    Points
    40 934
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    je suis d'accord avec sgmsg sur le fait d'utiliser Add plutôt que Insert.

    Mais je ne procéderai pas de cette manière. J'utiliserai plutôt la fonction AddObject et je définirai type Record, Class ou Objet : TPersonne

    à la volée un type record
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    TPersonne = record
     begin
         Nom:String
         Prenom: String
         Telfixe: String
         Telport:String
         mail : String
         Adresse : String;
         DateNaissance : Date;
    //   Age : Integer;     StrAnniv.Insert(7,EdAge.text);   élement calculable donc inutile  
    //   DateAnniversaire : Date;     StrAnniv.Insert(8,DateAnniversaire); différent de la date de Naissance ?????? 
         Fete : Date;
     end
    un objet sera plus délicat à mettre en place mais permettrait de rajouter la fonction de calcul de l'âge et de la date anniversaire pour les pauvres mortels nés le 29/02 par exemple.

    En recherchant les différences entre record, class et objet je suis "tombé sans me faire mal" sur ce petit tuto qui devrait donner toutes les explications nécessaires et se rapproche beaucoup de ton objectif
    plus théorique, celui-ci ou celui-là
    il doit y en avoir d'autres ....
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Citation Envoyé par Beauserge Voir le message
    Bonsoir Goustifruit

    D'accord mais pourquoi je n'ai pas d'erreur et les données sont bien enregistrées dans ma stringlist lorsque je garde la première partie du code (ci dessous) ??

    Sinon quand tu parles de tableau avec un nombre d'éléments prédéterminé, tu veux dire les Array of .... ?? c'est ça ?

    A te lire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if check1.Checked=false then  // si checkbox1 non coché on ajoute les valeurs ou on passe au checkbox suivant
    begin
    Listbox1.items[0]:=DateAnniversaire + ' ' + EdNom.text + ' ' + EdPrenom.text;
    StrAnniv.Insert(0,EdNom.text);
    StrAnniv.Insert(1,EdPrenom.text);
    StrAnniv.Insert(2,EdTelfixe.text);
    StrAnniv.Insert(3,EdTelport.text);
    StrAnniv.Insert(4,Edmail.text);
    StrAnniv.Insert(5,Edadresse.text);
    StrAnniv.Insert(6,DateNaissance);
    StrAnniv.Insert(7,EdAge.text);
    StrAnniv.Insert(8,DateAnniversaire);
    StrAnniv.Insert(9,EdFete.text);
    Check1.Checked:=true
    Tu n'as pas de plantage sur cette partie parce que tu insères d'abord l'élément 0 dans une liste à 0 élément, puis l'élément 1 dans une liste à 1 élément, puis l'élément 2 dans une liste à 2 éléments, etc.
    Alors que dans la deuxième partie du code tu essayes d'insérer un élément en position 10 alors que la liste est vide.

    Si tu changes ton code comme ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    if check1.Checked=false then  // si checkbox1 non coché on ajoute les valeurs ou on passe au checkbox suivant
    begin
    Listbox1.items[0]:=DateAnniversaire + ' ' + EdNom.text + ' ' + EdPrenom.text;
    // StrAnniv.Insert(0,EdNom.text);
    StrAnniv.Insert(1,EdPrenom.text);
    StrAnniv.Insert(2,EdTelfixe.text);
    StrAnniv.Insert(3,EdTelport.text);
    StrAnniv.Insert(4,Edmail.text);
    StrAnniv.Insert(5,Edadresse.text);
    StrAnniv.Insert(6,DateNaissance);
    StrAnniv.Insert(7,EdAge.text);
    StrAnniv.Insert(8,DateAnniversaire);
    StrAnniv.Insert(9,EdFete.text);
    Check1.Checked:=true
    ... tu verras que ça plante sur "Insert (1, ...)" !

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Secteur : Services à domicile

    Informations forums :
    Inscription : Octobre 2006
    Messages : 74
    Points : 50
    Points
    50
    Par défaut
    Bonjour et merci à tous pour vos réponses

    Entre temps, j'ai retourné le problème dans tous les sens et je pense utiliser un Stringgrid pour stocker mes données qui me parait plus approprié....
    J'ai fait un essai et cela à l'air de fonctionner comme je le désire.
    Mon tableau étant fixe en nombre d'infos enregistré, il me sera facile de piocher dans telle ou telle colonne et ligne pour sauvegarder ou lire la donnée dont j'ai besoin
    Mais peut être que je me trompe !

    Sinon pour répondre à Goustifruit et SergioMaster, vous avez raison, l'utilisation de "Insert" fait d'une manière ou d'une autre planter le code donc je vais oublier ça. Mais la fonction AddObject me parait trop difficile à mettre en place pour moi (cf. j'avais déjà regardé les 2 premiers tuto dont tu parles mais il me semble trop technique)

    Enfin à Sgmsg, "EdNom.text' n'est pas vide - il contient du texte (en l’occurrence le nom d'une personne) mais à présent je sais pourquoi ça plante - le fameux "Insert"
    et par ailleurs j'ai testé ton code mais c'est pas ce que je souhaite puisque dans ce cas les données sont écrites en double dans mon fichier.


    Merci encore pour vos pistes et vos explications que je vais retenir
    Cordialement et bonne journée
    Beauserge

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Points : 777
    Points
    777
    Par défaut
    Tu peux toujours utiliser un TStringList sans forcer le numéro de ligne, simplement en exploitant la possibilité de stocker tes infos sous la forme clé/valeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    StrAnniv.Add('Nom=' + EdNom.Text);
    StrAnniv.Add('Prénom=' + EdPrenom.Text);
    ...
    Et ensuite tu récupères ces infos avec par ex.:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EdNom.Text := StrAnniv.Values['Nom'];
    EdPrenom.Text := StrAnniv.Values['Prénom'];
    ...

Discussions similaires

  1. Index de liste hors limites
    Par bvsud dans le forum Langage
    Réponses: 9
    Dernier message: 19/11/2014, 19h05
  2. erreur ' ''index de liste hors limites (10848864)''
    Par fz.saida dans le forum Débuter
    Réponses: 2
    Dernier message: 17/05/2013, 18h41
  3. Message d'erreur : Index XSQLDA hors limites
    Par loupiac dans le forum SQL
    Réponses: 2
    Dernier message: 31/12/2005, 10h08
  4. [débutant] erreur "indice de liste hors limites(1)"
    Par lidouka dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2005, 15h31
  5. Indice de liste hors limite !!! Report
    Par EssaiEncore dans le forum Langage
    Réponses: 1
    Dernier message: 29/11/2005, 11h00

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