c++ builder XE4, 10.2 Tokyo > 自動付加された数値のsuffix (例 "Edit12"の12)を取得する実装


動作確認
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)

コンポーネント名のEdit12から12を取得したり、Button3から3というインデックスを取得したい。

http://qiita.com/7of9/items/90c60cb9baa6c435b0cd
で実装していたものでは"_"始まりの数値しか取得できなかった。

以下でStrToIntDef()を使った実装をした。

Unit1.cpp
static int16_t getSuffixIndex(String name)
{
    String work;
    int16_t val;

    for(int idx=0; idx < name.Length(); idx++) {
        work = name.SubString(idx + 1, MAXINT);
        val = StrToIntDef(work, -99);
        if (val != -99) {
            return val;
        }
    }
    return -1;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    int16_t val = getSuffixIndex(L"Button314");
    ShowMessage(IntToStr(val));

    val = getSuffixIndex(L"Edit12");
    ShowMessage(IntToStr(val));

    val = getSuffixIndex(L"Edit12_34");
    ShowMessage(IntToStr(val));
}

上記の結果、314, 12, 34の数値が取得できるようになった。

引数をSenderにした場合の実装は以下。
関連 http://qiita.com/7of9/items/d4d0a62d44c170b58dda

static int16_t getSuffixIndex(TObject *Sender)
{
    TComponent *cmpPtr = (TComponent *)Sender;
    String name = cmpPtr->Name;

    String work;
    int16_t val;

    for(int idx=0; idx < name.Length(); idx++) {
        work = name.SubString(idx + 1, MAXINT);
        val = StrToIntDef(work, -99);
        if (val != -99) {
            return val;
        }
    }
    return -1;
}