मैं साबित कर दिया है कि मैं डेल्फी 2010 का उपयोग कर अपने GUID से एक अंतरफलक के नाम प्राप्त कर सकते हैं का उपयोग कर एक इंटरफेस की स्ट्रिंग नाम हो रही है (उदाहरण के लिए IMyInterface स्ट्रिंग 'IMyInterface' में बदल जाती। मैं में इस लक्ष्य को हासिल करना चाहते हैं डेल्फी 7 (संगतता के लिए)। क्या यह संभव है? या मौलिक कंपाइलर सीमाएं हैं।डेल्फी RTTI
उत्तर
हाँ आप इसे प्राप्त कर सकते हैं, IExample प्रकार तुम कैसे नाम प्राप्त कर सकते हैं का उपयोग कर निम्नलिखित शो। वर्ष डेल्फी 7 RTTI TypInfo यूनिट के माध्यम से किया गया था।
program Project6;
{$APPTYPE CONSOLE}
uses
SysUtils,TypInfo;
type
IExample = interface
['{4902F666-F3FC-4999-BD8C-F226851201D6}']
procedure blah;
end;
begin
Writeln(GetTypeName(TypeInfo(IExample)));
readln
end.
बस ध्यान दिया कि आपने कहा है कि आप इसे GUID से प्राप्त करना चाहते थे, न केवल प्रकार। इसके लिए GUID की रजिस्ट्री की आवश्यकता होगी। डेल्फी 7 में आरटीटीआई का उपयोग करने के लिए इस्तेमाल किया जा सकता है।
निम्नलिखित IExample GUID लौटने का समय लगेगा।
Writeln(GUIDToString(GetTypeData(TypeInfo(IExample)).Guid));
यहां एक उदाहरण रजिस्ट्री है जो इंटरफ़ेस के मैप टाइपइन्फो() को इसके GUID पर करेगी। यह अनुकूलित किया जा सकता है, लेकिन मैं अवधारणा को वर्णन करने के लिए किया था।
unit Unit11;
interface
uses
TypInfo,SysUtils, Contnrs;
type
TGuidMap = class(TObject)
Guid : TGUID;
TypeInfo : PTypeInfo;
end;
procedure RegisterInterface(InterfaceType : PTypeInfo);
function GetInterfaceType(Guid : TGUID) : PTypeInfo;
implementation
var
GuidMapList : TObjectList;
procedure RegisterInterface(InterfaceType : PTypeInfo);
var
Map : TGuidMap;
begin
Map := TGuidMap.Create;
Map.TypeInfo := InterfaceType;
Map.Guid := GetTypeData(InterfaceType).Guid;
GuidMapList.Add(Map);
end;
function GetInterfaceType(Guid : TGUID) : PTypeInfo;
var
I : Integer;
begin
result := nil;
for I := 0 to GuidMapList.Count - 1 do
begin
if IsEqualGUID(TGuidMap(GuidMapList.Items[I]).Guid,Guid) then
begin
result := TGuidMap(GuidMapList.Items[I]).TypeInfo;
break;
end;
end;
end;
Initialization
GuidMapList := TObjectList.Create(true);
finalization
GuidMapList.Free;
end.
रजिस्ट्री में एक आइटम जोड़ें करने के लिए आप तो
RegisterInterface(TypeInfo(IExample));
डेल्फी 7 में आपको GUID से RTTI (या नाम) में अपना स्वयं का मैपिंग बनाना चाहिए। यहां डेल्फी 2010 में कोई आरटीटीआई संदर्भ नहीं है। वहाँ typeinfo सूचक पर आधारित से मैं बड़े पैमाने पर है और आमतौर पर आर आई आई टी का उपयोग करें "रजिस्टर" इकाई कहीं केंद्रीय के प्रारंभ अनुभाग के सभी दिलचस्प प्रकार और सभी प्रकार के हैं। यह D7, D2007 और D2010 (के लिए काम करता है, लेकिन अधिक काम है अगर आप की जरूरत है इसे बनाएं)। आप एक प्रकार का पंजीकरण करना भूल सकते हैं और आश्चर्यचकित हो सकते हैं क्यों ओ कुछ क्यों नहीं हो सकता है nd।
- 1. RTTI
- 2. त्रुटि: -fno-rtti
- 3. सी ++ - RTTI/dynamic_cast
- 4. डेल्फी: निष्पादनयोग्य
- 5. क्या RTTI का उपयोग कर इंटरफ़ेस पर GUID का मान प्राप्त करना संभव है?
- 6. मैं RTTI के साथ डबल गुणों से TDateTime गुणों को कैसे अलग कर सकता हूं?
- 7. डेल्फी
- 8. डेल्फी
- 9. डेल्फी
- 10. डेल्फी
- 11. डेल्फी
- 12. डेल्फी
- 13. डेल्फी
- 14. डेल्फी
- 15. डेल्फी
- 16. डेल्फी
- 17. डेल्फी
- 18. डेल्फी
- 19. डेल्फी
- 20. डेल्फी
- 21. डेल्फी
- 22. डेल्फी
- 23. डेल्फी
- 24. डेल्फी
- 25. डेल्फी
- 26. डेल्फी
- 27. डेल्फी
- 28. डेल्फी
- 29. डेल्फी
- 30. डेल्फी
बहुत बढ़िया रॉबर्ट कहेंगे, बहुत बहुत शुक्रिया, एकदम सही है। –