VBのCallByNameみたいな関数ないですか?

解決


たかみちえ  URL  2002-06-23 09:33:30  No: 1028

実行したい関数の名前をString型で入れて、
そのあとにバリアント型の配列(Delphiだとarray of const ですか?)で引数を指定すると、
指定した関数を実行してくれる"CallByName"という関数がVBにあるんですけど、
これと同じような関数はないでしょうか?
FindComponentでコンポーネントの名前指定での実行はできるようですけど…。

  登録制でもいいので(本当は登録制のほうがいいんでしょうけど)、あったら教えてください。
なんだかDelphiにとっては初歩的過ぎるのか、Googleでさがしてもどこにも書いてなくって…。
(ポインタ呼び出しとか?でもそれと文字列をどうやって関連付けるんでしょ?)


にしの  2002-06-24 02:14:47  No: 1029

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.


たかみちえ  URL  2002-06-26 08:14:17  No: 1030

うーん、ちょっとややこしいでしたけど、ようやくやりかたが分かりました^^;
関数名の配列を作っておいて、
その配列から検索して、みつけたときのループ変数の数字で関数を実行…。
ってふうにすればいいですね。
引数はArray Of Const とかでいいですよね?
ありがとうございました。またひとつ勉強にもなったし、解決しました。


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加