2012-07-02 54 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 ... 
相關問題