Salut à tous,
Je viens vers vous car j'ai un problème de déréferencement de pointeur sur mes objets de ma TObjectList. Je m'explique :
Je dispose :
D'une classe mère TSurveillance instanciant deux TobjectList FListe_Definition : TObjectList;
FListe_Defauts : TObjectList;
D'une classe descendante de TSurveillance s'intitulant TSurveillance_Arinc429
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 TSurveillance = class(TObject) private { Déclarations privées } Function TickToDate(const _Tick : cardinal) : String; protected { Déclarations protégées } FListe_Definition : TObjectList; FListe_Defauts : TObjectList; Procedure Set_Liste_Definition(_Liste_Definition : TObjectList); virtual; Procedure Set_Liste_Defauts(_Liste_Defauts : TObjectList); virtual; Procedure Gerer_Redondance (_Resultat_Surveillance : TResultat_Surveillance); virtual; public { Déclarations publiques } Constructor Create; overload; virtual; Constructor Create(_Liste_Definition : TObjectList); overload; virtual; Destructor Destroy; override; Property Liste_Definition : TObjectList read FListe_Definition write Set_Liste_Definition ; Property Liste_Defauts : TObjectList read FListe_Defauts write Set_Liste_Defauts ; // Fonctions d'accès à la liste des défauts Procedure Reset_Liste_Defauts ; end;
Le soucis apparait dans chaque fonction utilisées de la classe TSurveillance_Arinc429. Par exemple celle-ci :
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 TSurv_ARINC429 = class(TSurveillance) private { Déclarations privées } protected { Déclarations protégées } public { Déclarations publiques } Conforme : Boolean; Constructor Create; Override; Constructor Create(_List_Def_Arinc : TObjectList); Overload; Override; Destructor Destroy; Override; ...
La fonction Gerer_Redondance permet de maintenir une liste d'objets de type TResultat_Arinc429. Resultat_Arinc429 est passé en paramètre d'entrée par copie. Cette fonction appartient à la classe générique TSurveillance.
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 Function TSurv_ARINC429.Surv_Data_Max(_Label, _Data32b, _Borne_Sup: Cardinal) : Boolean; Var Index : Integer; Donnee : Cardinal; Resultat_Arinc429 : TResultat_Arinc429 ; Begin Result := True ; // On parcourt le tableau de définitions de labels Arinc For Index := 0 To Liste_Definition.Count - 1 Do // Si le label est trouvé et que l'on trouve la donnée à surveiller alors If TDEF_ARINC429(Liste_Definition.Items[Index]).Label_Arinc = _Label Then Begin // On récupère le LSB et le MSB de la donnée à évaluer nécessaire au masque Donnee := Get_Masked_Data(_Data32b,TDEF_ARINC429(Liste_Definition.Items[Index]).LSB_Data, TDEF_ARINC429(Liste_Definition.Items[Index]).MSB_Data); // On teste si la donnée est bien dans l'intervalle de tolérance If Donnee > _Borne_Sup Then Begin Result := False ; Resultat_Arinc429 := TResultat_Arinc429.Create(TDEF_ARINC429(Liste_Definition.Items[Index]).Cle, False, TDEF_ARINC429(Liste_Definition.Items[Index]).Code_Defaut, Format(S_DEFAUT_BORNE_SUP_A429, [TDEF_ARINC429(Liste_Definition.Items[Index]).DataName, _Label, _Borne_Sup, Donnee])) End Else Resultat_Arinc429 := TResultat_Arinc429.Create(TDEF_ARINC429(Liste_Definition.Items[Index]).Cle, True, TDEF_ARINC429(Liste_Definition.Items[Index]).Code_Defaut, ''); Gerer_Redondance(Resultat_Arinc429) ; Resultat_Arinc429.Free ; End; End;
Lorsque je fais Resultat_Arinc429.Free, il me détruit également l'objet passé par copie et présent dans la liste d'objets, or je souhaite qu'il soit gardé !
J'ai essayé pas mal de solutions, à savoir mettre OwnsObject à false sur la variable FListeDefauts mais rien n'y fait
J'espère avoir été assez clair. Si quelqu'un à une idée d'où vient mon problème, j'attends avec impatience vos propositions...
Merci d'avance !
Partager