gpt4 book ai didi

delphi - 如何在 Delphi 中使用 RTTI 或 TypeInfo 获取枚举的有效范围

转载 作者:行者123 更新时间:2023-12-03 15:20:56 29 4
gpt4 key购买 nike

我在测试项目中使用 RTTI 来评估枚举值,最常见的是对象的属性。如果枚举超出范围,我想显示类似于评估/修改 IDE 窗口将显示的文本。类似于“(出界)255”。

下面的示例代码使用 TypeInfo 将枚举之外的值的问题显示为使用 GetEnumName 时的访问冲突。任何使用 RTTI 或 TypeInfo 的解决方案都会对我有帮助,我只是不知道测试代码中的枚举类型

program Project60;

{$APPTYPE CONSOLE}

{$R *.res}

uses
System.SysUtils, TypInfo;

Type
TestEnum = (TestEnumA, TestEnumB, TestEnumC);

const
TestEnumUndefined = TestEnum(-1);

procedure WriteEnum(const ATypeInfo: PTypeInfo; const AOrdinal: Integer);
begin
WriteLn(Format('Ordinal: %d = "%s"', [AOrdinal, GetEnumName(ATypeInfo, AOrdinal)]));
end;


var
TestEnumTypeInfo: PTypeInfo;
begin

try
TestEnumTypeInfo := TypeInfo(TestEnum);

WriteEnum(TestEnumTypeInfo, Ord(TestEnumA));
WriteEnum(TestEnumTypeInfo, Ord(TestEnumB));
WriteEnum(TestEnumTypeInfo, Ord(TestEnumC));
WriteEnum(TestEnumTypeInfo, Ord(TestEnumUndefined)); //AV

except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
ReadLn;
end.

最佳答案

使用GetTypeData()PTypeInfo 获取更多详细信息,例如:

procedure WriteEnum(const ATypeInfo: PTypeInfo; const AOrdinal: Integer);
var
LTypeData: PTypeData;
begin
LTypeData := GetTypeData(ATypeInfo);
if (AOrdinal >= LTypeData.MinValue) and (AOrdinal <= LTypeData.MaxValue) then
WriteLn(Format('Ordinal: %d = "%s"', [AOrdinal, GetEnumName(ATypeInfo, AOrdinal)]))
else
WriteLn(Format('Ordinal: %d (out of bound)', [AOrdinal]));
end;

关于delphi - 如何在 Delphi 中使用 RTTI 或 TypeInfo 获取枚举的有效范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51899181/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com