[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2004/12/01(Wed) 17:13
投稿者名:ダンボ
URL :
タイトル:
引数渡しのコントロールのイベントを発生させたい
皆さん、お世話になっております。

下記コードで、引数Sourceで渡されるコントロールのクリックイベントを発生させたいのですが、
上3行はコンパイルエラーになってしまいます。最下行は引数使用ではなく、実際のコントロール
を指定しましたので、動作するのは確認できましたが、やはり引数での指定をしたいです。
RaiseEventは使ったことが無く勉強を始めたばかりですが、「RaiseEventを使う」のが正解なの
でしょうか?それとももっと良い手が?

Private Sub picSheet_DragDrop(Source As Control, X As Single, Y As Single)
      Source.Move X, Y
      Source.DragMode = vbManual

      Source_Click   …× SubまたはFunctionが定義されていません
      Call Source_Click   …× SubまたはFunctionが定義されていません
      RaiseEvent Click(Source)   …× イベントが見つかりません
      tbsSOLs_Click … ○ tbsSOLsはSourceで渡されるべきコントロールの一つ

投稿時間:2004/12/01(Wed) 17:40
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re: 引数渡しのコントロールのイベントを発生させたい
> 皆さん、お世話になっております。
>
> 下記コードで、引数Sourceで渡されるコントロールのクリックイベントを発生させたいのですが、
> 上3行はコンパイルエラーになってしまいます。最下行は引数使用ではなく、実際のコントロール
> を指定しましたので、動作するのは確認できましたが、やはり引数での指定をしたいです。
> RaiseEventは使ったことが無く勉強を始めたばかりですが、「RaiseEventを使う」のが正解なの
> でしょうか?それとももっと良い手が?
>
> Private Sub picSheet_DragDrop(Source As Control, X As Single, Y As Single)
>       Source.Move X, Y
>       Source.DragMode = vbManual
>
>       Source_Click   …× SubまたはFunctionが定義されていません
>       Call Source_Click   …× SubまたはFunctionが定義されていません
>       RaiseEvent Click(Source)   …× イベントが見つかりません
>       tbsSOLs_Click … ○ tbsSOLsはSourceで渡されるべきコントロールの一つ

もしそのコントロールがコマンドボタンだったら
Source.Value = True
で出来ます。

そうじゃなかったら、そのコントロールのクリックイベントの中に書いてあるコードと
同じものを、新しく作ったプロシージャの書いてから
Call プロシージャ名
で呼び出すとか

投稿時間:2004/12/07(Tue) 10:19
投稿者名:ダンボ
URL :
タイトル:
Re^2: 引数渡しのコントロールのイベントを発生させたい
LESIAさん、どうもありがとうございます。

作ろうとしている部分は、ピクチャーシートの上に図形部品をドロップしてデザインするものです。
一応、ボタンとラインとサークルとタブストリップとリストボックスとフレームに限定しようかと
思っていますが、まだ種類も個数も確定していません。


> もしそのコントロールがコマンドボタンだったら
> Source.Value = True
> で出来ます。

御意。引数渡しのコントロールのプロパティは、参照・変更できるがイベントは発生させられない?
(プロパティを変える事によりイベントを発生させるという裏技はできそう)


> そうじゃなかったら、そのコントロールのクリックイベントの中に書いてあるコードと
> 同じものを、新しく作ったプロシージャの書いてから
> Call プロシージャ名
> で呼び出すとか

それはそうなのですが、美しくないじゃないですか(=拡張性の不足、バグの作りこみ、コード量の増加)
ゴリゴリ作るのならば、
  If Source.Name = "tbsSOLs" then  tbsSOLs_Click
  (以下同文、渡されるコントロールの数だけ。多いなぁ。まだ確定していないし)
という方式も考えたのですが、今一です。LESIAさんの考えでは、Click処理がすべてのコントロールで唯一ならば、
一回だけ記述すればよいので優れているともいえますが、実際はコントロールに依って変えたいのです。
で、コントロール毎に記述を変えるのならば、それは各コントロールのイベント部分に記述するのが妥当と
思いますです。(とは言え、言語仕様が許さなければあきらめるのですが。)

投稿時間:2004/12/01(Wed) 18:15
投稿者名:カムリン
Eメール:kakurin@hotmail.com
URL :
タイトル:
Re: 引数渡しのコントロールのイベントを発生させたい
>Source_Click   …× SubまたはFunctionが定義されていません
>Call Source_Click   …× SubまたはFunctionが定義されていません
この2つは、対象のコントロールが引数を必要とする場合、
それも書かないとだめです。
>SubまたはFunctionが定義されていません
となってしまうのは、
その関数自体が無いからです。
ちゃんと作ってるのにこうなるなら、
引数でそのコントロールの名前を渡して、
call Eval(引数でそのコントロールの名前 & "_Click")
としてみて下さい。

>RaiseEvent Click(Source)   …× イベントが見つかりません
これも多分
RaiseEvent Click(Eval(引数でそのコントロールの名前))
でいけるかなと思います。

投稿時間:2004/12/03(Fri) 13:40
投稿者名:
Eメール:
URL :
タイトル:
Re^2: 引数渡しのコントロールのイベントを発生させたい
> call Eval(引数でそのコントロールの名前 & "_Click")
> RaiseEvent Click(Eval(引数でそのコントロールの名前))

Eval関数が使えるのはAccessVBAで、VB6等では使えなかった気が…。
ダンボさんがAccessVBAで作成していないとは言い切れませんが。

投稿時間:2004/12/07(Tue) 10:33
投稿者名:ダンボ
URL :
タイトル:
Re^3: 引数渡しのコントロールのイベントを発生させたい
カムリン さん、 琴 さん、どうもありがとうございます。

環境は、VB6だけです。
Evalがあると強力ですね。VBソースを動的に変更して評価実行できるのですから。
VB6から、JScriptオブジェクトを生成してEvalが使えるかなぁと、ちょっと調べたのですが挫折しました。

LESIA さんのレスにも書きましたが、
作ろうとしている部分は、ピクチャーシートの上にVB図形部品をドロップしてデザインするものです。
(デザインモードが完了したら実行モードに切り替えて、それらの部品が動き出すのです。
実行モードでも一部の部品は移動を許して、その時にクリックイベントを発生させたいな、と)
一応、ボタンとラインとサークルとタブストリップとリストボックスとフレームに限定しようかと
思っていますが、まだ種類も個数も確定していません。

投稿時間:2004/12/07(Tue) 11:09
投稿者名:たけ
Eメール:
URL :
タイトル:
Re^4: 引数渡しのコントロールのイベントを発生させたい
動的に追加したコントロールのイベントを処理したいなら
コントロールの変数をWithEventsで宣言しておけばいいのでは?

投稿時間:2004/12/10(Fri) 10:28
投稿者名:ダンボ
URL :
タイトル:
クラス化の検討&保留
たけさん、どうもありがとうございます。

> 動的に追加したコントロールのイベントを処理したいなら
> コントロールの変数をWithEventsで宣言しておけばいいのでは?

WithEventsはクラスモジュールで無ければ使えないので、強いてやるとすれば「標準コントロールを
自作クラスモジュールでインプリメントして、イベントを宣言して独自のコントロールと再定義する」
ですかね。
これはこれで面白そうなので、将来の課題にとって置きます。

元質問である「引数渡しのコントロールはプロパティは参照変更できるが、イベントを起こすことは出来ない?」
については、10日間では結論が見えませんでしたので、これも保留として、質問をクローズします。

実際のコーディングはどうしたか?というとLESIAさんの意見に近く、使うことが必須な1コントロールに対して
    If Source.Name = "tbsSOLs" Then tbsSET  (tbsSOLs_Clickでやるべき処理をサブルーチン可)
で逃げております。