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 :

Indice hors limite(0)


Sujet :

Langage Delphi

  1. #1
    Membre du Club Avatar de Morfus
    Inscrit en
    Novembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 93
    Points : 58
    Points
    58
    Par défaut Indice hors limite(0)
    bonjour
    voila mon probleme c'est lorseque je ferme mon application il m'affiche une exception elisterror "indice hors limite (0) " et j'arrive pas a trouver l'erreur oiu se situe ?
    merci de me dire ou se situ l'erreur j'utilise delphi 7 et une base de données paradox
    merci

  2. #2
    Membre actif Avatar de touhami
    Inscrit en
    Avril 2002
    Messages
    327
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 327
    Points : 264
    Points
    264
    Par défaut
    Bonjour,
    u’est ce que tu fait lors de la fermeture de ta fenêtre?

  3. #3
    Membre du Club Avatar de Morfus
    Inscrit en
    Novembre 2006
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 93
    Points : 58
    Points
    58
    Par défaut
    j'ai mis application.terminate

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Citation Envoyé par Morfus
    merci de me dire ou se situ l'erreur j'utilise delphi 7 et une base de données paradox
    merci
    A la ligne 273....


    Non sérieusement, comment veux-tu que l'on réponde à cette question avec aussi peu de renseignements? Donne nous du code, plus de détails, etc.

  5. #5
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    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 Morfus
    bonjour
    voila mon probleme c'est lorseque je ferme mon application il m'affiche une exception elisterror "indice hors limite (0) " et j'arrive pas a trouver l'erreur oiu se situe ?
    merci de me dire ou se situ l'erreur j'utilise delphi 7 et une base de données paradox
    merci
    Utilises tu des tableaux dynamiques ? tu as du avoir un acces hors-limite dans un tableau.
    Lorsqu'il s'agit d'une lecture, l'exception n'est pas soulevée pendant l'éxécution de code, mais en sortie d'application.

    Du coup, vérifies que tu n'as pas une boucle du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i:=0 to count-1 do
    begin
       ...
        Element:=tableau[i]
       ...
    end;
    ...avec count=0

    Celà peut très bien être la lecture d'une ligne d'un TMemo, d'un Item de TListBox, de TComboBox, etc...

    Même si tu es sur de toi que ça n'arrive jamais, il vaut mieux être prudent
    et remplacer tes boucles par cet équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    i:=0;
    while i<count do
    begin
       ...
        Element:=tableau[i]
       ...
       inc(i); 
    end;
    Bon dev

  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
    Citation Envoyé par waskol
    Du coup, vérifies que tu n'as pas une boucle du genre :
    ...avec count=0
    Je te détrompe tout de suite : cela ne pose aucun problème, et est parfaitement légitime en Delphi. Fais le test par toi-même si tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for I := 0 to -1 do
      WriteLn(I);

  7. #7
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    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
    Exact, mais celà m'est pourtant déjà arrivé d'avoir une entrée de boucle "illégitime", va comprendre... (avec le défi du démineur, dingue non ?)

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Salut;
    Tu n as pas par hasard une TString et Cie que tu n initialise pas?
    Lorsque cela m arrivait, ma solution etait de traiter la TList par ordre decroissant.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2003
    Messages : 560
    Points : 576
    Points
    576
    Par défaut
    Bonjour,

    La première chose à faire est d'identifier ou est le problème.

    Essayer de mettre au début de chaque évènement OnClose de chaque forme un "showMessage('non de ma forme');". Cela devrait déja vous permettre de savoir ou est le problème.
    A priori je dirait qu'un tableau est utiliser alors qu'il est détruit ou que sa longueur est de 0 (tableau de taille variable), Mais c'est avancer des hypothèses sans fondements.

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 54
    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
    En tout cas, la premère chose à vérifier est l'accès en lecture à un élément de tableau. Dans ce cas, la violation d'accès ne se déclenche pas forcément sur la ligne incriminée, mais de façon aléatoire en sortie de processus.

    En écriture, l'exception est déclenchée une fois sorti de la procédure fautive (ou du programme)

    Par exemple et pour vous en convaincre, essayez cet exemple absolument hallucinant tellement c'est n'importe quoi :

    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
        t:array of integer;
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    procedure Affiche(t:array of integer);
    var i:integer;
    begin
      i:=t[10]; //acces en lecture à un tableau de longueur 0
      ShowMessage(IntToStr(i));
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SetLength(t,0); //tableau de longueur 0
      Affiche(t);
    end;
     
    end.
    maintenant changez la code ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure Affiche(t:array of integer);
    var i:integer;
    begin
      t[8]:=1; //écriture hors limite
      i:=t[10];
      ShowMessage(IntToStr(i));
    end;
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      SetLength(t,0);
      Affiche(t);
      ShowMessage('Exception déclenchée ici');
    end;
    Piégeant non ?

    ça peut faire la même chose avec tout ce qui est du type TList (TStringList, propriétés Lines/Items/etc....)
    D'ailleurs, "Indice Hors Limite" est le message d'erreur d'un type List

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Tardiff Jean-François
    Bonjour,

    La première chose à faire est d'identifier ou est le problème.

    Essayer de mettre au début de chaque évènement OnClose de chaque forme un "showMessage('non de ma forme');". Cela devrait déja vous permettre de savoir ou est le problème.
    A priori je dirait qu'un tableau est utiliser alors qu'il est détruit ou que sa longueur est de 0 (tableau de taille variable), Mais c'est avancer des hypothèses sans fondements.
    Une execution pas-a-pas serait meilleur je pense. Et faire un suivie (Watch) de la variable en question serait tres utile.

  12. #12
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 107
    Points : 115
    Points
    115
    Par défaut
    Je pourait vous dire que cela arrive généralement qu'ont vous utilisé des objet contenant indice exp PageControl,ComboBox,ListBox..Etc.
    Bref essayé d'exécuter votre programme avec la touche F7 pas à pas aprofondis puis l'orsque vous quitter votre application le pointeur va s'arrêté à l'erreur précis.
    Puis Envoyer nous le source ou l'erreur s'affiche.
    A+

  13. #13
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 770
    Points
    2 770
    Par défaut
    Citation Envoyé par Morfus
    j'ai mis application.terminate
    et....??? où est tu passé???, tu t'es perdu dans la matrix

  14. #14
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    Hello, déterrage de topic même souci !

    Avec ce code par exemple (la ligne avec KeyList.Count) sachant que j'ai 10 éléments dans le count... Sur un pc ça fonctionne, sur un autre non

    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
    function GetOutlookArchiveList: tStrings;
    var
      Reg : TRegistry;
      //RegInfo : TRegDataInfo;
      Buffer : array of Char;
      BufferSize : Integer;
      I,J:Integer;
      KeyList : TStrings;
      Value : string;
    const
      OutlookReg : string = 'Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook';
    begin
      Result := TStringList.Create;
      KeyList := TStringList.Create;
      Reg := TRegistry.Create;
      Reg.RootKey := HKEY_CURRENT_USER;
      Reg.OpenKey(OutlookReg,false);
      Reg.GetKeyNames(KeyList);
      Reg.CloseKey;
      For i:=0 to KeyList.Count -1 do
      begin
           Reg.OpenKey(OutlookReg + '\' + KeyList.Strings[i],false);
           if Reg.ValueExists('001f6700') then
           begin
                Value := '';
                BufferSize := Reg.GetDataSize('001f6700');
                SetLength(Buffer,BufferSize);
                Reg.ReadBinaryData('001f6700',Buffer[0],BufferSize);
                For j:=0 to BufferSize - 1 do
                begin
                     if Buffer[j] <> #0 then
                        Value := Value + Buffer[j];
                end;
                Result.Add(Value);            
           end;
           Reg.CloseKey;
      end;
      Reg.Free;
    end;

  15. #15
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Déjà, il faudrait peut-être libérer Keylist après usage. Ensuite, instancier un TStringList en valeur retour, que tu dois sans doute oublier aussi de libérer, bof bof... On a déjà eu mainte discussion sur ce sujet, je n'ai pas changé d'avis : c'est laid, et dangereux. Personnellement, je préfère passer l'objet en paramètre d'une procédure, objet donc l'instanciation et la libération sont à la charge de la procédure appelante, dans le même bloc de code, par symétrie.

    Ensuite, la clef codée en dur, bof bof aussi. As-tu bien vérifié que cette clef est la bonne sur TOUTES les versions de Windows et TOUTES les versions d'Outlook ? Sur mon PC, en tout cas, un petit tour dans RegEdit m'a convaincu que ça ne marcherait probablement pas.

    Enfin, essaie de faire le parcours de la boucle en descendant, comme il a déjà été dit, sait-on jamais ? En principe c'est quand on élimine des éléments de la liste qu'il faut impérativement le faire, mais parfois Delphi a ses raisons que la raison ne connaît pas toujours (à cause des optimisations, sans doute) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i := KeyList.Count -1 downto 0 do

  16. #16
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 82
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Bonjour Morfus

    J'ai eu ce message (indice hors limite) aussi lorsque j'utilise une procédure enregistrée : si j'ai modifié soit dans mon programme, soit dans ma procédure un paramètre (un en plus ou un en moins) j'ai la panne.

    Si tu utilises des procédures, tu peux peut-être regardé de ce côté.

    A+

  17. #17
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par CapJack Voir le message
    Ensuite, la clef codée en dur, bof bof aussi. As-tu bien vérifié que cette clef est la bonne sur TOUTES les versions de Windows et TOUTES les versions d'Outlook ? Sur mon PC, en tout cas, un petit tour dans RegEdit m'a convaincu que ça ne marcherait probablement pas.
    Oui dans mon cas ça doit être ça et alors ne peut-on pas faire taire ce message d'indice hors limite en gérant nous même l'erreur par une action spécifique dans notre appli. J'ai essayé try except mais il s'en balance

    NB : au fait ce code n'est pas de moi il vient de ce forum... En fait pour Outlook, on ne peut pas simplement faire une recherche dans la clé en localisant le mot '.pst' ?

  18. #18
    Membre du Club Avatar de DarkChamallo
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 113
    Points : 56
    Points
    56
    Par défaut
    Ah bin voilà tout connement (PS : y-a-t-il des fautes ?) :

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var 
      Registre: TRegistry;
      i,j,k,l : Integer;
      CheminPST : String;
      DataSize: LongWord;
      ValueName: String;
      s: String;
      _Wide: WideString; 
    begin
      Registre := TRegistry.Create;
      CheminPST := 'Software\Microsoft\Windows NT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook';
      try
        Registre.RootKey := HKEY_CURRENT_USER;
        Registre.OpenKey(CheminPST, False);
        Registre.GetKeyNames(Memo1.Lines);
        Registre.CloseKey;
        for i:=0 to Memo1.Lines.Count -1 do begin
          Registre.OpenKey(CheminPST + '\' + Memo1.Lines[i], False);
          Registre.GetValueNames(Memo2.Lines);
          Registre.CloseKey;
          for j:=0 to Memo1.Lines.Count -1 do begin
            for k:=0 to Memo2.Lines.Count -1 do begin
              Registre.OpenKey(CheminPST + '\' + Memo1.Lines[j], False);
              try
                if((Registre.GetDataType(Memo2.Lines[k]) = rdString) or (Registre.GetDataType(Memo2.Lines[k]) = rdExpandString)) then Memo3.Lines.Add(Registre.ReadString(Memo2.Lines[k]))
                else if (Registre.GetDataType(Memo2.Lines[k]) = rdInteger) then Memo3.Lines.Add(IntToStr(Registre.ReadInteger(Memo2.Lines[k])))
                else if (Registre.GetDataType(Memo2.Lines[k]) = rdBinary) then begin
                  ValueName := Memo2.Lines[k];
                  DataSize := Registre.GetDataSize(ValueName);
                  SetLength(_Wide, DataSize);
                  Registre.ReadBinaryData(ValueName, PWideChar(_Wide)^, DataSize);
                  s := WideCharToString(PWideChar(_Wide));
                  Memo3.Lines.Add(S);
                end;
              Registre.CloseKey;
              except 
              Registre.CloseKey;
              end;
            end;
          end;
        end;
      finally
        Registre.Free;
      end;
      for l:=0 to Memo3.Lines.Count -1 do begin
        If(Pos('.pst',Memo3.Lines[l]) <> 0) then Edit1.Text := Memo3.Lines[l];
      end;
    end;
    En veillant à mettre WordWrap à False pour les Memo

    PS : pour lire une clé binaire : merci à TheWhiteShadow
    Le reste c'est de moi

Discussions similaires

  1. Erreur indice hors limite outil R
    Par Gloria_Im dans le forum R
    Réponses: 3
    Dernier message: 15/02/2013, 12h07
  2. StringGrid Indice hors limite
    Par DURVILLE dans le forum Langage
    Réponses: 7
    Dernier message: 02/04/2011, 11h12
  3. erreur indice hors limites
    Par ryma87rh dans le forum C++
    Réponses: 9
    Dernier message: 19/03/2009, 08h55
  4. [TListBox] Problème "Indice hors limite (-1)"
    Par renorx dans le forum Composants VCL
    Réponses: 16
    Dernier message: 08/12/2005, 17h47
  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