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

Composants VCL Delphi Discussion :

[Propriété personnalisée] Erreur de lecture du flux


Sujet :

Composants VCL Delphi

  1. #1
    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 [Propriété personnalisée] Erreur de lecture du flux
    Bonjour à tous

    Voila, j'ai créé une propriété personnalisée qui est une liste de doublons. Je l'ai associée avec une boîte de dialogue pour l'édition en designtime. Jusqu'ici tout va bien.
    Maintenant j'aimerais que les valeurs soient enregistrées dans le .dfm et là, tout se complique. Voici ce que j'ai fait:
    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
     
      TPedroGraphLineCollectionIem = class(TCollectionItem)
      published
        property PointList: TPedroIntegerCoupleList read FList write SetList
          stored GetStored;
     
    ...
    procedure TPedroGraphLineCollectionIem.DefineProperties(Filer: TFiler);
    begin
      inherited;
      //Spécification d'une nouvelle propriété:
      //'PointList' : le nom de la propriété
      //ReadListData: la procedure de lecture
      //WriteListData: la procedure d'écriture
      //FList.Count > 0 : Est-ce que la liste a des données
      Filer.DefineProperty('PointList', ReadListData, WriteListData,
        (FList.Count > 0));
    end;
    ...
    procedure TPedroGraphLineCollectionIem.ReadListData(Reader: TReader);
    var
      Val1, Val2: Integer;
    begin
      with Reader do
      begin
        //Début de lecture d'une liste
        ReadListBegin;
        //Tant que la liste n'est pas terminée
        while not EndOfList do
        begin
          //Lecture de la première valeur
          Val1 := ReadInteger;
          //Lecture de la seconde valeur
          Val2 := ReadInteger;
          //Ajout du doublon dans la liste
           FList.AddCouple(Val1, Val2);
        end;
        //Fin de lecture d'une liste
        ReadListEnd;
      end;
    end;
    ...
    procedure TPedroGraphLineCollectionIem.WriteListData(Writer: TWriter);
    var
      I: Integer;
    begin
      with Writer do
      begin
        //Début d'écriture d'une liste
        WriteListBegin;
        for I := 0 to Count - 1 do
        begin
          //Ecriture de la valeur 1
          WriteInteger(FList[I].Value1);
          //Ecriture de la valeur 2
          WriteInteger(FList[I].Value2);
        end;
        //Fin d'écriture d'une liste
        WriteListEnd;
      end;
    end;
    WriteListData fonctionne parfaitement et m'inscrit bien toutes les valeurs. En revanche, ReadListData plante systématiquement et m'indique qu'il n'arrive pas à lire la propriété.
    Il est impossible de vérifier si FList est créé ou non. Ceci dit, je le crée dans le constructeur donc il devrait exister.
    Si je commente entièrement ReadListData tout en laissant la procedure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    procedure TPedroGraphLineCollectionIem.ReadListData(Reader: TReader);
    begin
    end;
    Ca fait la même chose. Par contre, si je supprime les lignes correspondant à cette liste dans le .dfm, ça marche mais du coup, il ne charge rien !
    Pour info, TPedroGraphLineCollectionIem est de type TCollectionItem contenu dans un TOwnedCollection lui-même contenu dans mon composant hérité de TCustomControl.

    J'ai loupé un truc ?
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  2. #2
    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
    C'est bon, j'ai trouvé.
    Pour information, il y avait un problème du fait que la propriété que j'essayais d'écrire était en published. Les propriétés published sont théoriquement automatiquement écrites dans le .dfm.
    Or, dans mon cas, il n'y avait rien. Donc j'ai défini cette propriété avec son Writer et son Reader. Il écrivait bien les données mais était incapable de les lire. D'où mon étonnement.
    Pour régler le problème: j'ai passé stored de la propriété à false (pour que Delphi n'écrive rien) et défini une nouvelle InternalPointList avec le même reader et writer et ça marche.
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  3. #3
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    bien vu, je ne trouvais pas ce qui clochait dans ton code, bravo et merci d'avoir donner la solution.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  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 Paul TOTH Voir le message
    bien vu, je ne trouvais pas ce qui clochait dans ton code, bravo et merci d'avoir donner la solution.
    C'est la moindre des choses, le forum est là pour ça après tout

    Pour être plus complet, voici ce que je pense qu'il se passait:

    • La liste est de type inconnu selon Delphi (c'est une TList<TMachinChose> TMachinChose étant un record) et ne sait donc pas comment l'enregistrer.
    • Lorsque j'enregistrais mes données, Delphi ne connaissant pas ce type, n'enregistrait pas les données. En revanche, comme je définissais plus loin une propriété du même nom, l'enregistrement se faisait avec mon WriteListData
    • Au chargement, Delphi voyant la propriété published essaye de charger selon ses propres méthodes et évidemment plante puisqu'il ne comprend pas qu'il faut utiliser ReadListData.

    C'est pour ça que le Writer marchait mais pas le Reader: il n'était même pas utilisé !
    Donc, à première vue, les propriétés définies par DefineProperty se chargent APRES que Delphi ait tenté de charger les propriétés published.

    Par contre, je pensais vraiment qu'il était possible de surcharger un reader/writer d'une propriété quelconque en published. Il faut croire que non
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

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

Discussions similaires

  1. [XL-2007] Problème avec la lecture VBA des Propriétés personnalisées / fichiers XLSX
    Par Fambross dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/02/2013, 06h53
  2. Réponses: 2
    Dernier message: 07/05/2009, 09h12
  3. Erreur de lecture sur BD Access avec delphi
    Par e120650 dans le forum Bases de données
    Réponses: 1
    Dernier message: 10/06/2005, 10h17
  4. Réponses: 2
    Dernier message: 31/05/2005, 07h04
  5. Erreur de lecture du flux sous SQLServer
    Par smazaudi dans le forum Bases de données
    Réponses: 4
    Dernier message: 29/03/2005, 14h30

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