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