delphi - 如何获取delphi函数中参数传递的变量或对象节点的名称?

标签 delphi function variables 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;

有没有一种优雅的方法来识别传递给函数的变量名是什么?

最佳答案

一般来说,诸如记录字段名称或参数变量名称之类的符号名称不会被 native 代码编译器(例如Delphi)包含在可执行镜像中,因为 native 机器指令只关心偏移量和地址,而不关心名称。这就是为什么 Delphi 生成的 exe 比同等的 .NET 或 Java 应用程序小数百倍的原因之一。

但是,类型元数据(例如字段名称)对于“自给自足”的对象流非常有用。这种类型元数据通常被 native 代码编译器称为运行时类型信息 (RTTI)。

您可以尝试在类型声明周围启用 {$M+} 来编译上面的类型。请务必在之后立即设置 {$M-} 以避免使用不需要的类型名称使您的 exe 膨胀。

然后您将需要使用 Delphi RTTI 方法来访问记录结构的字段名称。

但是,我认为这不适用于您的示例代码,因为您将记录字段作为参数传递给另一个函数。要获取记录的第 n 个字段的名称,您需要记录类型。

您的 IsAccessPermission() 函数仅接收记录字段内容的值。它不知道使用哪个字段来传递值,甚至不知道是否使用了记录

关于delphi - 如何获取delphi函数中参数传递的变量或对象节点的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11302001/

相关文章:

delphi - 如何在Delphi中检测前进和后退鼠标按钮事件?

c - rand() 在我的自定义函数中不返回任何值

json - 如何使用XOJO从Web加载JSON?

delphi - EnumResourceNames 返回 Windows 错误 998(对内存位置的访问无效)

delphi - 如何指定项目特定的包设置?

user-interface - 如何在 MATLAB 中创建动态回调?

java - 为什么这个java优雅的配对方法没有给出正确的结果?

swift - 如何在两个 View Controller 之间传递(变化的)变量?

arrays - TextField 作为应用程序启动时的变量粘贴到 LocalNotification 中

delphi - 处理DbExpress SQL错误代码245