Delphi 2010 kullanarak GUID'sinden bir arabirimin adını alabildiğimi ispat ettim (örn. IMyInterface dizgisine dönüştürülmüş IMyInterface. Bunu yapmak istiyorum. Delphi 7 (uyumluluk için) Bu mümkün mü Yoksa temel derleyici sınırlamaları var mı?Delphi RTTI kullanarak bir arabirimin dize adını alma
cevap
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));
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.
Mükemmel Robert çağırır kayıt defterine çok mükemmel sayesinde bir öğe eklemek için. –