2010-11-26 13 views
3

変数の値が型宣言の範囲内にあるかどうかをどのように判断できますか? Ex。Delphi Type Declarationで変数の値を確認してください

Type 
    TManagerType = (mtBMGR, mtAMGR, mtHOOT); 

... 

var 
    ManagerType: TManagerType; 

.... 


procedure DoSomething; 
begin 
    if (ManagerType in TManagerType) then 
    DoSomething 
    else 
    DisplayErrorMessage; 
end; 

ありがとう、ピーテル。

+0

... :) –

答えて

5
InRange: Boolean; 
ManagerType: TManagerType; 
... 
InRange := ManagerType in [Low(TManagerType)..High(TManagerType)]; 

- 真上ブール式がに対応しながら:

(Low(TManagerType) <= ManagerType) and (ManagerType <= High(TManagerType)) 

コンパイラは、単一の部分範囲に基づいて即時セットに対してメンバーシップのチェックを最適化しません。したがって、[成熟して]最適化されたコードはあまりエレガントではありません。

+0

それはセットの建設、及びその中にチェックを必要とするため、最速のアプローチではありません。 –

-1

あなたは経由して、これをチェックする必要があります:MTYPE>ハイ(TManagerType)場合Nickolay O.が指摘したように、その後...

3

さて、TManagerType型の変数は、その範囲内になければなりません。それはパスカル型の列挙型がどのように動作するのかということです。唯一の方法は、コンパイラの背後に何か悪意のある行為があった場合です。

これは次のようになり書くための別の方法:mtPHBが欠落している

InRange(ord(ManagerType), ord(low(ManagerType)), ord(high(ManagerType))) 
+0

あなたは正しいですが、私は誰かが "ManagerType:= TManagerType(10)"のようなものを試すかもしれないと考えていました。 –

+4

あなたはそれをする必要はありません!そのことが心配ならば、あなたのコードベースは90%の妥当性が確認されます!トラスト境界(たとえば、逆シリアル化、ユーザー入力)を定義し、境界でデータを検証する必要があります。その後、そのようなチェックは非生産的になります。私はそれを編集的プログラミングと呼んでいます! –

+0

+1 @David私は、元の開発者が出発してからずっとこのような第二の推測の悪い例を見つけました。変数を設定した直後に変数の値をチェックしています。メソッドを2回呼び出すだけで、 "取った"ことを確認します。私はそれを「過度に守備的」と分類した時点で、編集的プログラミングはより良く聞こえると思います。 –

関連する問題