こんにちは・・よろしく、お願します。
プロジェクトにオプション設定ができるように考えています。
オプション設定は所定の名前のモジュール(.bas)に記述します。
プロジェクトはソースレベルの実行でオプションのモジュール(.bas)の有無を
確認し、存在するときオプションのモジュール(.bas)をプロジェクトに
組み込み、モジュール内のFUNCTIONを実行するようにしたいのですが・・・
できるか、できないのかもわかりません・・・
できるのでしたら、具体的にご教示いただきたいのですが・・・
以上、よろしく、御願いします
*.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
魔界の仮面弁士様
ご教示いただきましてありがとうございます。
こ、こんなことができるなんて・・・・しらなかったです!!
ありがとうございました
魔界の仮面弁士様のご指示どおりに実施して動作内容はよいのですが、global変数をscript内でLETしても無効になってしまうのですが、有効にするにはどうすれば
よろしいのでしょうか?
ご教示ください
> 様
できれば、「さん」で。
> 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
魔界の仮面弁士 さん・・・
説明不足で申し訳ございませんでした。
お察しの通りでscript外(vb6)で定義したglobal変数をscript内でLETしました。
直接操作できないのは残念ですが・・・・
別な方法を考えてみます・・・・
ありがとうございました
いろいろ、ありがとうございました
> 直接操作できないのは残念ですが・・・・
> 別な方法を考えてみます・・・・
ん? そのための回避策として、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
ツイート | ![]() |