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 :

EAccessViolation sur TStringList


Sujet :

Langage Delphi

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut EAccessViolation sur TStringList
    Bonjour,

    Je développe un code qui lit dans une base de donnée des références d'un catalogue, je construit un objet TReference avec les données et enfin je stocke le tout dans un TStringList. Voici à quoi cela ressemble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    i := 1;
    ZQuery.SQL.Add('SELECT * FROM ....');
    ZQuery.Open;
    while not ZQuery.eof do
    begin
        reference := TReference.Create;
        buildReferenceFromQuery(reference, ZQuery);
        ListRef.AddObject( IntToStr(i), reference);
        inc(i);
     
        ZQuery.Next;
    end;
    buildReferenceFromQuery, ne fait que remplir l'objet avec les valeurs issu de la bdd.

    Au total j'ai 4241 ligne de résultat, mais arrivé à 4041, la ligne ListRef.AddObject( IntToStr(i), reference); plante avec le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Le projet ImportExport.exe a déclenché la classe d'exception EAccessViolation avec le message 'Violation d'accès à l'adresse 005AD3D8 dans le module 'ImportExport.exe'. Lecture de l'adresse 00000000'.
    Mon objet reference existe bel et bien et il est correctement initialisé.

    Est ce que quelqu'un voit pourquoi ca plante à 4041 ?

    Je tiens à préciser aussi que quand je regarde la consommation mémoire du programme, elle grimpe en flèche. Avec 4040 objets le programme pèse plus de 100Mo en mémoire. Avez-vous aussi une idée sur le pourquoi de cette consommation excessive pour un simple objet reference définit 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
    15
    16
    17
    18
    19
    20
    21
    22
     
    TReference = class
      public
        id: Integer;
        code: String;
        libelle: THashtable;
        description: THashtable;
        ficheTechnique: THashtable;
        pageCatalogue: THashtable;
        photos: array[1..3] of string;
        prix: double;
        unite: string;
        dateModification: Integer;
        actif: Integer;
        orphelin: Integer;
        typeTarif: String;
        prixSurEtude: Integer;
        NOUVEAUTE_id: Integer;
        PROMOTION_id: Integer;
        publie: Integer;
        ordre: Integer;
    end;
    THashTable est une classe qui permet de faire une table de hachage sur des variants.


    Je remercie par avance tout ceux qui pourrons m'aider.

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    C'est bon j'ai trouvé. En fait le problème était due à une mauvaise initialisation d'un des champs de l'objet reference.

    Par contre je ne vois pas pourquoi ca faisait planté la TStringListe qui elle ne faisait que mémoriser l'objet.

    Enfin bon peu importe le problème est résolu.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 633
    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 633
    Points : 25 348
    Points
    25 348
    Par défaut
    Tu as un bouton Résolu, en bas, ... au lieu de modifier le titre

  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
    Au fait, pourquoi utiliser une TStringList, si ce n'est que pour stocker une liste d'objets. Jette un oeil à la classe TObjectList de l'unité Contnrs. F1 pour plus d'infos. Cela consommera déjà pas mal de mémoire en moins et sera plus rapide.

    Si pour une raison ou une autre tu as besoin de la recherche par index (renseignés avec les IntToStr(I)), tu devrais plutôt t'orienter vers TBucketList de la même unité. Ce sera beaucoup plus rapide (et consommera toujours moins de mémoire) que TStringList.
    (tu peux transtyper un integer en Pointer, ainsi que n'importe quel objet)

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

Discussions similaires

  1. Clear sur un TStringList
    Par ZenZiTone dans le forum Débuter
    Réponses: 4
    Dernier message: 20/03/2014, 16h54
  2. Réponses: 7
    Dernier message: 04/12/2013, 11h52
  3. Fonction dans une DLL agissant sur un TStringList
    Par Dr.Gang dans le forum C++Builder
    Réponses: 5
    Dernier message: 24/10/2009, 14h17
  4. [Debutant]Point sur TStringList
    Par adurandet dans le forum Débuter
    Réponses: 7
    Dernier message: 29/10/2007, 10h40
  5. EAccessViolation sur compilation sans les paquets
    Par hypomaniak dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/06/2007, 11h05

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