Deux Classes avec le même nom déclaré dans Deux CPP différents
Selon vous, est-ce un bug ?
Pour info c'est dans XE2 Update 4, j'ai pas testé avec d'autres versions
J'ai DEUX CPP :
- TFormMachin
- TFormBidule
Dans chaque CPP , j'ai déclaré un TComboObj
TComboObj est interne au CPP, aucune référence dans le H
TComboObj est ajouté par Items->AddObject et utilisé par Items->Objects[]Le but étant d'avoir un objet contenant des infos permettant de gérer des Items de ComboBox
Dans TFormMachin
Dans TFormBidule
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class TComboObj : public TObject { public: /*constructor*/__fastcall TComboObj(const AnsiString AIdent) : Ident(AIdent) {ShowMessage("TFormMachin::" + ClassName());} // Membres Publiques AnsiString Ident; /*destructor*/virtual __fastcall ~TComboObj() {ShowMessage("TFormMachin::~" + ClassName());} };
Pour tester :
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 class TComboObj : public TObject { public: /*constructor*/__fastcall TComboObj(const AnsiString AIdent) : Code(0), Ident(AIdent) {ShowMessage("TFormBidule::" + ClassName() + "(s)");} /*constructor*/__fastcall TComboObj(const int ACode, const AnsiString AIdent) : Code(ACode), Ident(AIdent) {ShowMessage("TFormBidule::" + ClassName() + "(i, s)");} // Membres Publiques int Code; AnsiString Ident; /*destructor*/virtual __fastcall ~TComboObj() {ShowMessage("TFormBidule::~" + ClassName());} };
Joli, il se trompe de destructeur, histoire d'obj !
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 void __fastcall TFormMachin::FormDblClick(TObject *Sender) { TComboObj* obj = new TComboObj(-1); // ShowMessage TFormMachin::TComboObj delete obj; // TFormMachin::~TComboObj } void __fastcall TFormBidule::FormDblClick(TObject *Sender) { TComboObj* obj = new TComboObj(-1, "Mon Bidule"); // ShowMessage TFormBidule::TComboObj(i, s) try {delete obj;} // ShowMessage TFormMachin::~TComboObj catch(const Exception &e) {ShowMessage("Mon Bidule " + e.Message);} // VA pour destruction de la Chaine TComboObj* obj2 = new TComboObj("Mon autre Bidule"); // ShowMessage TFormMachin::TComboObj ??? delete obj2; // TFormMachin::~TComboObj ??? }
Il se trompe même de constructeur si même paramètre !
La liaison des OBJ a fait des merveilles !
Il pourrait signaler un problème, au moins un warning !
Si vous pensez que c'est un bug ou un manque d'info du lieur, j'irais le mettre dans le Quality Central
Si vous pensez que c'est une erreur de conception, c'est pas totalement faux, j'avais du code dupliqué pouvant être refactoré
En définissant un namespace ou un nom de classe différente, cela résout évidemment le problème !
Personnellement, j'ai déplacé mon code dans une unité commune utilisée par les différentes TForm utilisant des Combo (toujours associé à un Ident Chaine et à une énumération)
J'ai refactoré mon code pour éviter ce problème éviter les doublons surtout pour TIdentObjConnectionQuality (utilisé deux fois mais codé différement deux fois pour le même résultat)
le code suivant pour les curieux, les textes sont dans un fichier de lang
Ident c'est un code texte équivalent à un System.TypInfo.GetEnumValue\GetEnumName mais en utilisant System.Classes.IdentToInt\IntToIdent
C'est plus léger que les template GET_ENUM_TYPEINFO\DECLARE_ENUM_TYPEINFO
TIdentObjConnectionQuality est utilisé dans DEUX TForm, je n'ai plus de code en double, c'est nettement plus propre
TIdentObjTestConnectionDepth est utilisé dans une seule TForm
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90 //--------------------------------------------------------------------------- #ifndef ShaiDVRDahuaTechnology_IHM_UtilsH #define ShaiDVRDahuaTechnology_IHM_UtilsH //--------------------------------------------------------------------------- #include <vcl.h> //--------------------------------------------------------------------------- #include "ShaiDVRDahuaTechnologyLibraryClasses.h" //--------------------------------------------------------------------------- /* Forward Declarations */ class TShaiLang; namespace ShaiDVRDahuaTechnology { namespace IHM_Utils { //--------------------------------------------------------------------------- // ShaiDVRDahuaTechnology::IHM_Utils::TComboManager - //--------------------------------------------------------------------------- class TComboManager : public TObject { public: // Méthodes publiques static void FillCombo(TComboBox *ACombo, TClass AClass, int CurrentValue, int LowValue, int Count, TShaiLang *AShaiLang); static void ClearCombo(TComboBox *ACombo); }; //--------------------------------------------------------------------------- // ShaiDVRDahuaTechnology::IHM_Utils::TIdentObj - //--------------------------------------------------------------------------- class TIdentObj : public TObject { public: /*constructor*/__fastcall TIdentObj(const AnsiString AIdent) : Ident(AIdent) {} // Membres Publiques AnsiString Ident; }; //--------------------------------------------------------------------------- // ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjConnectionQuality - //--------------------------------------------------------------------------- class TIdentObjConnectionQuality : public TIdentObj { public: // Constructeurs Publiques /*constructor*/__fastcall TIdentObjConnectionQuality(int AValue) : TIdentObj(TShaiDVRDahuaTechnologyClientManager::ConnectionQualityToIdent((TShaiDVRDahuaTechnologyConnectionQuality)AValue)), Value((TShaiDVRDahuaTechnologyConnectionQuality)AValue) {} // Membres Publiques TShaiDVRDahuaTechnologyConnectionQuality Value; }; //--------------------------------------------------------------------------- // ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjTestConnectionDepth - //--------------------------------------------------------------------------- class TIdentObjTestConnectionDepth : public TIdentObj { public: // Constructeurs Publiques /*constructor*/__fastcall TIdentObjTestConnectionDepth(int AValue) : TIdentObj(TShaiDVRDahuaTechnologyClientManager::TestConnectionDepthToIdent((TShaiDVRDahuaTechnologyTestConnectionDepth)AValue)), Value((TShaiDVRDahuaTechnologyTestConnectionDepth)AValue) {} // Membres Publiques TShaiDVRDahuaTechnologyTestConnectionDepth Value; }; //--------------------------------------------------------------------------- // ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjFactory - //--------------------------------------------------------------------------- typedef TClass TIdentObjClass; class TIdentObjFactory : public TObject { public: // Fabrique d'instance static TIdentObj* Create(TIdentObjClass AClass, int AValue); }; }; /* namespace IHM_Utils */ }; /* namespace ShaiDVRDahuaTechnology */ //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- #endif
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 //--------------------------------------------------------------------------- #pragma hdrstop //--------------------------------------------------------------------------- #include "ShaiDVRDahuaTechnology_IHM_Utils.h" //--------------------------------------------------------------------------- #include "ShaiLang.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // ShaiDVRDahuaTechnology::IHM_Utils::TComboManager - //--------------------------------------------------------------------------- using ::ShaiDVRDahuaTechnology::IHM_Utils::TComboManager; //--------------------------------------------------------------------------- /*static*/ void TComboManager::FillCombo(TComboBox *ACombo, TClass AClass, int CurrentValue, int LowValue, int Count, TShaiLang *AShaiLang) { ACombo->ItemIndex = -1; for (int i = LowValue; i < Count; i++) { TIdentObj *Ident = TIdentObjFactory::Create(AClass, i); String IdentText = AShaiLang->Translate(Ident->Ident, AClass->ClassName()); ACombo->Items->AddObject(IdentText, Ident); if (CurrentValue == i) ACombo->ItemIndex = ACombo->Items->Count - 1; } } //--------------------------------------------------------------------------- /*static*/ void TComboManager::ClearCombo(TComboBox *ACombo) { for (int i = 0; i < ACombo->Items->Count; i++) delete ACombo->Items->Objects[i]; ACombo->Items->Clear(); } //--------------------------------------------------------------------------- // ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjFactory - //--------------------------------------------------------------------------- using ::ShaiDVRDahuaTechnology::IHM_Utils::TIdentObj; using ::ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjClass; using ::ShaiDVRDahuaTechnology::IHM_Utils::TIdentObjFactory; //--------------------------------------------------------------------------- /*static*/ TIdentObj* TIdentObjFactory::Create(TIdentObjClass AClass, int AValue) { // équivalent C++ du code Delphi "Result := AClass.Create(AValue);" TIdentObj *Result = NULL; if (AClass == __classid(TIdentObjConnectionQuality)) Result = new TIdentObjConnectionQuality(AValue); else if (AClass == __classid(TIdentObjTestConnectionDepth)) Result = new TIdentObjTestConnectionDepth(AValue); return Result; }
Partager