2

VarName.toStringJava では、変数の名前を特定するようなものがあります。

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;

関数に渡された変数名を特定するエレガントな方法はありますか?

4

3 に答える 3

7

一般に、レコード フィールド名やパラメータ変数名などのシンボル名は、Delphi などのネイティブ コード コンパイラによって実行可能イメージに含まれません。これは、ネイティブ マシン命令が名前ではなくオフセットとアドレスのみを考慮するためです。これが、Delphi で作成された exe ファイルが、同等の .NET または Java アプリよりも数百倍も小さい理由の 1 つです。

ただし、フィールド名などの型メタデータは、「自己完結型」のオブジェクト ストリーミングに役立ちます。この型メタデータは通常、ネイティブ コード コンパイラによってランタイム型情報 (RTTI) と呼ばれます。

{$M+}型宣言を有効にして上記の型をコンパイルしてみることができます。不要な型名で exe が肥大化するのを避けるために、必ず{$M-}直後に設定してください。

次に、Delphi RTTI メソッドを使用して、レコード構造のフィールドの名前にアクセスする必要があります。

ただし、レコード フィールドをパラメーターとして別の関数に渡しているため、これはサンプル コードでは機能しないと思います。レコードの n 番目のフィールドの名前を取得するには、レコード タイプが必要です。

関数IsAccessPermitted()は、レコード フィールドの内容の値のみを受け取ります。値を渡すためにどのフィールドが使用されたか、またはレコードが使用されたかどうかさえもわかりません

于 2012-07-02T22:42:50.133 に答える
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;
于 2012-07-03T09:48:32.300 に答える
1

dthorpe (Delphi の元アーキテクト!) が言うように、それは不可能です。しかし、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 ...
于 2012-07-03T14:42:04.017 に答える