OOobbs/42
質問
いつも丁寧に教えて頂きありがとうございます。 さて、文字列をマクロで作った後、これをマクロ中で式として認識させる方法はありますか? 例えば、 yDR(0)=Array(0,10)、 yDR(1)=Array(1,11)、 yDR(2)=Array(2,12)、 yDR(3)=Array(3,13) のような配列であるとき、 Sub Test() dim a as string n = 3 a= "Array(" For i = 0 to n a = a & iif(i=0, "", ",") & "yDR(" & CStr(i) & ")" Next i a = a & ")" End Sub を実行すると、aには"Array(yDR(0), yDR(1), yDR(2), yDR(3))"という文字列が代入されます。その上で、z=Array(?a?)としたとき、これが z=Array(Array(yDR(0), yDR(1), yDR(2), yDR(3)))と同等となるような文字列を式に変換してくれる??に相当するものがあれば、とても便利です。確か、dBASE(古くてすいません)では&Aのように文字Aの前に&を前置すると文字Aそのものではなく文字Aに代入されている式なり文字列を表現するような変換が出来たように記憶しているのですが、OOoBasicではそんな変換をしてくれるものはないでしょうか?ちょっとdBaseの"&"とは意味合いが違うかもしれませんが、教えて頂ければありがたく思います。 回答
ざんねんです。 話はすこし変わりますが,FindObject 関数,FindPropertyObject 関数 といった関数もあるようです。 新しいモジュールを動的に定義して関数を作成して呼び出すことでできそうですが,確かうまくいったような ... ? いかなかったかな ?
次の例では,Sub Main はドキュメントの BasicLibrary の "Standard" にあります。また,新しく "Standard" ライブラリに "NewModule" というモジュールを作成します。そのときに sCode 変数の中の文字列をモジュール中のコードとして記入します。新しく作成した "NewModule" の中には Sub NewSub を定義しておき,Sub Main の中から NewModule.NewSub といったような形で呼び出します。 Sub Main Dim oDoc As Object, oLibraries As Object Dim oLib As Object Dim sLibName As String, sModName As String Dim sCode As String Dim sLF As String', sDQ As String sLF = Chr(10) 'sDQ = Chr(34) ' Chr(34) == " charactor sModName = "NewModule" sLibName = "Standard" sCode = "Sub NewSub" & sLF & _ " MsgBox " & """New Module!""" & sLF & _ "End Sub" oDoc = ThisComponent oLibraries = oDoc.BasicLibraries If oLibraries.hasByName(sLibName) Then oLib = oLibraries.getByName(sLibName) If oLib.hasByName(sModName) Then oLib.replaceByName(sModName,sCode) Else oLib.insertByName(sModName, sCode) End If NewModule.NewSub End If End Sub このコードを実行すると,新しく "NewModule" モジュールが作成されて MsgBox に "New Module!" と表示されます。このときの "NewModule" モジュール中のコードは次のようになっています。 Sub NewSub MsgBox "New Module!" End Sub 動的に作成したコードは,Sub Main を実行しても IDE 中にはすぐには表示されません。表示させるには表示しているライブラリを一度別のライブラリに変更してみてください。 動的に追加するモジュールに入力するコードを作成するときには,次の点に注意す売る必要があります。
また,ライブラリを取得するときや,モジュールを削除,追加,置換するときにはできるだけ hasByName メソッドを使ってライブラリやモジュールの有無を確認した方がいいと思います。以前このようにライブラリを削除,追加を試していたときにはごちゃごちゃして大変だったような気がします。 BasicLibraries? および Library? を参考にしてください。 ここでは,Sub で試しましたが Function でも同じように動作します。 動的なライブラリの追加削除は「次回以降の OOoBasic マクロの起動時のためのデータの保存」などにも使用することができます。たとえば,15 panels ではパネルを動かした回数や時間や設定を Settings モジュールを生成して,値を戻す Function として保存しています。配列を戻すような Function も定義しています。 Function を Function Settings_TimeScoreShifted() Settings_TimeScoreShifted = Array( 85, 115, 110, 250, 350 ) End Function と定義して, nNumT() = Settings_TimeScoreShifted() と取得することで配列として変数 nNumT に受け取ることができます。
|