Ple*_*rds 2 delphi variables function parameter-passing delphi-2006
在Java中,我们有类似的地方VarName.toString来描述var的名称.
我在Delphi中有一个代码,我需要实现相同的功能,因为我有一个record类型,我需要识别许多子字符串:
type
THierarchyAccess = String; // receive the user permissions from the MySQL DB
THierarchy = record
MOD_HIERARQUIA : THierarchyAccess; // 'BROWSE_ONLY', 'MANAGE', 'NONE'...
MOD_OPERADORES : THierarchyAccess;
MOD_ESTATISTICAS : THierarchyAccess;
MOD_AUDITORIA : THierarchyAccess;
MOD_HOMEPAGE : THierarchyAccess;
MOD_HOTSITES : THierarchyAccess;
MOD_MATRIZ : THierarchyAccess;
MOD_NOTICIAS : THierarchyAccess;
MOD_VISITANTES : THierarchyAccess;
...
end;
...
function TAccess.IsAccessPermited(apNeed, apHave: String): Boolean;
begin
// HERE I need to know not only the content of "apHave",
// but if it came from THierarchy.MOD_HOTSITES or THierarchy.MOD_MATRIZ etc.
end;
...
if IsAccessPermited('BROWSE_ONLY', MyHierarchy.MOD_HOTSITES) then Form2.Open;
Run Code Online (Sandbox Code Playgroud)
有没有一种优雅的方法来识别传递给函数的变量名称是什么?
通常,诸如记录字段名称或参数变量名称之类的符号名称不能由诸如Delphi的本机代码编译器包括在可执行映像中,因为本机机器指令仅关注偏移和地址,而不是名称.这就是为什么Delphi生成的exes比同等的.NET或Java应用程序小几百倍的原因之一.
但是,类型元数据(如字段名称)对"自足"对象流可能很有用.此类型元数据通常由本机代码编译器称为运行时类型信息(RTTI).
您可以尝试编译上面的类型,并{$M+}在类型声明周围启用.请务必{$M-}立即设置,以避免使用不需要的类型名称膨胀您的exe.
然后,您需要使用Delphi RTTI方法来访问记录结构字段的名称.
但是,我认为这不适用于您的示例代码,因为您将记录字段作为参数传递给另一个函数.要获取记录的第n个字段的名称,您需要记录类型.
您的IsAccessPermitted()函数只接收记录字段内容的值.它不知道用什么字段来传递值,或者甚至根本不使用记录