プロジェクト外のモジュールを一時的に組み込むには?

解決


  2007-03-01 22:34:03  No: 98171

こんにちは・・よろしく、お願します。
プロジェクトにオプション設定ができるように考えています。
オプション設定は所定の名前のモジュール(.bas)に記述します。
プロジェクトはソースレベルの実行でオプションのモジュール(.bas)の有無を
確認し、存在するときオプションのモジュール(.bas)をプロジェクトに
組み込み、モジュール内のFUNCTIONを実行するようにしたいのですが・・・

できるか、できないのかもわかりません・・・
できるのでしたら、具体的にご教示いただきたいのですが・・・
以上、よろしく、御願いします


魔界の仮面弁士  2007-03-02 00:54:20  No: 98172

*.bas 、ということは、非.NET な方の Visual Basic ですね。

コンパイル前の Visual Basic ソースを直接読み込んで解釈させる、
というのは無理ですが、そのコードを VBScript の文法で書くのであれば、
実行時に動的にロードすることも可能です。

[コンポーネントの追加]で、"Microsoft Script Control 1.0" を追加して、
それをフォームに貼ってみてください。

Option Explicit

Private Sub Command1_Click(Index As Integer)
    ScriptControl1.Reset    '前回読んだコードを破棄
    
    '外部のスクリプトを実行時に読み込む
    ScriptControl1.AddCode Text1.Text
    
    If Index = 0 Then
        'Function プロシージャのテスト … v = Sample1(123, 456)
        Dim v As Variant
        v = ScriptControl1.Eval("Sample1(123, 456)")
        MsgBox TypeName(v) & "型の '" & CStr(v) & "' が返されました"
    Else
        'Sub プロシージャのテスト … Call Test1()
        ScriptControl1.ExecuteStatement "Test1()"
    End If
End Sub

Private Sub Form_Load()
    Command1(0).Caption = " Sample1(123, 456) "
    Command1(1).Caption = " Test1 "
    
    ScriptControl1.Language = "VBScript"
    
    'MultiLine = True で。
    Text1.Text = _
        "Option Explicit" & vbCrLf & _
        "Function Sample1(a, b)" & vbCrLf & _
        "  Sample1 = a * b" & vbCrLf & _
        "End Function" & vbCrLf & _
        "Sub Test1()" & vbCrLf & _
        "  MsgBox FormatDateTime(Now())" & vbCrLf & _
        "End Sub"
End Sub


  2007-03-02 01:17:34  No: 98173

魔界の仮面弁士様

ご教示いただきましてありがとうございます。
こ、こんなことができるなんて・・・・しらなかったです!!
ありがとうございました


  2007-03-02 03:02:11  No: 98174

魔界の仮面弁士様のご指示どおりに実施して動作内容はよいのですが、global変数をscript内でLETしても無効になってしまうのですが、有効にするにはどうすれば
よろしいのでしょうか?

ご教示ください


魔界の仮面弁士  2007-03-02 04:50:10  No: 98175

> 様
できれば、「さん」で。

> global変数をscript内でLETしても無効になってしまうのですが
『無効』というのが、どういう状況を表しているのかも書きましょう。(^^;

で…その変数は、Script 内で宣言されたものですか?
それとも VB6 側の変数ですか?

VB6 側の変数だとしたら、Script 側からは直接操作できません。
その場合は、その変数をクラスモジュールにプロパティ定義して、
それを ScriptControl の AddObject メソッドで登録して使うことで
代用してください。(詳細は、ScriptControl のヘルプを参照)

Script 側の変数だとしたら、特に制限はないはずです。
値が消えてしまうという意図であるならば、誤って Reset していないかを
確認してみてください。

Option Explicit

Private Sub Command1_Click()
    Dim v As Variant
    v = ScriptControl1.Eval("gSec")
    MsgBox TypeName(v) & "型の '" & CStr(v) & "' が返されました"
End Sub

Private Sub Command2_Click()
    Dim sec As Integer
    sec = Second(Now())
    
    Dim scriptCode As String
    scriptCode = "gsec = " & CStr(sec)
    ScriptControl1.ExecuteStatement scriptCode
End Sub

Private Sub Form_Load()
    Command1.Caption = "gSecを読み込む"
    Command2.Caption = "gSecを更新する"

    Text1.Locked = True
    
    Text1.Text = _
        "Option Explicit" & vbCrLf & _
        "Dim gSec" & vbCrLf & _
        "gSec = Second(Now())"
        
    ScriptControl1.Language = "VBScript"
    ScriptControl1.ExecuteStatement Text1.Text
End Sub


  2007-03-02 06:01:55  No: 98176

魔界の仮面弁士 さん・・・
説明不足で申し訳ございませんでした。
お察しの通りでscript外(vb6)で定義したglobal変数をscript内でLETしました。
直接操作できないのは残念ですが・・・・
別な方法を考えてみます・・・・

ありがとうございました


  2007-03-02 06:04:31  No: 98177

いろいろ、ありがとうございました


魔界の仮面弁士  2007-03-02 17:33:51  No: 98178

> 直接操作できないのは残念ですが・・・・
> 別な方法を考えてみます・・・・
ん? そのための回避策として、AddObject メソッドを使う方法を
すでに提示したと思いますが……それでは駄目だったのでしょうか?

'--- Class1 ---
Option Explicit
'VBScript からもアクセス可能なグローバル情報として使う
Public Field1 As String
Public Field2 As Long

'--- Module1 ---
Option Explicit
Private mAppInfo As Class1
Public Property Get AppInfo() As Class1
    If mAppInfo Is Nothing Then
        Set mAppInfo = New Class1
    End If
    Set AppInfo = mAppInfo
End Property

'--- Form1 ---
Option Explicit

Private Sub Form_Load()
    ScriptControl1.Language = "VBScript"
    
    '自作クラスを、VBScript 側にグローバル情報として登録
    ScriptControl1.AddObject "Hoge", AppInfo, True
    
    Text1.Text = _
        "Option Explicit" & vbCrLf & _
        "Field1 = ""abc""" & vbCrLf & _
        "Field2 = 9876"

    ScriptControl1.ExecuteStatement Text1.Text
End Sub

Private Sub Command1_Click()
    'VB6側からの代入
    AppInfo.Field1 = "VB6 DATA"
    AppInfo.Field2 = 24680
End Sub

Private Sub Command2_Click()
    'VBScript側からの代入
    ScriptControl1.ExecuteStatement "Field1 = ""VBS DATA"""
    ScriptControl1.ExecuteStatement "Field2 = 13579"
End Sub

Private Sub Command3_Click()
    'VB6側からの値取得
    MsgBox AppInfo.Field1 & vbCrLf & AppInfo.Field2
End Sub

Private Sub Command4_Click()
    'VBScript側からの値取得
    MsgBox ScriptControl1.Eval("Field1 & vbCrLf & Field2")
End Sub


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

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






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