2010-06-24 11 views

cevap

9

Evet, bunu elde edebilirsiniz, aşağıdaki örnekler IExample türünü kullanarak nasıl ad alabileceğinizi gösterir. Eski Delphi 7 RTTI, TypInfo Ünitesi üzerinden yapıldı.

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. 

Sadece türden değil, GUID'den almak istediğinizi söylediniz. Bu, GUID'nin türlerine kayıt olmasını gerektirir. Delphi 7'deki RTTI türü almak için kullanılabilir.

Aşağıdakiler IExample'i döndürür.

Burada bir arabirimin GUID'sine Map TypeInfo() öğesini eşleyen örnek bir kayıt defteri var. İyileştirilmiş olabilir, ancak kavramı açıklamak için yaptım.

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. 

, daha sonra

RegisterInterface(TypeInfo(IExample)); 
+0

Mükemmel Robert çağırır kayıt defterine çok mükemmel sayesinde bir öğe eklemek için. –

3

Delphi 7'de, GUID'den RTTI'ye (veya Ad) kendi eşlemenizi oluşturmalısınız, çünkü Delphi 2010'da olduğu gibi RTTI bağlamı yoktur. RIIT'i kapsamlı bir şekilde kullanırım ve genellikle ünitenin başlangıç ​​bölümünde tüm ilginç türleri "kayıt eder" ve tipinfo işaretçisine dayanarak tüm türleri bulurum. Bu D7, D2007 ve D2010 için çalışır. Ayrıca bir türü kaydetmeyi ve neden bir şeyin neden bir şey yapamayacağını merak edebilirsiniz. nd.