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 de liste hors limites


Sujet :

Langage Delphi

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 34
    Points : 33
    Points
    33
    Par défaut Index de liste hors limites
    Bonjour à tous,

    J'ai ce message d'erreur lorsque je tente de remplir un TListView : Index de liste hors limites (8)
    Ca me répète le message pour chaque ligne…

    voila 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
    32
    33
    34
    35
    36
    37
    38
    39
     
    begin
    ListView1.Clear;
    ListView1.Column[5].Caption := 'Code postal client';
    ListView1.Column[6].Caption := 'Concessionnaire';
    ListView1.Column[7].Caption := 'Code postal concess';
    ListView1.Column[8].Caption := 'Description';
      DBExp := TSQLite3Database.Create;
        try
        DBExp.Open(Utilisateur);
        Stmt_Exp := DBExp.Prepare('SELECT * FROM affaire ' + ExportExcel + ' ORDER BY Date');
     
          try
          while Stmt_Exp.Step = SQLITE_ROW do
            begin
     
            Item2 := ListView1.Items.Add;
            ShowMessage('1');
            Item2.Caption := FormatDateTime('dd/mm/yyyy', UnixToDateTime(StrToInt(Stmt_Exp.ColumnText(1)))); //Date
            Item2.SubItems.Add(Stmt_Exp.ColumnText(2)); //Modele
            Item2.SubItems.Add(Stmt_Exp.ColumnText(3)); //Type
            Item2.SubItems.Add(Stmt_Exp.ColumnText(8)); //Pourcentage
            Item2.SubItems.Add(Stmt_Exp.ColumnText(11)); //Client
            Stmt_Exp2 := DBExp.Prepare('SELECT CodePostal FROM client WHERE id = "' + Stmt_Exp.ColumnText(5) +'"'); //IdClient
            Stmt_Exp2.Step;
            Item2.SubItems.Add(Stmt_Exp2.ColumnText(0)); //Code Postal Client
            Item2.SubItems.Add(Stmt_Exp.ColumnText(4)); //Concess
            Stmt_Exp2 := DBExp.Prepare('SELECT CodePostal FROM concessionnaire WHERE id = "' + Stmt_Exp.ColumnText(19) +'"');  //IdConcess
            Stmt_Exp2.Step;
            Item2.SubItems.Add(Stmt_Exp2.ColumnText(0)); //Code Postal Concessionnaire
            Item2.SubItems.Add(Stmt_Exp.ColumnText(9)); //Descritpion
            end;
          finally
          Stmt_Exp.Free;
          end;
        finally
        DBExp.Free
        end;
    end.
    quand j'exécute pas à pas, l'erreur s'arrête ici (dans System.Classes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function TStringList.Get(Index: Integer): string;
    begin
      if Cardinal(Index) >= Cardinal(FCount) then
        Error(@SListIndexError, Index);
      Result := FList[Index].FString;
    end;
    J'ai mis le ShowMessage('1') pour trouver exactement d'où vient le problème. L'erreur hors limites arrive juste avant au niveau Item2 := ListView1.Items.Add;

    J'ai fait des recherches un peu partout mais je ne comprends vraiment pas pourquoi…

    Désolé si le code n'est pas top, je débute…

    Merci

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Item2.SubItems.Add(Stmt_Exp.ColumnText(8)); //Pourcentage
    ColumnText est une spécificité de ce TSQLite3Database mais il aurait fait un bon coupable à cause de l'indice 8
    Pour la maintenance, utiliser le indice de Column du Statment couplé à un SELECT * ... c'est assez moyen
    Un ColumnByName ou FieldByName existe-t-il dans Statment ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Item2 := ListView1.Items.Add;
    Mais vu votre ShowMessage,
    Si c'est de la VCL : Cela instancie un TListItem et appel ListView_InsertItem
    je penserais à un gestionnaire d'evènement OnCreateItemClass
    Le Add ne fait pas grand chose, normalement, il ne provoque pas de OnChange

    Si c'est du FMX : ne pratique pas, le comportement est différent à un survol rapide du code


    Vous devriez mettre ce code de capture de l'exception pour être sûr

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    try
      Item2 := ListView1.Items.Add;
    except
      on E: Exception do
        ShowMessage(Format('Ah oui c''est bien ici : %s (%s)', [E.Message, E.ClassName()]));
    end;
    Sachez que CTLR + ALT + S fait voir la Stack, la Pile d'appel, c'est utile pour voir le chemin de fonction en fonction pour déterminer où ce produit l'exception

    Avez vous penser à retirer tout le code et ne laisser que la boucle (si ce n'est pas une exception interne de Stmt_Exp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while Stmt_Exp.Step = SQLITE_ROW do
    begin
    (*
    ...
    *)
    end;


    Citation Envoyé par Alferox Voir le message
    Ca me répète le message pour chaque ligne…
    Cela boucle quand même ?
    Est-ce une Exception ou une Notification du Débogueur d'exception ?
    Je penche pour le second, une Exception déclenchée, déboguée et capturée ce qui n'empêche pas la boucle






    Après quand vous n'aurez plus d'erreur, faudra travailler sur le SQL pour éviter Stmt_Exp2 (deux instances non libérées ? )
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT *, cli.CodePostal aS CodePostalClient, con.CodePostal As CodePostalConc 
    FROM affaire
    -- le ExportExcel à caser quelque part
    INNER JOIN client cli ON cli.ID = affaire.id_client
    INNER JOIN concessionnairecli concli.ID = affaire.id_concessionnaire
    ORDER BY Date

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Bonjour, merci pour votre aide. Alors j'ai essayé plusieurs choses:

    Lorsque je fais
    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
     
        try
        DBExp.Open(Utilisateur);
        Stmt_Exp := DBExp.Prepare('SELECT * FROM affaire ' + ExportExcel + ' ORDER BY Date');
     
          try
          while Stmt_Exp.Step = SQLITE_ROW do
            begin
              ShowMessage('1');
            end;
          finally
          Stmt_Exp.Free;
          end;
        finally
        DBExp.Free
        end;
    Je n'ai pas de message d'erreur.

    Quand je fais:
    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
     
        try
        DBExp.Open(Utilisateur);
        Stmt_Exp := DBExp.Prepare('SELECT Type FROM affaire ' + ExportExcel + ' ORDER BY Date');
     
          try
          while Stmt_Exp.Step = SQLITE_ROW do
            begin
              Item2 := ListView1.Items.Add;
              Item2.SubItems.Add('Bonjour');
            end;
          finally
          Stmt_Exp.Free;
          end;
        finally
        DBExp.Free
        end;
    J'ai le message Index de liste hors limites (8) qui apparait. C'est bien du VCL, pas de FMX

    Merci

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 563
    Points : 25 165
    Points
    25 165
    Par défaut
    Il faut regarder vos Gestionnaires connectés aux événements de la ListView1.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 34
    Points : 33
    Points
    33
    Par défaut
    Merci, c'est bien ca. L'erreur vient d'ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TMain.ListView1CustomDrawItem(Sender: TCustomListView;
      Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
      begin
        if (Item.SubItems[8] = '1') AND (StrToInt(Item.SubItems[9]) < DateTimeToUnix(Now)) then ListView1.Canvas.Brush.Color := clRed;
        if (Item.SubItems[7] = '') AND (Item.SubItems[4] = '') then ListView1.Canvas.Brush.Color := clBlue;
      end;

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

Discussions similaires

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

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