Bonjour à toutes et tous,
Petit problème à soumettre à votre sagacité :
J'ai créé un record pour les gestion des erreurs dans mon application. Ce record comprend un code d'erreur et un message ainsi qu'un pointeur vers le message d'erreur d'origine. Ceci permet, en chaînant les record, de remonter une erreur depuis le niveau le plus bas vers le GUI....
Voici la déclaration du record :
Tout irait pour le mieux dans le meilleurs des mondes si je ne voulais pas pouvoir changer le type de ErrorCode.
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 //--------------------------------------------------------------------------- // @classname //--------------------------------------------------------------------------- pChainableIntegerError = ^TChainableIntegerError; //--------------------------------------------------------------------------- // @classname implémente la gestion des erreur chainées ayant un code d'erreur // de type entier. //--------------------------------------------------------------------------- TChainableIntegerError = record private _Parent, _Child: pChainableIntegerError; public // le code d'erreur ErrorCode: integer; // Le message associé ErrorMessage: string; // Permet de chaîner les erreurs sous la forma d'une liste doublement chaînée procedure Chain( pPreviousError: TChainableIntegerError ); // permet de réinitialiser l'erreur en supprimant les parents et enfants, // en vidant le emssage d'erreur et assignant 0 (zéro) au code d'erreur. procedure Clear; // Si l'erreur actuelle dispose d'un parent, pvError se voit assigné ce parent et la fonction renvoie True@br // Dans le cas contraire, pvError n'est pas modifié et la fonction renvoie False. function Parent( var pvError: TChainableIntegerError ): boolean; // Si l'erreur actuelle dispose d'un enfant, pvError se voit assigné cet enfant et la fonction renvoie True@br // Dans le cas contraire, pvError n'est pas modifié et la fonction renvoie False. function Child( var pvError: TChainableIntegerError ): boolean; end;
En effet, j'utilise généralement une énumération pour les codes d'erreur d'un module telle que
Et je n'ai pas une envie folle de ré-écrire un jeu de fonctions pour chaque type de record possible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part TAaeWmiError = ( weNoError, weNoConnection, weUnknownError );
L'idée serait donc de rendre le record générique afin de fixer plus tard le type de ErrorCode.
Manque de bol, je ne trouve pas la bonne formulation pour Delphi (XE8). :-(
En effet, en remplaçant "simplement" le record original par sa version générique, Delphi se plaint déjà au niveau de la déclaration du pointeur...
Je me suis dit" passons nous des pointeurs et déclarons les parent et enfant comme des records..."
Code : Sélectionner tout - Visualiser dans une fenêtre à part pChainableIntegerError<T> = ^TChainableIntegerError<T>;
La réponse est "E2086 Type 'TChainableIntegerError<T>' is not yet completely defined"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 TChainableIntegerError<T> = record private _Parent, _Child: TChainableIntegerError<T>;
Selon la doc, il faut passer par la déclaration d'un type pointeur auxiliaire mais Delphi n'accepte pas ma déclaration de pointeur...(cf plus haut)
Comme il n'est pas possible d'hériter un type record, je ne peux créer un record de base qui serait rendu générique dans un type descendant...
Donc, si quelqu'un avait idéalement une solution, à défaut une piste de recherche, je suis preneur.
En vous remerciant déjà de m'avoir lu jusqu'ici
Coyotte
ps: En utilisant une classe, il n'y aurait pas de problème... Mais je voudrais un record pour la facilité de gestion. (Pas d'instanciation, libération, ...)
Partager