2009年8月29日土曜日

Rttiを試して見るその2

前回のポストに引き続いて、メソッドの動的呼び出し。

整数の足し算を行う例です。以下ソース

  1. unit Unit1;  
  2.   
  3. interface  
  4.   
  5. uses  
  6.  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  
  7.  Dialogs, StdCtrls, ExtCtrls;  
  8.   
  9. type  
  10.  TForm1 = class(TForm)  
  11.    Button3: TButton;  
  12.    LabeledEdita: TLabeledEdit;  
  13.    Label1: TLabel;  
  14.    LabeledEditb: TLabeledEdit;  
  15.    Label2: TLabel;  
  16.    LabelResult: TLabel;  
  17.    procedure Button3Click(Sender: TObject);  
  18.  private  
  19.    { Private 宣言 }  
  20.  protected  
  21.  public  
  22.    { Public 宣言 }  
  23.    function Sakasum(a,b : Integer) : Integer;  
  24.   
  25.  end;  
  26.   
  27. var  
  28.  Form1: TForm1;  
  29.   
  30. implementation  
  31. uses  
  32.  Rtti,TypInfo;  
  33.   
  34. {$R *.dfm}  
  35.   
  36.   
  37. procedure TForm1.Button3Click(Sender: TObject);  
  38. var  
  39.  ctx : TRttiContext;  
  40.  rtm : TRttiMethod;  
  41.  Args : Array of Rtti.TValue;  
  42.  rst : TValue;  
  43. begin  
  44.  //  
  45.  ctx := TRttiContext.Create;  
  46.  rtm := ctx.GetType(Self.ClassType).GetMethod('SakaSum');  
  47.   
  48.  if rtm <> nil then  
  49.  begin  
  50.    SetLength(Args,2);  
  51.    //TValueは、演算子Implicitが定義されているので基本的な型は  
  52.    //変換による代入が可能  
  53.    Args[0] := StrToInt(LabeledEdita.Text);  
  54.    Args[1] := StrToInt(LabeledEditb.Text);  
  55.    rst := rtm.Invoke(Self,Args);  
  56.    //結果はAsXXXXX関数を使って取り出せる。  
  57.    Self.LabelResult.Caption := IntToStr(rst.AsInteger);  
  58.  end;  
  59. end;  
  60.   
  61.   
  62. function TForm1.Sakasum(a, b: Integer): Integer;  
  63. begin  
  64.  Result := a + b;  
  65. end;  
  66.   
  67. end.  


TValueの使い方が分からなくて結構悩みました。

で、ソースをみたら基本的な型については、
Implicit演算子のオーバーロードが
定義されているのね。

このへんはHelpに書いといて欲しかったです。
(C++ のHELPには書いてあります。)

(英語版のDoc Wikiがメンテナンス中だったので
日本語版でのみ書いていないのかはちょっと不明です。)

また、こちらにDelphi Prismで上記と同様な処理を
記述しました

0 件のコメント: