2010-06-24 2 views
6

मैं साबित कर दिया है कि मैं डेल्फी 2010 का उपयोग कर अपने GUID से एक अंतरफलक के नाम प्राप्त कर सकते हैं का उपयोग कर एक इंटरफेस की स्ट्रिंग नाम हो रही है (उदाहरण के लिए IMyInterface स्ट्रिंग 'IMyInterface' में बदल जाती। मैं में इस लक्ष्य को हासिल करना चाहते हैं डेल्फी 7 (संगतता के लिए)। क्या यह संभव है? या मौलिक कंपाइलर सीमाएं हैं।डेल्फी RTTI

उत्तर

9

हाँ आप इसे प्राप्त कर सकते हैं, 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)); 
+0

बहुत बढ़िया रॉबर्ट कहेंगे, बहुत बहुत शुक्रिया, एकदम सही है। –

3

डेल्फी 7 में आपको GUID से RTTI (या नाम) में अपना स्वयं का मैपिंग बनाना चाहिए। यहां डेल्फी 2010 में कोई आरटीटीआई संदर्भ नहीं है। वहाँ typeinfo सूचक पर आधारित से मैं बड़े पैमाने पर है और आमतौर पर आर आई आई टी का उपयोग करें "रजिस्टर" इकाई कहीं केंद्रीय के प्रारंभ अनुभाग के सभी दिलचस्प प्रकार और सभी प्रकार के हैं। यह D7, D2007 और D2010 (के लिए काम करता है, लेकिन अधिक काम है अगर आप की जरूरत है इसे बनाएं)। आप एक प्रकार का पंजीकरण करना भूल सकते हैं और आश्चर्यचकित हो सकते हैं क्यों ओ कुछ क्यों नहीं हो सकता है nd।