2012-07-02 20 views
2

在Java中,我们有类似VarName.toString的东西来确定var的名称。如何获取由delphi函数中的参数传递的变量或对象节点的名称?

我在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; 

有一种优雅的方式来确定传递给函数的变量名称是什么?

+1

都能跟得上。 '如果MyHierarchy.MOD_HOTSITES ='BROWSE_ONLY'然后'有什么问题? –

+0

如果我没有获得许可信息,我会发邮件给我自己(支持),告诉MyHierarchy。来自用户XXXX是不完整的。 – PSyLoCKe

+2

您可以在从数据库加载权限数据时发送电子邮件,而不是在检查所拥有的内容时。然后你有数据库字段名称,并可以使用它而不是试图获取记录字段名称。 –

回答

4

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; 
+0

我不知道我们可以在数组[]定义中使用类型。我确实不知道很多事情,因为在亚马逊没有德尔福专业学院,所以我是autodidata ...: -/ – PSyLoCKe

+0

任何枚举类型都可以用作索引。例如布尔或字节。 – Torbins

+0

并且有很多Delphi专业人士在线。其中一些人正在写官方文件在http://docwiki.embarcadero.com其他人写在个人博客(http://www.delphifeeds.com)等。 – Torbins

7

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

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

你可以尝试编译上面绕式声明启用{$M+}你的类型。请务必立即设置{$M-}以避免使用不需要的类型名称膨胀您的exe文件。

你这时就需要使用Delphi RTTI的方法来访问记录结构的字段的名称。

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

IsAccessPermitted()功能只接收的记录字段的内容的价值。它不知道使用了什么领域传递价值,或者即使在所有

1

由于dthorpe说,那是不可能的。但是ISTM认为你的记录可以是一个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 ... 
相关问题