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

如何获取delphi函数中参数传递的变量或对象节点的名称?,delphi,function,variables,parameter-passing,delphi-2006,Delphi,Function,Variables,Parameter Passing,Delphi 2006,在Java中,我们有类似于VarName.toString的东西来标识var的名称 我在Delphi中有一个代码,我需要实现同样的功能,因为我有一个记录类型,它有许多子字符串需要识别: type THierarchyAccess = String; // receive the user permissions from the MySQL DB THierarchy = record MOD_HIERARQUIA : THierarchyAccess; // 'BROWSE_O

在Java中,我们有类似于
VarName.toString
的东西来标识var的名称

我在Delphi中有一个代码,我需要实现同样的功能,因为我有一个
记录
类型,它有许多子字符串需要识别:

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;

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

一般来说,Delphi等本机代码编译器不在可执行映像中包括记录字段名或参数变量名等符号名,因为本机机器指令只关心偏移量和地址,而不关心名称。这就是为什么Delphi生成的EXE比其等效的.NET或Java应用程序小数百倍的原因之一

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

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

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

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

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

Delphi不是Java

您将需要使用完全不同的强类型技术。例如,您的代码可以是:

type
  THierarchyAccess = set of (haBrowseOnly, haManage, haNone {...});
  THierarchyMod = (hmHierarquia, hmOperadores, hmEstatisticas {...});
  THierarchy = array [THierarchyMod] of THierarchyAccess;
//...

function  TAccess.IsAccessPermited(apNeed: THierarchyAccess; apHave: THierarchy; hMod: THierarchyMod): Boolean;
begin
  case hMod of
    hmHierarquia:
      if apNeed <= apHave[hmHierarquia] then
        Beep;
    hmOperadores:
      if (apNeed + [haBrowseOnly]) <= apHave[hmOperadores] then
        Beep;
  end
end;

if IsAccessPermited([haBrowseOnly], MyHierarchy, hmOperadores) then Form2.Open;
类型
THierarchyAccess=集合(仅haBrowseOnly、haManage、haNone{…});
THierarchyMod=(hmHierarquia,hmOperadores,hmestatistics{…});
THierarchy=THierarchyAccess的数组[THierarchyMod];
//...
函数TAccess.IsAccessPermited(apNeed:THierarchyAccess;apHave:THierarchy;hMod:THierarchyMod):布尔;
开始
病例hMod
hmHierarquia:
如果像德索普(德尔福的前建筑师!)所说的那样,那是不可能的。但我认为你的记录也可能是一系列的THierarchyAccess

我会这样做:

type
  THierarchyMode = (mHierarchia, mOperadores, mEstatisticas, ... );

  THierarchy = array[THierarchyMode] of THierarchyAccess;

...

  procedure TAccess.IsAccessPermitted(const apNeed: THierarchyAccess; apHave: THierarchyMode; const Hierarchy: THierarchy);
  begin
    // access
    if apNeed = Hierarchy[apHave] then ...

不。如果MyHierarchy.MOD_HOTSITES='BROWSE_ONLY',那么
有什么问题吗?如果我没有获得任何权限信息,我会给自己(支持)发送一封电子邮件,告诉自己MyHierarchy。???从用户XXXX发送的电子邮件不完整。您可以在从数据库加载权限数据时发送电子邮件,而不是在检查所拥有的权限时发送电子邮件。然后您就有了数据库字段名,可以使用它而不是试图获取记录字段名。返回对象的字符串表示形式,而不是包含该对象的变量的名称。我不知道我们可以在数组[]定义中使用类型。我确实不知道很多事情,我是autodidata,因为亚马逊没有德尔福职业学院…:-/任何枚举类型都可以用作索引。例如Boolean或Byte。网上有很多Delphi专业人士。他们中的一些人在写官方文件,另一些人在写个人博客()等。