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:
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é.
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;
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:
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 !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 procedure TPedroGraphLineCollectionIem.ReadListData(Reader: TReader); begin end;
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 ?
Partager