En effet
Mais les records n'ont pas de destructeur, ne supporte pas l'héritage ni les interfaces et les allocations sont gérées différemment.
En effet
Mais les records n'ont pas de destructeur, ne supporte pas l'héritage ni les interfaces et les allocations sont gérées différemment.
Tient, des exemple de déclaration de constante Record:
Conversion String To Color - Utilisation de Fonctionnalité IdentToInt et IdentToColor avec le TMapEntry
Déclaration d'un tableau
Tableau Dynamique pointant sur Tableau Statiques
Déclaration de pointeur de fonction et structure
Je suis d'accord avec Mick605, les record c'est vraiement très ouvert, on peut aller vraiement très loin ...
Il y a une FAQ : "[QR] Comment tester si un Enregistrement est vide" en cours de débat, justement sur le teste d'un record vide, et l'utilisation d'une constante record pour donner la forme vide du record ...
Je déplore personnellement, l'évolution du record en pseudo classe, je pense qu'il faut faire un choix, soit un record pour l'organisation des données, soit un objet avec méthode et tout le tralalala (et rien n'empeche un objet d'utiliser un simple record pour des membres)
Sinon, on a perdu Sancha, depuis bien longtemps, il a eu sa réponse ...il a appuyé sur !
Le destructeur est implicite, Delphi doit s'en charger comme pour toute variable, je suppose.
Pour l'héritage ça doit pouvoir s'arranger non ? Avec un type record R2 dont un des champs serait de type record R1... Mais est ce possible ?
C'est de l'héritage façon système G bien sûr.
et le template pour tout les delphi >= 2005 :
Code xml : 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 <?xml version="1.0" encoding="utf-8" ?> <codetemplate xmlns="http://schemas.borland.com/Delphi/2005/codetemplates" version="1.0.0"> <template name="fullrec" invoke="manual"> <point name="recname"> <text> %ident% </text> <hint> nom de de l'enregistrement </hint> </point> <point name="fields"> <text> %fields% </text> <hint> champs de l'enregistrement </hint> </point> <description> déclaration d'enregistrement </description> <author> Dr.Who </author> <code language="Delphi" context="typedecl" delimiter="|"><![CDATA[ { T|recname| } type P|recname| = ^T|recname|; T|recname| = {packed} record {case integer of} |fields| // for delphi >= D2005 //class function Create(const |fields|): T|recname|; static; end; // Dynamic array //P|recname|DynArray = ^T|recname|DynArray; //T|recname|DynArray = array of T|recname|; // Pointer array //P|recname|s = ^T|recname|s; //T|recname|s = array[0..0] of T|recname|; // Fast creator //function |recname|Create(|fields|): T|recname|; const // Size of |recname| SizeOf|recname| = SizeOf(T|recname|); // Default value of |recname| //|recname|Default : T|recname| = (|fields|); ]]> </code> </template> </codetemplate>
sinon depuis delphi 2005 ou 2006 logiquement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 type {$J+} TMonRecord = record const X : integer = 10; const Y : integer = 10; end; {$J-}
et on peux aller plus loin en redéfinissant les types Delphi :
( D2009 up )
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 type PPoint = ^TPoint; TPoint = record public class function Create(const aX, aY: integer): TPoint; static; procedure SetTo(const aX, aY: integer); function IsEmpty: boolean; function GetDistanceFrom(const Pnt: TPoint): extended; class operator Implicit(A: Windows.TPoint): TPoint; class operator Implicit(A: TPoint): Windows.TPoint; class operator Implicit(A: TPoint): string; class operator Add(A, B: TPoint): TPoint; class operator Subtract(A, B: TPoint): TPoint; class operator Equal(A, B: TPoint): boolean; class operator NotEqual(A, B: TPoint): boolean; public X, Y : integer; end; TPointList = TList<TPoint>; const SizeOfPoint = SizeOf(TPoint);
Le record devrait de toute façon rester assez basique et l'idée du constructeur pour initialiser les données était vraiment bien ! Mais cet appel explicite () en diminue beaucoup l'intérêt...
Edit: Bien que le mot class (function Create) soit supporté, je n'en vois pas l'intérêt dans un record
Merci Doctor Who pour ces explications !
Au moins, je comprend pourquoi ce que j'essaye de faire n'est pas possible.
Bon, je vais essayer de bidouiller quite à abandonner l'idée de mettre yne valeur par défaut dans mon record. Au pire, c'est pas dramatique.
Merci à tous en tous cas ! Je vois que le débat fait rage.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager