関数(function)のメソッドポインタが定義できれば、TObjectのMethodAddressを使って
関数名を(文字で)指定してコールすることが可能です。
以下、サンプルソース。
先ずは、【メソッドポインタ経由で呼び出されるクラスのサンプル】
unit Unit2; interface type TMyCalc = class published function Add(a,b : double) : double; function Subtract(a,b : double) : double; end; implementation { TMyCalc } function TMyCalc.Add(a, b: double): double; begin Result := a + b; end; function TMyCalc.Subtract(a, b: double): double; begin Result := a - b; end; end.
MethodAddressを使用するためにpublishedを指定してることに注意願います。
次に、【関数名を文字列で指定して処理を呼び出すサンプル】
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ExtCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; LabeledEdit1: TLabeledEdit; LabeledEdit2: TLabeledEdit; StaticText1: TStaticText; StaticText2: TStaticText; procedure OnCalcBtnClick(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} uses Unit2; type TMyCalcFunc = function(a,b : double) : double of object; procedure TForm1.OnCalcBtnClick(Sender: TObject); var MyCalc : TMyCalc; MyCalcFunc : TMyCalcFunc; MethodVar : TMethod; begin MyCalc := TMyCalc.Create; try MethodVar.Data := MyCalc; MethodVar.Code := MyCalc.MethodAddress(TButton(Sender).Caption); if Assigned(MethodVar.Code) then begin MyCalcFunc := TMyCalcFunc(MethodVar); StaticText2.Caption := FloatToStr(MyCalcFunc(StrToFloat(LabeledEdit1.Text),StrToFloat(LabeledEdit2.Text))); end; finally MyCalc.Free; end; end; end.
ボタンのキャプション名が名前のメソッドが定義されているという前提で、ボタンのキャプションを
使って関数をコールして、結果を求めています。
0 件のコメント:
コメントを投稿