• ベストアンサー

Delphiにて、呼び元の情報を(グローバル変数を使わずに)渡したい。

OnClickイベント契機で呼び出す関数(仮に func_A(Sender: TObject) とします)に呼び元の情報を渡したいと思っています。 しかし、func_Aに引数が追加できず、困っています。 Public変数にして、Senderから取り出しても記憶されていないようです。 グローバル変数で渡すのも一手でしょうが、極力グローバル変数にはしたくありません。 何かいい手はないでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • SuperLe
  • ベストアンサー率44% (434/977)
回答No.2

Senderの型をキャストしましたか? 例えば、 if Sender is TButton then begin  ShowMessage(ColorToString((Sender as TButton).Font.Color)); end; というクリックイベントを、ボタンと、ビットボタンとスピードボタンのonClick に設定してやると、ボタンとビットボタンの時のみ表示されます。 これを応用して、クリックするのがサブクラスであれば、そのサブクラスにキャストしてやれば読めるはずですよ。 type TMyButton=object(TButton) public    TestParameter:string; end; だとし、そのボタンを配置し、押された場合、onclickイベントで、 ローカル変数 var Data:string; として if sender is TMyButton then begin  Data:=(sender as TMyButton).TestParameter;  ~Dataに対する処理 end; で、読めるはずです。

参考URL:
http://fdelphi.nifty.com/
RKCP095
質問者

お礼

ありがとうございます。 やり方が間違っていたようです。 試してみます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • jmh
  • ベストアンサー率23% (71/304)
回答No.3

> func_Aに引数が追加できず… ナゼですか?

RKCP095
質問者

補足

知識不足です・・・。

全文を見る
すると、全ての回答が全文表示されます。
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

詳しく説明出来るほどの知識はないですが、、、 自分で作成した手続きなら渡せるのでは無いでしょうか? procedure TForm1.Button1Click(Sender: TObject); var cnt : integer; begin  cnt := 1;  ShowMessage('cnt は' + IntToStr(Cnt));  func_A(Sender,cnt);  ShowMessage('cnt は' + IntToStr(Cnt)); end; procedure TForm1.func_A(Sender: TObject; var i:integer ); begin  ShowMessage(TButton(Sender).Caption + 'から' + IntToStr(i) +  'が渡されました' + #13#10 + '1を足します');  Inc(i); end;

RKCP095
質問者

補足

違います。 papayukaさんの例で言うと、 TForm1.Button1Click に引数を追加したいのです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • グローバル変数について

    関数の中で定義されたローカル変数(例えばfunction func(){$a=○○;}の $a)をグローバル変数にするにはどのようにしたらよいのでしょうか?

    • ベストアンサー
    • PHP
  • JavaScriptで関数設定時に引数を指定したい

    状況を説明します ・複数のthにoncklickイベントで同じ関数を呼びたい ・th要素のタグにonclick属性を書くのは同じ記述をたくさん書くことになるのでやりたくない ・JavaScriptでonclick属性に関数を設定したい ・th要素自身を引数としたい ※WindowsXPのIE8で動けばOKです。 (0)ベタ書きするとこんな感じになります。これなら動くことを確認しています。 # <th onclick="func1(this)">… # <th onclick="func1(this)">… # <th onclick="func1(this)">… # <th onclick="func1(this)">… # # function func1(th) { #   … # } (1)引数がなければこんな感じになると思います # var ths = $("head").childNodes; # for (var i = 0; i < ths.length; i++) { #   ths[i].onclick = func1; # } (2)無名関数ならこんな感じになると思います # var ths = $("head").childNodes; # for (var i = 0; i < ths.length; i++) { #   ths[i].onclick = function() { #     … #   } # } しかしこの2つの書き方「(1)(2)」とも、引数を入れようとしたところ どうすればいいかわかりませんでした。 上記の状況を踏まえ… 質問は以下です ・(1)のような書き方で、引数アリの関数を設定する方法 ・(2)のような書き方で、引数アリの関数を無名関数で設定する方法 ・それ以外の代替方法 これを教えてください。 そもそもJavaScriptではできないのであればその旨を教えてください。 よろしくお願いします。

  • 変数の中身を文字列に変換ってできますか?

    void func(int x) {  puts(&&&&&(x)); } こんな風にして、func という関数の引数に1が与えられたら、 putsを実行できるように1を文字列(つまり"1")に 変換してくれる&&&&&(x)という関数あるいは マクロが作成できないでしょうか? この質問をした目的は、変数の値によって、たくさんある ファイルのどれを開くか決定したいという所からきました。 fopen の引数が char *abc なんですもの。

  • delphiで、タイマー関数の中で、変数の初期値を入れ、カウントする場合。

    delphiで、タイマーで関数を作るとします。 正式な呼び名が分からないのですが、いわゆるTimer1Timerこれです。 1秒ごとに、0からカウントする機能をつけたいのですが、変数の型を宣言する所に、変数を入れると、注意されます。 下記の方法だと、変な値が入ります。 関数の中に入れてしまうと、最初に入れた値に、毎回初期化されてしまいます。 こんな事を考慮に入れていない訳がないと思うのですが、当方に知識としてありません。 どうか、よろしくお願いします。 あ、もちろん、グローバル変数や、外部から持ち込むのは、やり方として分かるのですが、それが正統的なやり方ですか? label3に0を入れて、読み取って、1足して、label3に返して・・・の繰り返し、とか。 procedure TForm1.Timer1Timer(Sender: TObject); var  Count : Integer ; begin  Count := Count +1 ;  //Inc(Count,1);  label2.Caption := IntToStr(Count) ; end;

  • CでOpenMP、パラレル内での共有変数の宣言方法

    C言語でOpenMPを利用したとき、parallel構文内で、共有変数を宣言する方法はありますか? OpenMPを利用して、スレッド並列にしたプログラムを書いています。 #pragma omp parallel { ~~ ~~ } この、~~の部分で、大きく分けて二つの処理をしているので、関数に分けました。 #pragma omp parallel private( a, b, c, d, e, f, g, h, i, j ) { func1( a, b, c, d, e, f, g, h ); func2( a, b, c, d, e, f, g, h, i, j ); } このとき、2つ目の関数で共有変数を複数使う必要があります。 しかし、共有変数の数は多く、引数にするとかなりの数の引数になってしまいます。 そこで、できればfunc2()という関数の中で、スレッドで共有できるshared変数を宣言したいのですが、方法がわかりません。 どなたか、知っている方教えてください。

  • 多次元配列のポインタ渡し

    C++を使用しています。 多次元配列を関数の引数として渡したいとき、関数側では void A::Func(int a[10][20][30])~ 呼びだし側では Finc(a); とやればいいのはわかります。 お聞きしたいのは、仮引数として呼び出された配列(上でいうa)をクラスのメンバ変数として保持したい場合の方法です。 aは先頭アドレスなのでそこを差すポインタを受ければいい、っていうことはわかりますが、 この方法ですと、受けたメンバ変数が配列みたいに[]を使ってアクセスできません。 (メンバ変数のポインタは配列じゃないから当然ですよね) これを通常の配列みたいに扱えるようにするにはどうしたらいいでしょうか。

  • グローバル変数について

    ◎1--------------------------------- #include<stdio.h> void func(void); int glb; int main(void) { int a=20; glb=30; printf("main a=%d glb=%d\n",a,glb); func(); return 0; } void func(void) { int b=88; printf("func b=%d glb=%d\n",b,glb); } ------------------------------------- ◎1の実行結果----------------------- main a=20 glb=30 func b=88 glb=30 ------------------------------------- ◎2--------------------------------- #include<stdio.h> void func(void); int glb; int main(void) { int a=20; func(); printf("main a=%d glb=%d\n",a,glb); return 0; } void func(void) { int b=88; int glb=30; printf("func b=%d glb=%d\n",b,glb); } ------------------------------------- ◎2の実行結果----------------------- func b=88 glb=30 main a=20 glb=0 ------------------------------------- 以上2つのプログラムで、◎1は参考書を参考に作成したものです。 ◎1のプログラムで、グローバル変数glbの値をmain( )関数内で設定していたので、次に◎2のようにfunc( )という関数プロトタイプ内で、グローバル変数glbの値を設定し、main( )関数内のprintf文でも表示させようと思ったら、「glb=0」となってしまいました。 なぜこのようになってしまうか、教えてもらえたら嬉しいです。

  • jQueryのイベントに引数を渡したい

    例えば以下のような既存のJavaScriptのコードをjQueryのイベントで書き直したい場合、関数の引数で渡していた値は、どうやって渡すのでしょうか? 【html】 <a href="" onclick="func_a('abc'); return false;"></a> 【JavaScript】 faunction func_a(param_a){ alert(param_a); } 以下のようにすれば渡せないことはありませんが、かなり強引な感じがします。 【html】 <a href="" class="abc"></a> 【jQuery】 $(function() { $("a").click( function(){ var param = $(this).attr("class"); alert(param); return false; } ); }); こういう場合はjQeuryであっても、onclick属性で関数を呼び出すのが普通なのでしょうか? ご存知の方がいらっしゃいましたら教えてください。 よろしくお願い申し上げます。

  • 引数のポインタ変数をローカル変数に設定方法

    引数で受け取ったポインタ変数を受け取った関数内のローカル変数に設定するには、 どうしたらよいでしょうか? イメージとしては、 int abc(char *a){ *a = '3' ローカル変数b = *a }

  • onclick指定関数の引数へローカル変数をセット

    ・onclick指定関数の引数として、ローカル変数をするにはどうすれば良いでしょうか? ・下記例だと、kokoをローカル変数で定義したい <input type="button" onclick="hoge(koko);"> ■現状 ・変数kokoスコープをグローバルで設定しているので無事渡せて(?)ます ■質問背景 ・変数はグローバルにしない方が良いと聞いたことがあるので、何か方法があるのかなと思い質問しました