実行したい関数の名前をString型で入れて、
そのあとにバリアント型の配列(Delphiだとarray of const ですか?)で引数を指定すると、
指定した関数を実行してくれる"CallByName"という関数がVBにあるんですけど、
これと同じような関数はないでしょうか?
FindComponentでコンポーネントの名前指定での実行はできるようですけど…。
登録制でもいいので(本当は登録制のほうがいいんでしょうけど)、あったら教えてください。
なんだかDelphiにとっては初歩的過ぎるのか、Googleでさがしてもどこにも書いてなくって…。
(ポインタ呼び出しとか?でもそれと文字列をどうやって関連付けるんでしょ?)
CallByNameに、ぴったり対応するものはありません。
C言語やDelphiに比べて、VBのほうが遠回しなやり方になっていますから。
FindComponentは、文字列型のNameプロパティを探すものであって、関数名を探すCallByNameとは全く別のものですね。
Delphiでは、関数はconstな変数のようなものです。
usesで指定したUnitの関数は全て使えます。
# 一部、privateな関数は除く
Delphiに、文字列として名前を指定する方法がないのでなく、VBに文字列で指定する必要があった、のだと思います。
どういうコーディングで困っているかわかりませんが、次のような場合でしょうか。
[VB]
Public Funcion Func1(Param As String) As String
Public Funcion Func2(Param As String) As String
Public Funcion Func3(Param As String) As String
を、"Func" + CStr(i)で指定したい。
Delphiでやるときは、配列に一度入れます。
こんな感じです。
unit MainFrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TNFunc = function(Param:string):string;
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function Func0(Param: String): String;
begin
ShowMessage('0:' + Param);
Result := '0';
end;
function Func1(Param: String): String;
begin
ShowMessage('1:' + Param);
Result := '1';
end;
function Func2(Param: String): String;
begin
ShowMessage('2:' + Param);
Result := '2';
end;
function FuncN(N: integer; Param: String): String;
var
Funcs: array[0..2] of TNFunc;
begin
Funcs[0] := Func0;
Funcs[1] := Func1;
Funcs[2] := Func2;
Result := Funcs[N](Param);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FuncN(StrToIntDef(Edit1.Text, 0), 'TEST');
end;
end.
うーん、ちょっとややこしいでしたけど、ようやくやりかたが分かりました^^;
関数名の配列を作っておいて、
その配列から検索して、みつけたときのループ変数の数字で関数を実行…。
ってふうにすればいいですね。
引数はArray Of Const とかでいいですよね?
ありがとうございました。またひとつ勉強にもなったし、解決しました。
ツイート | ![]() |