関数の呼び出しについて

解決


たろう  2004-03-01 20:31:36  No: 7434

たとえば 関数名を   kansuu_1から
                    kansuu_10まで作ったとして
現在これらを呼び出すとき、一々
                    if i=1 then kansuu_1;
                    if i=5 then kansuu_5;
としています。
                    i は  関数名の後ろの数字に対応せせています。
スマートに書く方法はないですか?


通りすがり  2004-03-01 21:07:17  No: 7435

関数呼び出しで振り分けるのでは無く、
ひとつの関数の中で処理を分ければ宜しいのでは?。


たろう  2004-03-01 21:42:00  No: 7436

やはり、そのように対処した方がいいですね。
別の振り分け関数を作成して対応します。
ありがとうございました。


たろう  2004-03-01 21:42:56  No: 7437

解決しました。


にしの  2004-03-01 22:52:35  No: 7438

解決済みのようですが、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;


通りすがり  2004-03-01 23:45:03  No: 7439

初心者に毛が生えた程度の私がレス付けたのはまずかったか・・。
やはり、何かしらのサンプルコード位は見せないと駄目ですね。

しかし、にしのさん等識者のコードは色々と勉強になりますなぁ。


たろう  2004-03-02 00:28:49  No: 7440

にしのさん、通りすがりさん、ありがとうございます。

実は  関数’kansu何々’の数が50個くらいになりそうなのでこまっていました。にしのさんのサンプルのようなコードでやってみます。


るるとん@K  2004-03-02 02:37:36  No: 7441

にしのさんのが良いと思いますが、
はじめのたろうさんのソースの
if i=1 then kansuu_1;
if i=5 then kansuu_5;
はcaseを使うところでしょう。


通りすがり  2004-03-02 03:55:01  No: 7442

先ほどの通りすがりさんとは別の通りすがりです(^^;
以前、こんなのを見たことがあります。
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;


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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