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.
- 1. Delphi RTTI: Özellik sınıfını alın
- 2. RTTI
- 3. Delphi Sınıf Yardımcısı RTTI GetMethod
- 4. Delphi: Geçersiz Klasör Adını Değiştirme
- 5. RTTI Kullanarak Değişken Adı Al
- 6. Klasörün adını bir yoldan alma
- 7. Bir montajın tam adını alma
- 8. Delphi'deki tüm Sınıf Yardımcılarını çalışma zamanında RTTI kullanarak bulun.
- 9. Delphi içinde dize bölme
- 10. RTTI kullanarak Delphi'de erişim alanına nasıl erişilir?
- 11. Otomatik özellik kullanarak bir arabirimin açık bir şekilde uygulanması
- 12. Bir arabirimin, bir arabirimin üzerine yazılması, PHP'de başka bir arabirimden devraldığı bir yöntemin üzerine yazıyor
- 13. Komut Dosyası adını Powershell'de alma
- 14. konstrüktör sınıfın sınıf adını alma
- 15. Kontrol edilmeyen radyo adını alma
- 16. Geçerli dizin adını alma ve node.js'yi kullanarak html sayfasında görüntüleme
- 17. Dize parametrelerine sahip Delphi yordamları
- 18. Vista'da Delphi ile bağlı USB bilgilerini alma
- 19. DFM Dosyasını kullanarak Delphi IDE
- 20. Yakut - CSV alma - dize
- 21. Gezinme özelliğine sahip bir Arabirimin kullanılması
- 22. Başka bir sınıftan dize değerleri alma
- 23. Delphi
- 24. Kabuk betiğine Canonical Time Zone adını alma
- 25. İstemcinin PC Adını Geri Alma? (Windows Auth)
- 26. Delphi 2010
- 27. TDateTime özelliklerini RTTI ile Double özelliklerinden nasıl ayırt edebilirim?
- 28. MATLAB dize olarak çıktısı alma
- 29. NSArray öğesinden dize değeri alma
- 30. Dize Yöntemi'nden "null" alma [java]
Mükemmel Robert çağırır kayıt defterine çok mükemmel sayesinde bir öğe eklemek için. –