たとえば 関数名を kansuu_1から
kansuu_10まで作ったとして
現在これらを呼び出すとき、一々
if i=1 then kansuu_1;
if i=5 then kansuu_5;
としています。
i は 関数名の後ろの数字に対応せせています。
スマートに書く方法はないですか?
関数呼び出しで振り分けるのでは無く、
ひとつの関数の中で処理を分ければ宜しいのでは?。
やはり、そのように対処した方がいいですね。
別の振り分け関数を作成して対応します。
ありがとうございました。
解決しました。
解決済みのようですが、procedure of objectでなく、単なるprocedureであれば、こんな感じで出来ます。
# エラーチェックはしていません
procedure of objectの場合、constにはできないので、ふつうの配列にしてください。
# 格納は自前で。
procedure kansu_1;
begin
// proecdureであって、procedure of objectではありません。
end;
procedure Button1Click(Sender: TObject);
const
ProcN: array[1..10] of procedure=(
kansu_1, kansu_2, kansu_3, kansu_4, kansu_5,
kansu_6, kansu_7, kansu_8, kansu_9, kansu_10);
var
i: integer;
begin
i := StrToIntDef(Edit1.Text, 1); // 1がデフォルト
ProcN[i]; // i番目のProcedureを呼び出し。
end;
初心者に毛が生えた程度の私がレス付けたのはまずかったか・・。
やはり、何かしらのサンプルコード位は見せないと駄目ですね。
しかし、にしのさん等識者のコードは色々と勉強になりますなぁ。
にしのさん、通りすがりさん、ありがとうございます。
実は 関数’kansu何々’の数が50個くらいになりそうなのでこまっていました。にしのさんのサンプルのようなコードでやってみます。
にしのさんのが良いと思いますが、
はじめのたろうさんのソースの
if i=1 then kansuu_1;
if i=5 then kansuu_5;
はcaseを使うところでしょう。
先ほどの通りすがりさんとは別の通りすがりです(^^;
以前、こんなのを見たことがあります。
type
TForm1 = class(TForm)
...
private
procedure CallProc(ProcName: string);
published
procedure kansu_1;
procedure kansu_5;
end;
...
type
TProc = procedure of object;
procedure TForm1.CallProc(ProcName: string);
var
Method: TMethod;
Proc: TProc;
begin
Method.Data := Self;
Method.Code := MethodAddress(ProcName);
if not Assigned(Method.Code) then Exit;
Proc := TProc(Method);
Proc;
end;
procedure TForm1.kansu_1;
begin
ShowMessage('kansu_1');
end;
procedure TForm1.kansu_5;
begin
ShowMessage('kansu_5');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
i := StrToIntDef(Edit1.Text,1);
CallProc(Format('kansu_%d',[i]));
end;
ツイート | ![]() |