5

以下の次の宣言を前提として、文字列値(たとえば、「one」)から列挙値(たとえば、jt_one)を取得する方法はありますか?

type
 TJOBTYPEENUM =(jt_one, jt_two, jt_three);


CONST JOBTYPEStrings : ARRAY [jt_one..jt_three] OF STRING =
     ('one','two','three');

または、ネストされたifステートメントのセットを使用して独自の関数を作成する必要がありますか?

注:文字列「jt_one」を探していません

4

2 に答える 2

10
function EnumFromString(const str: string): TJOBTYPEENUM;
begin
  for Result := low(Result) to high(Result) do 
    if JOBTYPEStrings[Result]=str then
      exit;
  raise Exception.CreateFmt('Enum %s not found', [str]);
end;

実際のコードでは、独自の例外クラスを使用する必要があります。大文字と小文字を区別しない一致を許可する場合は、 を使用して文字列を比較しますSameText

于 2012-10-18T17:55:41.427 に答える
7
function GetJobType(const S: string): TJOBTYPEENUM;
var
  i: integer;
begin
  for i := ord(low(TJOBTYPEENUM)) to ord(high(TJOBTYPEENUM)) do
    if JOBTYPEStrings[TJOBTYPEENUM(i)] = S then
      Exit(TJOBTYPEENUM(i));
  raise Exception.CreateFmt('Invalid job type: %s', [S]);
end;

または、よりきちんとした、

function GetJobType(const S: string): TJOBTYPEENUM;
var
  i: TJOBTYPEENUM;
begin
  for i := low(TJOBTYPEENUM) to high(TJOBTYPEENUM) do
    if JOBTYPEStrings[i] = S then
      Exit(i);
  raise Exception.CreateFmt('Invalid job type: %s', [S]);
end;
于 2012-10-18T17:55:34.100 に答える