文字列分岐のCase文について

解決


ガオ~  2020-08-14 19:42:55  No: 148992

こんばんは。
以下の環境でプログラム作成しています初心者です。
CASE文についてですが
DelphiではCase文の分岐条件は整数値のみのようですが
何か細工ををして文字列も条件式にすることはできないのでしょうか。
アドバイスを頂けましたらとっても助かります。
よろしくお願いいたします。

Delphi Tokyo Enter 64bit
Windows 10 PRO 


HFUKUSHI  2020-08-14 21:52:35  No: 148993

順序型以外でcaseの分岐はできないですね。
やるとすると、いったん列挙型に変換して、それでcaseの分岐、という感じかなと思います。

uses
  System.TypInfo, System.SysConst,

type
  TFoo = (ABC, DEF, GHI);

  TFooHelper = record helper for TFoo
    class function FromString(const S: String): TFoo; static;
  end;

class function TFooHelper.FromString(const S: String): TFoo;
var
  P: PTypeInfo;
  IValue: Integer;
begin
  P := TypeInfo(TFoo);
  IValue := System.TypInfo.GetEnumValue(P,S);
  with GetTypeData(P)^ do
  begin
    if (IValue < MinValue) or (IValue > MaxValue) then
    begin
      raise ERangeError.CreateRes(@SRangeError);
    end;
  end;
  Result := TFoo(IValue);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Foo: TFoo;
begin
  Foo := TFoo.FromString(Edit1.Text);
  case Foo of
    ABC:
    begin
      Label1.Caption := 'ABC';
    end;

    DEF:
    begin
      Label1.Caption := 'DEF';
    end;

    GHI:
    begin
      Label1.Caption := 'GHI';
    end;
  end;
end;


AAA  2020-08-15 00:22:38  No: 148994

こんな感じかな

function Select(Text: String; DATA: Array of String): Integer;
var
    I: Integer;
begin
    RESULT := -1;
    for I:=0 to High(DATA) do
    begin
      //大小区別するなら LowerCase 外す
      if LowerCase(TEXT) = LowerCase(DATA[I]) then RESULT := I;
    end;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
    S: String;
begin
    S := 'AA';

    case Select(S,['AA','BB']) of
      0:
      begin
        Caption := 'AA';
      end;
      1:
      begin
        Caption := 'BB';
      end
      else
      begin
        Caption := 'CC';
      end;

    end;
end;


ガオ~  2020-08-15 06:40:14  No: 148995

HFUKUSHIさん、AAAさん ご回答ありがとうございます。
お陰様で文字列分岐ができました。
これを使ってプログラミングを進めさせていただきます。
ありがとうございました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加