日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

RTTI(三)相关函数1【转自大富翁】

發布時間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RTTI(三)相关函数1【转自大富翁】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第三部分RTTI相關函數

GetTypeData 函數

GetPropInfo 函數
FindPropInfo 函數
GetPropInfos 函數
SortPropList 函數

GetPropList 函數

GetObjectPropClass 函數
PropType / PropIsType 函數
IsPublishedProp 函數
IsStoredProp 函數
FreeAndNilProperties 函數
SetToString / StringToSet 函數
GetEnumName / GetEnumValue / GetEnumNameValue 函數

GetTypeData 函數

GetTypeData 函數根據 TTypeInfo 指針獲得 TTypeData 的地址。

function GetTypeData(TypeInfo: PTypeInfo): PTypeData;
asm
XOR? EDX,EDX? ; EDX 清零
MOV? DL,[EAX].TTypeInfo.Name.Byte[0]? ; 獲得 Name 字符串長度
LEA? EAX,[EAX].TTypeInfo.Name[EDX+1]? ; 獲得 TTypeData 的地址
end;

GetPropInfo 函數

GetPropInfo 函數用于獲得屬性的 RTTI 指針 PPropInfo。它有四種重載形式,后面三種重載的實現都是調用第一種形式。AKinds 參數用于限制屬性的類型,如果得到的 PPropInfo 不屬于指定的類型,則返回 nil。

function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string): PPropInfo;

function GetPropInfo(Instance: TObject; const PropName: string;
AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(AClass: TClass; const PropName: string;
AKinds: TTypeKinds = []): PPropInfo;
function GetPropInfo(TypeInfo: PTypeInfo; const PropName: string;
AKinds: TTypeKinds): PPropInfo;

FindPropInfo 函數

FindPropInfo 函數根據屬性名稱獲得屬性的 RTTI 指針,它只是在 GetPropInfo 函數的基礎上加上了錯誤檢查功能,如果沒有屬性 RTTI 信息,則觸發 EPropertyError 異常。

function FindPropInfo(Instance: TObject; const PropName: string): PPropInfo;
function FindPropInfo(AClass: TClass; const PropName: string): PPropInfo;

GetPropInfos 函數

GetPropInfos 函數的功能是把一個類(class)所有屬性 RTTI 指針 PPropInfo 填充至傳入的參數 PPropList 數組中。

注意:這個函數不負責分配該數組的內容,使用前必須根據屬性的數量分配足夠的空間。該數組結束后必須清除分配的內容。

procedure GetPropInfos(TypeInfo: PTypeInfo; PropList: PPropList);

注:使用 GetPropList 實現相同的功能更方便。

SortPropList 函數

SortPropList 可以對 GetPropInfos 函數填充的屬性信息指針數組按屬性名稱排序。

procedure SortPropList(PropList: PPropList; PropCount: Integer);

在 VCL 中 SortPropList 只被 GetPropList 函數使用。

GetPropList 函數

GetPropList 函數同 GetPropInfos 一樣,填充 PPropList 數組。GetPropList 實際上是調用 GetPropInfos 進行填充工作,最后返回已填充的屬性的數量。

function GetPropList(TypeInfo: PTypeInfo; TypeKinds: TTypeKinds;
PropList: PPropList; SortList: Boolean): Integer;

function GetPropList(TypeInfo: PTypeInfo; out PropList: PPropList): Integer;
function GetPropList(AObject: TObject; out PropList: PPropList): Integer;

注意:GetPropList 的內存分配有點混亂,上面第一個 GetPropList 必須自己分配 PPrpList 數組的內存,后面二個 GetPropList 會自動分配 PPropList 數組的內存。造成這種情況的原因是:第一個 GetPropList 可以設置 TypeKinds 參數限制只返回指定類型的屬性,這樣就不能直接得到可能返回的屬性數量。TypeKinds 參數可以設置為 tkAny,表示返回所有數據類型的屬性。

第一個 GetPropList 函數可以設置 SortList 參數對屬性名稱進行排序。它實際上是調用第二個 GetPropList 并調用 SortPropList 函數執行排序。

注意:PPropList 不再使用的時候,要記得使用 FreeMem 函數清除數組內存(根據返回值是否大于1)。

GetObjectPropClass 函數

GetObjectPropClass 函數用于返回對象類型的屬性所屬的類(class)。

function GetObjectPropClass(Instance: TObject; PropInfo: PPropInfo): TClass;
function GetObjectPropClass(Instance: TObject; const PropName: string): TClass;
function GetObjectPropClass(PropInfo: PPropInfo): TClass;

這個函數被 SetObjectProp 函數使用,用于參數檢驗。

PropType / PropIsType 函數

PropType 函數用于獲得屬性的數據類型。

function PropType(Instance: TObject; const PropName: string): TTypeKind;
function PropType(AClass: TClass; const PropName: string): TTypeKind;

PropIsType 判斷屬性是否屬于某種數據類型。它調用 PropType 實現功能。

function PropIsType(Instance: TObject; const PropName: string;
TypeKind: TTypeKind): Boolean;
function PropIsType(AClass: TClass; const PropName: string;
TypeKind: TTypeKind): Boolean;

IsPublishedProp 函數

IsPublishedProp 函數用于判斷屬性是否是 published 屬性,它通過檢查該屬性 RTTI 指針是否等于 nil 來實現功能。

function IsPublishedProp(Instance: TObject; const PropName: string): Boolean;
function IsPublishedProp(AClass: TClass; const PropName: string): Boolean;

IsPublishedProp 函數沒有被 VCL 使用。

IsStoredProp 函數

IsStoredProp 函數使用屬性信息中的 TPropInfo.StoredProp 函數指針來調用屬性定義時用 stored 關鍵字定義的函數的結果。

這個函數被用于 Delphi 持續機制,TWriter.WriteProperties 方法調用 IsStoredProp 判斷是否需要把該屬性的值寫入流中。

function IsStoredProp(Instance: TObject; PropInfo: PPropInfo): Boolean;
function IsStoredProp(Instance: TObject; const PropName: string): Boolean;

FreeAndNilProperties 函數

FreeAndNilProperties 函數用于清除一個對象的所有 published 的對象類型的屬性的對象。這個函數調用 GetObjectProp 執行獲得對象屬性的對象句柄,并調用對象的 Free 方法清除這個對象,然后調用 SetObjectProp 設置該屬性為 nil。

procedure FreeAndNilProperties(AObject: TObject);

我不知道這個函數能用在哪里,至少 VCL 中沒有使用這個函數。

SetToString / StringToSet 函數

SetToString 和 StringToSet 是兩個 RTTI 輔助函數,它們把集合值轉換為字符串,或者把字符串轉換為集合值。

function SetToString(PropInfo: PPropInfo; Value: Integer;
Brackets: Boolean = False): string;

function StringToSet(PropInfo: PPropInfo; const Value: string): Integer;

注意:這里的集合值最多只能包含 32 個元素(4 bytes),這是集合 RTTI 的限制。

GetEnumName / GetEnumValue / GetEnumNameValue 函數

GetEnumName 函數根據枚舉整數值返回枚舉字符串。它可以返回以下三種枚舉名稱:

Integer:直接返回 IntToStr(Integer)
Boolean:返回 True/False
Enum? :返回 TTypeData^.NameList 中存儲的枚舉名稱

function GetEnumName(TypeInfo: PTypeInfo; Value: Integer): string;

GetEnumValue 函數根據枚舉字符串返回枚舉整數值。它與 GetEnumName 類似,可以返回三種枚舉的整數值,但對于 Enum 類型,它調用了 GetEnumNameValue 函數。

function GetEnumValue(TypeInfo: PTypeInfo; const Name: string): Integer;

GetEnumNameValue 函數與 GetEnumValue 函數功能差不多,但它是個匯編函數,只能返回純枚舉類型的值。其工作原理也是匹配 TTypeData^.NameList 值。

function GetEnumNameValue(TypeInfo: PTypeInfo; const Name: string): Integer;

注意:GetEnumNameValue 隱藏在 Implementation 段,不能直接使用,它是為 GetEnumValue 函數服務的。

轉載于:https://www.cnblogs.com/xiuyusoft/archive/2011/06/15/2081654.html

總結

以上是生活随笔為你收集整理的RTTI(三)相关函数1【转自大富翁】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。