整数の足し算を行う例です。以下ソース
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button3: TButton;
LabeledEdita: TLabeledEdit;
Label1: TLabel;
LabeledEditb: TLabeledEdit;
Label2: TLabel;
LabelResult: TLabel;
procedure Button3Click(Sender: TObject);
private
{ Private 宣言 }
protected
public
{ Public 宣言 }
function Sakasum(a,b : Integer) : Integer;
end;
var
Form1: TForm1;
implementation
uses
Rtti,TypInfo;
{$R *.dfm}
procedure TForm1.Button3Click(Sender: TObject);
var
ctx : TRttiContext;
rtm : TRttiMethod;
Args : Array of Rtti.TValue;
rst : TValue;
begin
//
ctx := TRttiContext.Create;
rtm := ctx.GetType(Self.ClassType).GetMethod('SakaSum');
if rtm <> nil then
begin
SetLength(Args,2);
//TValueは、演算子Implicitが定義されているので基本的な型は
//変換による代入が可能
Args[0] := StrToInt(LabeledEdita.Text);
Args[1] := StrToInt(LabeledEditb.Text);
rst := rtm.Invoke(Self,Args);
//結果はAsXXXXX関数を使って取り出せる。
Self.LabelResult.Caption := IntToStr(rst.AsInteger);
end;
end;
function TForm1.Sakasum(a, b: Integer): Integer;
begin
Result := a + b;
end;
end.
TValueの使い方が分からなくて結構悩みました。
で、ソースをみたら基本的な型については、
Implicit演算子のオーバーロードが
定義されているのね。
このへんはHelpに書いといて欲しかったです。
(C++ のHELPには書いてあります。)
(英語版のDoc Wikiがメンテナンス中だったので
日本語版でのみ書いていないのかはちょっと不明です。)
また、こちらにDelphi Prismで上記と同様な処理を
記述しました。
0 件のコメント:
コメントを投稿