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 :

[D7] : Indice de liste hors limite[2]


Sujet :

Langage Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut [D7] : Indice de liste hors limite[2]
    Bonjour à tous,

    J'ai une erreur sur une TStringList qui me dit Indice de Liste hors limite(2). Voici la partie de mon code concernée :
    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
    procedure TfrmOracleSocket.ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
    sCodeBarre : String;
    aLitSocket : TStringList;
    iTailleSocket : String;
    iTailleCodeBarre : String;
    
    //posEOF : integer;
     begin
    aLitSocket := TStringList.Create;
    memServer.Lines.Add('Lecture des informations effectuées');
    sCodeBarre := '';
    While Pos('#', sCodeBarre) = 0 do
      sCodeBarre := Socket.ReceiveText;
      sCodebarre := StringReplace(sCodeBarre, CRLF, ';', [rfReplaceAll]);
      Split(';',sCodeBarre,aLitSocket);
      For i:=0 to aLitSocket.Count - 1 do
      iTailleSocket := aLitSocket[0];
      iTailleCodeBarre := aLitSocket[1];
      sCodeBarre := Copy(aLitSocket[2],1,StrToInt(iTailleCodeBarre));
    WriteCodeBarre(sCodeBarre);memServer.Lines.Add(sCodeBarre);
    Je reçois un message du socket que je décompose... J'ai d'abord la taille du socket la taille du code barre et le code barre...
    Pourtant quand je me met en pas à pas mon sCodeBarre contient bien le bon code barre...
    Je ne comprend pas...

    Merci d'avance
    Windows XP
    Delphi 7

    WinDev Mobile 17

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    bonjour


    dans ton code je ne vois pas le remplissage de ton "stringList".

    Quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    aLitSocket.Strings.Add('qq chose');
    aLitSocket.Strings.Add('autre chose');
    donc l'erreur est normal
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    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 534
    Points : 25 082
    Points
    25 082
    Par défaut
    olivier, tu n'as pas vu la méthode Split ?
    qui doit fonctionner comme ExtractStrings en remplissant la TStrings passé en paramètre !

    Sinon, pourquoi utiliser des ; ?
    Tu peux utiliser un echange de record, c'est plus délicat au début par contre c'est nettement plus efficace et polyvalent !
    Ah sauf si c'est un echange avec Windev, là effectivement, la solution du mode texte peut se comprendre !

    Tu as vérifier que tu as bien 2 ou 3 ; dans ta chaine reçu ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    While Pos('#', sCodeBarre) = 0 do
      sCodeBarre := Socket.ReceiveText;
      sCodebarre := StringReplace(sCodeBarre, CRLF, ';', [rfReplaceAll]);
      ...
    ça ne devrait plutôt être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    While Pos('#', sCodeBarre) = 0 do
      sCodeBarre := sCodeBarre + Socket.ReceiveText;
     
    sCodebarre := StringReplace(sCodeBarre, CRLF, ';', [rfReplaceAll]);
    ...
    l'indentation du code soit est fausse, soit il manque un begin !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    Oui c'est un échange avec Windev...
    Que j'ai bien 2 ou 3 dans ma chaine reçue ?
    Quand je suis en mode pas à pas dans aLitSocket[2] j'ai bien mon code barre ...
    Et pour ma boucle c'est Tant que je n'ai pas un # je récupère mon socket ... j'ai mis en place un if ...
    Windows XP
    Delphi 7

    WinDev Mobile 17

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    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
    procedure TfrmOracleSocket.ServerSocketClientRead(Sender: TObject;
      Socket: TCustomWinSocket);
    var
    sCodeBarre : String;
    aLitSocket : TStringList;
    iTailleCodeBarre : String;
    sCodeBarreLog : String;
     
    begin
    aLitSocket := TStringList.Create;
    memServer.Lines.Add('Lecture des informations effectuées');
    sCodeBarre := '';
    //Tant que je ne trouve pas un # indiquant la fin du code barre je boucle...
    While Pos('#', sCodeBarre) = 0 do
      sCodeBarre := Socket.ReceiveText;
      sCodeBarreLog := sCodeBarre;
     
      //Je remplace les CRLF (= Retour Chariot RC sous WinDev) par des ;
      sCodebarre := StringReplace(sCodeBarre, CRLF, ';', [rfReplaceAll]);
     
      //Je sépare ma chaine à chaque ;
      Split(';',sCodeBarre,aLitSocket);
     
      //Ma chaine est de la forme :
      //Soit sur un Intermec TailleSocket + TailleCodeBarre + CodeBarre
      //Soit sur un PSION TailleCodeBarre + CodeBarre
      //Pour ne pas avoir d'erreur je récupère ma TailleCodeBarre qui est toujours en avant dernière position
      iTailleCodeBarre := aLitSocket[aLitSocket.Count - 2];
     
      //Et mon CodeBarre qui est toujours en dernière position
      sCodeBarre := aLitSocket[aLitSocket.Count -1];
      WriteCodeBarre(sCodeBarre);
      memServer.Lines.Add(sCodeBarre);
     
    sCodeBarre := Copy(sCodeBarre,1,Length(sCodeBarre) - 1); //-1
    RenvoiRequete(sCodeBarre, OracleSession, OracleDataSet, DataSource, DBGrid, ClientDataSet, ServerSocket);
     
    end;
    J'ai résolu le problème en utilisant le Count - 1 (sachant que mon code barre est toujours en dernière position) et Count - 2 où ma TailleCodeBarre est toujours en avant dernière position
    Merci de votre aide
    Windows XP
    Delphi 7

    WinDev Mobile 17

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 534
    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 534
    Points : 25 082
    Points
    25 082
    Par défaut
    Je suis toujours choqué par l'indentation après ton while do sans begin !

    Je me demande comment sCodeBarre peut contenir ce qu'il faut (tes trames TCP\IP sont assez courte, et comme tu es sur un LAN, tes paquets arrivent entier, ce qui sera quasiment toujours le cas tant que tu ne dépasse par 8Ko pour un paquet, faudra penser au cas où tu reçois plusieurs code barre dans un seul paquet, tu auras plusieurs #)

    si tu l'as remplacer par un if, je suppose que tu as transformé ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    While Pos('#', sCodeBarre) = 0 do
      sCodeBarre := Socket.ReceiveText;
     
    sCodeBarreLog := sCodeBarre
    en ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    sCodeBarre := Socket.ReceiveText;
    if Pos('#', sCodeBarre) > 0 then
    begin  
      sCodeBarreLog := sCodeBarre
    aLitSocket n'est jamais libéré, il faut appeler Free()
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2010
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 533
    Points : 124
    Points
    124
    Par défaut
    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
    While Pos('#', sMessageRecu) = 0 do
      begin
      sMessageRecu := Socket.ReceiveText;
     
        //On vérifie que le message reçu ne soit pas vide
        if sMessageRecu = '' then
        exit;
      //On termine la procédure si on a pas de code barre
     
     
      //Je remplace les CRLF (= Retour Chariot RC sous WinDev) par des ;
      sMessageRecu := StringReplace(sMessageRecu, CRLF, ';', [rfReplaceAll]);
     
      //Je sépare ma chaine à chaque ;
      Split(';',sMessageRecu,aLitSocket);
     
      //Ma chaine est de la forme :
      //Soit sur un Intermec TailleSocket + TailleCodeBarre + CodeBarre
      //Soit sur un PSION TailleCodeBarre + CodeBarre
      //Pour ne pas avoir d'erreur je récupère ma TailleCodeBarre qui est toujours en avant dernière position
      iTailleCodeBarre := aLitSocket[aLitSocket.Count - 2];
     
      //Et mon CodeBarre qui est toujours en dernière position
      sCodeBarre := aLitSocket[aLitSocket.Count -1];
      //On vérifie que le code barre existe dans le message reçu
      if sCodeBarre = '' then
        exit;
     
      WriteCodeBarre(sCodeBarre);
     // memServer.Lines.Add('Lecture du code barre :' + sCodeBarre);
      memServer.Lines.Add(Socket.RemoteAddress + ' : '+ sCodeBarre);
      addIP := Socket.RemoteAddress;
     
    //Je récupère le code barre et lui enlève le marqueur fin # avec le -1
    sCodeBarre := Copy(sCodeBarre,1,Length(sCodeBarre) - 1); //-1
    WriteCodeBarre(sCodeBarre + ' : ' + idConnexion);
     
    RenvoiRequete(addIP, sCodeBarre, OracleSession, OracleDataSet, DataSource, DBGrid, ClientDataSet, ServerSocket, oqRechercheAddIP);
    end;
    Non non j'ai mis un begin et end
    Windows XP
    Delphi 7

    WinDev Mobile 17

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

Discussions similaires

  1. erreur: indice de liste hors limite
    Par Abou Zar dans le forum Web & réseau
    Réponses: 12
    Dernier message: 06/10/2010, 13h08
  2. Indice de liste hors limite
    Par pierrot67 dans le forum Bases de données
    Réponses: 2
    Dernier message: 14/02/2007, 11h42
  3. [débutant] erreur "indice de liste hors limites(1)"
    Par lidouka dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2005, 14h31
  4. 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