Swanman's Horizon

性欲をもてあましつつなんらかの話をするよ。

Delphiでリフレクションもどき その1

Delphiコンパイルされた実行ファイルには「実行時型情報(=RTTI)」と呼ばれるデータが埋め込まれる*1。これは主にIDEが使うために生成されるもので、普段はほとんど使う機会がないんだけど、TypInfoユニットにはこれらを参照する関数が実装されていて、これらを利用することでリフレクションもどきが体験できる。
一般的な使用において、一番有用なのは列挙型と文字列の相互変換だと思う。これはどういうことかと言うと、例えばTAlign型のalClientを'alClient'という文字列に変換できるし、また、'alClient'という文字列をTAlign型のalClientに変換することができる。
コードで書くと次のような感じ。

ShowMessage(GetEnumName(TypeInfo(TAlign), Ord(alClient))); // 'alClient'と表示
Memo1.Align := TAlign(GetEnumValue(TypeInfo(TAlign), 'alClient')); // alClientが代入される

なお、最近のDelphiでは識別子に日本語などが使えるようになったため、GetEnumNameで返ってくる文字列はUTF-8だったりする。なのでそういう文字が含まれている場合はUtf8ToAnsi関数などでラップしてやることが必要。フルUnicode化したDelphi2009ではどうなってんのか知らないけど。

*1:$Mコンパイラスイッチで生成するかどうか制御できる