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 :

[Tableau] Initialisation d'un tableau dynamique


Sujet :

Langage Delphi

  1. #1
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut [Tableau] Initialisation d'un tableau dynamique
    Bonjour,

    Je rencontre un petit problème au niveau de l'initialisation d'un tableau dynamique.

    j'ai la structure suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    type
      TPopMail = record
        Subject ,
        From    : String;
        CCList  : Array of String;
        Body    : String;
        Attachment : Array of record
           FileName : String;
           Stream   : TMemoryStream;
        end;
      end;
    et voici le code qui permet de remplir la structure

    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
     
    var
      IdMsg : TIdMessage;
      i : integer;
      MonPop : TPopMail;
     
    begin
      IdMsg := TIdMessage.Create;
      try
        // récupération du mail
        FIDPOP.Retrieve(INbMail,IdMsg);
     
        // récupération du sujet du mail
        MonPop.Subject := IdMsg.Subject;
        // Récupération de l'expéditeur du mail
        MonPop.From    := IdMsg.From.Text;
     
        // récupération de la liste des CC du mail
        SetLength(MonPop.CCList,IdMsg.CCList.Count);
        for i := 0 to IdMsg.CCList.Count -1 do
          MonPop.CCList[i] := IdMsg.CCList.Items[i].Address;
     
        for i := 0 to IdMsg.MessageParts.Count -1 do
        begin
          // récupération du corps du mail
          if IdMsg.MessageParts.Items[i] is TIdText then
            MonPop.Body := TIdText(IdMsg.MessageParts.Items[i]).Body.Text;
          // récupération des pièces jointes
          if IdMsg.MessageParts.Items[i] is TIdAttachment then
          begin
            // Récupère la taille max du tableau et ajoute 1 pour redimensionner
            SetLength(MonPop.Attachment,High(MonPop.Attachment) + 1);
            MonPop.Attachment[High(MonPop.Attachment)].FileName := TIdAttachment(IdMsg.MessageParts.Items[i]).FileName;
            MonPop.Attachment[High(MonPop.Attachment)].Stream := TMemoryStream.Create;
            TIdAttachment(IdMsg.MessageParts.Items[i]).SaveToStream(MonPop.Attachment[High(Result.Attachment)].Stream);
          end;
        end; // for
        Result := MonPop;
      finally
        IdMsg.Free;
      end;
    end;
    Je rencontre une violantion d'accès sur la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     MonPop.Attachment[High(MonPop.Attachment)].FileName := TIdAttachment(IdMsg.MessageParts.Items[i]).FileName;
    Et je suis certain que la partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TIdAttachment(IdMsg.MessageParts.Items[i]).FileName;
    fonctionne car je l'utilise dans un autre morceau de code.

    Merci (à l'avance) pour ceux qui m'aideront ^^
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    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 862
    Points : 11 321
    Points
    11 321
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SetLength(MonPop.Attachment,High(MonPop.Attachment) + 1);
    je crois que lorsque le tableau est vide, High renvoie -1
    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 !

  3. #3
    Membre chevronné
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Points : 1 975
    Points
    1 975
    Par défaut
    dans ton setlenght, tu fais high+2, ça démarre de 0. (pour l'agrandir sa dimension de 1).
    ex: 0...5 high->5 donc dim=6
    +1=7 donc on ajoute 2

  4. #4
    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
    Autrement dit, utilise Length et non High dans le SetLength
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  5. #5
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Merci, c'etait un petit coups de length qu'il fallait ^^

    2em problème : je ne sais pas si cela vient d'une possible incompatibilité entre le tableau dynamique et le MemoryStream

    Je me retrouve avec une violation d'accès lors de la sauvegarde du fichier dans le MemoryStream du tableau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SetLength(MonPop.Attachment,Length(MonPop.Attachment) + 1);
    MonPop.Attachment[Length(MonPop.Attachment) -1].FileName := TIdAttachment(IdMsg.MessageParts.Items[i]).FileName;
    MonPop.Attachment[Length(MonPop.Attachment) -1].Stream := TMemoryStream.Create;
     
    // violation sur la ligne ci dessous
    TIdAttachment(IdMsg.MessageParts.Items[i]).SaveToStream(MonPop.Attachment[Length(MonPop.Attachment)-1].Stream);
    J'ai testé en rajoutant une variable MemoryStream pour savoir si le problème venait du SaveToStream ou du futur conteneur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    MS := TMemoryStream.Create;
    try
      // Récupère la taille max du tableau et ajoute 1 pour redimensionner
      SetLength(MonPop.Attachment,Length(MonPop.Attachment) + 1);
      MonPop.Attachment[Length(MonPop.Attachment)-1].FileName := TIdAttachment(IdMsg.MessageParts.Items[i]).FileName;
      MonPop.Attachment[Length(MonPop.Attachment)-1].Stream := TMemoryStream.Create;
      TIdAttachment(IdMsg.MessageParts.Items[i]).SaveToStream(MS);
     
    // Violation d'accès ci dessous  
      MS.SaveToStream(MonPop.Attachment[Length(Result.Attachment)-1].Stream);
    finally
      MS.free;
    end;
    Et le problème se retrouve encore une fois dès que je veux transférer le contenu vers les MemoryStream du tableau.

    Quelqu'un voit il d'où peut venir le problème ?

    [edit]
    C'est bon j'ai vu mon erreur
    un Result.Attachment qui trainait.
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

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

Discussions similaires

  1. Initialisation d'un tableau de structures dynamique
    Par mokochan dans le forum Débuter
    Réponses: 4
    Dernier message: 09/09/2013, 18h10
  2. Réponses: 7
    Dernier message: 24/11/2011, 10h41
  3. Initialisation d'un tableau dynamique
    Par TheBombadil dans le forum Débuter
    Réponses: 2
    Dernier message: 13/11/2010, 11h44
  4. Débutant : initialisation d'un tableau
    Par lebokto dans le forum C++
    Réponses: 7
    Dernier message: 02/11/2005, 15h50
  5. Initialisation d'un tableau de type STRUCT
    Par Axiome dans le forum MFC
    Réponses: 4
    Dernier message: 06/09/2005, 10h58

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