tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルプロシージャについて
記事No14163
投稿日: 2009/10/14(Wed) 12:43
投稿者むむむ
こんにちわ。下記のような無駄なことを防ぐ方法を教えてください。とても基本的なことかもしれないのですが、調べ方が悪いのか一向に分かりません。

例えば
<標準モジュール>
Sub ABC_000
    ....
End sub
     :
Sub ABC_999
    ....
End Sub

と、プロシージャが1000個あるとして、メインフォームのボタンBtn(0 to 100)からインデックスによってそれぞれをコールしたい時に、

<メインフォーム>
Sub Btn_Click(Index as Integer)
    Select Case Index
        Case 0: Call ABC_000
        Case 1: Call ABC_001
                  :
        Case 999: Call ABC_999
    End Select
End sub

という無駄な方法以外で何かないでしょうか?
例えば

Sub Btn_Click(Index as Integer)
    Dim Obj as xxx
    
    Set Obj = "ABC_" & Index
    Call Obj
End sub

みたいな・・・
プロシージャABC内部で Index によって Select する方法はなしと考えてください。ひとつひとつのプロシージャが大きいものですから・・・

[ツリー表示へ]
タイトルRe: プロシージャについて
記事No14164
投稿日: 2009/10/14(Wed) 13:01
投稿者魔界の仮面弁士
> Btn(0 to 100)からインデックスによってそれぞれをコールしたい時
0 To 100 ならば、ABC_000 〜 ABC_100 だと思うのですが、
提示のコードでは ABC_000 〜 ABC_999 になっていますね。何故ですか?
0 To 999 では無いのでしょうか?


> Set Obj = "ABC_" & Index
CallByName 関数を試してみてください。

標準モジュールを相手に使う事は出来ませんが、その処理をクラスモジュールに移せば、
 Call CallByName(オブジェクト, "ABC_123", VbMethod)
とか、
 result = CallByName(Text1, "Text", VbGet)
といった記述が可能となります。

[ツリー表示へ]
タイトルRe^2: プロシージャについて
記事No14165
投稿日: 2009/10/14(Wed) 14:28
投稿者むむむ
> 0 To 999 では無いのでしょうか?
です。すいません。

>  Call CallByName(オブジェクト, "ABC_123", VbMethod)

やはりCallByNameでできるのですか。以前 フォーム相手にこの関数使ったことがあるのですが、この場合の"オブジェクト"がなかなか解決せず、無理と思い込んでいました。

不躾ですがこの場合、"オブジェクト"はどうなるのでしょう??

[ツリー表示へ]
タイトルRe^3: プロシージャについて
記事No14167
投稿日: 2009/10/14(Wed) 15:16
投稿者ダンボ
横から失礼します。

> 不躾ですがこの場合、"オブジェクト"はどうなるのでしょう??

「どうなるの」が「何を書けばよいのか」という意味ならば、
http://support.microsoft.com/kb/186143/ja
を読めばわかると思います。

[ツリー表示へ]
タイトルRe^4: プロシージャについて
記事No14170
投稿日: 2009/10/14(Wed) 16:13
投稿者むむむ
> 「どうなるの」が「何を書けばよいのか」という意味ならば、
> http://support.microsoft.com/kb/186143/ja

色々な助言ありがとうございます。とても勉強になります。
動作方法は理解できました。簡単なコードも書くことができました。

が、実現にはもう少し勉強が必要なようで、もう少し贅沢を言わせていただくと、各プロシージャがとてもボリューム大、且つ管理のし易さから、個々のプロシージャを個々の標準モジュール(1モジュールに1プロシージャ)にしていたため、CallByNameのためにクラス化するには同クラスモジュールにする必要が出てしまい、管理が困難になってしまいました(そのクラスモジュールが化け物のようにデカイ)・・・(T T)
クラスモジュールにしても標準モジュールにしてもやはりどこかで Select する以外ないのですかね・・・^^;

[ツリー表示へ]
タイトルRe^5: プロシージャについて
記事No14171
投稿日: 2009/10/14(Wed) 18:31
投稿者魔界の仮面弁士
> CallByNameのためにクラス化するには同クラスモジュールにする必要が出てしまい、

クラスモジュールの Instancing プロパティを GlobalMultiUse にすれば、
それを標準モジュールの代わりに使えます。


たとえば、Class1 に『Public Sub ABC_000()』がある場合、
通常であれば、そのクラスを利用するには

 Private Sub Command1_Click()
  Dim x As Class1
  Set x = New Class1
  x.ABC_000
 End Sub

のように、クラスのインスタンスを生成しなければなりませんが、
そのクラスモジュールを GlobalMultiUse に設定しておけば、

 Private Sub Command2_Click()
  ABC_000
 End Sub

のように、あたかも標準モジュール上のプロシージャと同様に扱えます。
こうすれば、利用側のコード変更は最低限で済むかも知れません。
(もっとも、CallByName を使う場合にはクラス変数が必須になるのですが…)


# なお GlobalMultiUse にするためには、そのプロジェクトを ActiveX DLL プロジェクトに
# 設定し、使用側はそれを参照設定する必要があります。

[ツリー表示へ]
タイトルRe^6: プロシージャについて
記事No14172
投稿日: 2009/10/14(Wed) 19:00
投稿者むむむ
> クラスモジュールの Instancing プロパティを GlobalMultiUse にすれば、
> それを標準モジュールの代わりに使えます。

GlobalMultiUse ですか。知らなかったです。調べてみると他でも役に立ちそうなことでしたので、何か作ってみて使い方を覚えておくようにします。

[ツリー表示へ]
タイトルRe^3: プロシージャについて
記事No14168
投稿日: 2009/10/14(Wed) 15:18
投稿者YK
こんにちは。

> やはりCallByNameでできるのですか。以前 フォーム相手にこの関数使ったことがあるので

こんな感じで

Formのクラスモジュールに
Private Sub Command1_Click(Index As Integer)
    Call CallByName(Me, "ABC_" & Format(Index, "000"), VbMethod)
End Sub

Sub ABC_000()
    Call ABC_0000 必要なら此処から標準モジュールを呼ぶ
End Sub

Sub ABC_001()
    MsgBox "ABC_001"
End Sub

Sub ABC_002()
    Debug.Print "ABC_002"
End Sub

[ツリー表示へ]