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 :

Erreur i hors limite


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 175
    Points : 82
    Points
    82
    Par défaut Erreur i hors limite
    bonjour à vous
    je vien aujourd'huit pour demander ou est la faute car j'ai crée le programme suivant:
    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
    var ok,trouv:booelan; s:string; i:integer;
    begin
    trouv:=false;
    ok:=inputquery('recherche','entrez la valeur à rechercher',s);
    for i:=0 to listbox1.items.count-1 do         
    begin
    if listbox1.items.strings[i]=s then
    trouv:=true;
    end;
    if trouv=true then
    listbox1.selected[i]:=true
    else
    showmessage('non trouvé');
    end;
    end.
    j'ai essayé avec while
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while (trouv=false) and (i<=listbox1.items.count-1) do
    begin
    if listbox1.items.strings[i]=s then
    trouv:=true
    else
    inc(i);
    end;
    mais le problème que le compilateur on utilisant while i est hors limite [0]
    et avec for i hors limite(4 ou 5... ça dépend de nombre de items dans la list),
    s'il vous plait ma tête va exploser il m'est arriver ça plusieurs jours et je n'arrive plus a réfflchir, on dit que le compilateur ne fait pas de fautes, alors ou est la mienne
    merci d'avance

  2. #2
    Membre du Club Avatar de Kephuro
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 61
    Points : 48
    Points
    48
    Par défaut
    C'est pas très lisible ton texte. Tu ferais mieux d'éditer ton message et d'entourer ton code avec les balises [CODE].

    En utilisant ton débuggueur, sur quelle ligne se produit ton erreur ?

    Sinon, ta ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listbox1.selected[i]:=true
    Ne veut rien dire. Selected est un booléen, tu ne peux pas lui accoler un index !

    Et là, tel que tu as écrit ta boucle for, tu auras autant de messages 'Non trouvé' que d'éléments dans ta liste (sauf lorsque la référence est trouvée).


    En lisant ton code j'arrive pas à voir à quel moment tu pourrais avoir un index hors limite, mais j'ai codé toute la journée et je suis fatigué :p

    EDIT: Après vérification, listbox1.selected[i]:=true est une syntax correcte. L'IDE m'indique la bonne syntaxe, par contre la doc Delphi ne m'indique pas cette syntaxe (le descriptif en parle, cependant). Mea Culpa.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    en admettant que ce qui est demandé n'existe qu'une seule fois ou pas du tout dans la listbox, cela pourrait donner quelquechose comme ceci :
    Code non testé : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var s:string; i:integer;
    begin
    listbox1.ClearSelection;
    inputquery('recherche','entrez la valeur à rechercher',s);
    for i:=0 to listbox1.items.count-1 do
     if listbox1.items.strings[i]=s then
      begin
        listbox1.selected[i]:=true;
        break;
      end;
    if not listbox1.SelCount=0 then showmessage('non trouvé');

    avec while
    Code toujours non testé : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var  s:string; i:integer;
    begin
    listbox1.ClearSelection;
    inputquery('recherche','entrez la valeur à rechercher',s);
    i:=0;
    while (i<Listbox1.Selcount)  AND (listbox1.SelCount=0)
      begin
        if  listbox1.items.strings[i]=s 
              then  listbox1.selected[i]:=true
              else inc(i);
      end;
    if not listbox1.SelCount=0 then showmessage('non trouvé');

    je sais je n'ai pas testé les codes mais là j'ai un peu la flemme
    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

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    trouv:=false;
    ok:=inputquery('recherche','entrez la valeur à rechercher',s);
    for i:=0 to listbox1.items.count-1 
    do begin
      if listbox1.items.strings[i]=s then
      trouv:=true;
    end;
    if trouv 
    then listbox1.selected[i]:=true // la valeur de i n'est pas déterminée en sortie de boucle et doit donc générer un indice hors limite
    else showmessage('non trouvé');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    trouv:=false;
    ok:=inputquery('recherche','entrez la valeur à rechercher',s);
    i:=0; // s'il est bien mis à 0 avant le while, pas de raison d'index hors limite en sortie...
    while (trouv=false) and (i<=listbox1.items.count-1) 
    do begin
      if listbox1.items.strings[i]=s 
      then trouv:=true
      else inc(i);
    end;
    if trouv 
    then listbox1.selected[i]:=true 
    else showmessage('non trouvé');
    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 !

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 175
    Points : 82
    Points
    82
    Par défaut
    merci à vous, bien sur j'ai inisialisé i (i:=0).
    mais je vai vous annoncer la nouvelle:
    vos code ne marche pas , même problème ..........???
    pour l'instruction listbox1.ClearSelection; ne le connait pas , il m'entionne toujour que non définie, non déclaré.
    je ne sais pas ou est le probleme si c'est moi ou vous ou mon compilateur, j'utilise delphi5, il ya de la 3 ans , j'ai chercher la nouvelle version 2005 mais introuvable.
    pour l'instruction
    dites mois s'il vous plait ou est le probleme, c'est selected[i] ou bien quoi
    merci

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par secondechance Voir le message
    listbox1.ClearSelection;
    c'est selected[i] ou bien quoi
    merci
    ClearSelection Permet d'annuler toute sélection préalablement faite mais effectivement n'existe peut-être pas en D5 (je travaille maintenant avec D2006 , j'ai regardé sur D3 et effectivement elle n'existe pas, sur D7 par contre oui)

    en Essayant avec D3 je me suis également apperçu que je ne pouvais pas affecter une valeur True a ListBox1.Selected[i] , donc OUI
    c'est selected[i]
    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

  7. #7
    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
    bon, je suis en D5; voici le code concernant le fameux Selected :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    property Selected[Index: Integer]: Boolean read GetSelected write SetSelected;
    procedure SetSelected(Index: Integer; Value: Boolean);
    procedure TCustomListBox.SetSelected(Index: Integer; Value: Boolean);
    begin
      if SendMessage(Handle, LB_SETSEL, Longint(Value), Index) = LB_ERR then
        raise EListError.CreateResFmt(@SListIndexError, [Index]);
    end;
    Elle semble bien affectable, mais génère systématiquement une erreur... et l'aide en ligne n'en parle que pour consulter sa valeur !

    Je n'ai donc pas d'explication.
    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 !

  8. #8
    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
    pour une version plus moderne de delphi, regarde Turbo Explorer de CodeGear
    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 !

  9. #9
    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, Tourlourou !

    Citation Envoyé par tourlourou Voir le message
    Elle semble bien affectable, mais génère systématiquement une erreur... et l'aide en ligne n'en parle que pour consulter sa valeur !
    En D7 (perso) elle est bien affectable, et sans erreur : je pose une listbox sur une form, je lui ajoute 4 items, je code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.FormActivate(Sender: TObject);
    begin
      listbox1.Selected[2] := True;
    end;
    et j'ai bien la 3e ligne en bleu.

    Valà,
    --
    jp
    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

  10. #10
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

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

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 216
    Points : 2 303
    Points
    2 303
    Par défaut
    Bonjour,

    ce b'ai nullement un problème du compilateur, mais d'algorithme. En effet tu parcours complètement la liste, donc à la sortie i sera toujours > au count de ton listbox, l'erreur est logique.

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var ok,trouv:boolean; s:string; i:integer;
    begin
      trouv:=false;
      ok:=inputquery('recherche','entrez la valeur à rechercher',s);
      for i:=0 to listbox1.Items.count-1 do
      begin
        if listbox1.items.strings[i]=s then
        begin
          trouv:=true;
          break; <-- Permet d interrompre la boucle lorsque tu as trouvé
        end;
      end;
      if trouv=true then
        listbox1.selected[i]:=true <-- i a bien la valeur de l index correct
      else
        showmessage('non trouvé');
    end;
    @++
    Dany

  11. #11
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bonjour,

    Bizarre cette recherche via une boucle alors qu'on a la méthode IndexOf
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var     indice : integer;
    ...
    indice:=listbox1.Items.IndexOf(S); 
    if indice<0 then trouv:=false else trouv:=true;
    ...
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  12. #12
    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
    bien vu le IndexOf !
    au passage :
    mais ça n'explique pas l'erreur du Selected en D5
    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 !

  13. #13
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    175
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 175
    Points : 82
    Points
    82
    Par défaut
    bonjour tous le monde;
    merci pour votre aide, j'ai 2 nouvelles:
    la 1er: que j'ai appris beaucoup de chose grace à cette erreur;
    la 2eme: c'est que j'ai essayer toutes vos suggestion, mais ça n'a pas marché, là je constate que le défaut c'est mon compilant D5, on est pas a ce point bête des membres éprouvés, des modérateurs......à la fin rien;
    il fau que je change mon D5, vous me proposée quel version s'il vous plait, et qui ne me rend pas folle comme mon D5, car j'ai mal à la tête.....
    mes salutations

  14. #14
    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
    là : http://www.developpez.net/forums/sho...84&postcount=8 (c'est pas loin : 6 posts au dessus...)
    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 !

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    bon, je suis en D5; voici le code concernant le fameux Selected :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    property Selected[Index: Integer]: Boolean read GetSelected write SetSelected;
    procedure SetSelected(Index: Integer; Value: Boolean);
    procedure TCustomListBox.SetSelected(Index: Integer; Value: Boolean);
    begin
      if SendMessage(Handle, LB_SETSEL, Longint(Value), Index) = LB_ERR then
        raise EListError.CreateResFmt(@SListIndexError, [Index]);
    end;
    Elle semble bien affectable, mais génère systématiquement une erreur... et l'aide en ligne n'en parle que pour consulter sa valeur !

    Je n'ai donc pas d'explication.
    Un F1 sur LB_SETSEL confirme que la syntax
    ListBox1.Selected[i]:=TRUE;
    qui fonctionne seulement avec des listbox avec la propriété MultiSelect=TRUE.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  16. #16
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    En effet Eric Boisvert, d'ailleurs la version D7 de TCustomListBox.SetSelected est assez différente de sa version D5 et tendrais à le confirmer. Dans ce cas pour une ComboBox avec le MultiSelect à False il faut directement jouer avec la propriété ItemIndex à mon avis.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  17. #17
    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
    Bien vu, on croit être allé au fond des choses, et puis... non !
    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 !

Discussions similaires

  1. Erreur indice hors limites
    Par valery2109 dans le forum R
    Réponses: 1
    Dernier message: 30/04/2015, 10h50
  2. Erreur indice hors limite outil R
    Par Gloria_Im dans le forum R
    Réponses: 3
    Dernier message: 15/02/2013, 12h07
  3. erreur indice hors limites
    Par ryma87rh dans le forum C++
    Réponses: 9
    Dernier message: 19/03/2009, 08h55
  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. Erreur "indice hors limite(0)" non comprise
    Par Bruno1905 dans le forum Bases de données
    Réponses: 9
    Dernier message: 10/06/2005, 12h02

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