Top > OOoBasic > Generic > storeinmodule

Basic モジュールへのデータの保存 Edit

OpenOffice.org Basic のマクロはアドインとして別のファイルを組み込むことができないために,マクロの設定に関するデータなどを次回のマクロの実行まで保持しておくことが難しくなっています。

マクロのためのデータの保存には外部のファイルを使用している場合もあります。しかし,外部のファイルの保存場所などがマクロによってまちまちで統一感がありません。

外部のファイルを使用せずとも,OpenOffice.org Basic のモジュールへ文字列のデータとして保存することでこれらの問題を解決することができます。

モジュール中へデータを保存するためには動的に Basic ライブラリを構成,モジュールを生成することが必要です。これらの方法を使うことで Basic モジュール中へデータを保存する方法を紹介します。

また,モジュール中へのデータの保存とライブラリの動的な操作についての注意点なども取り上げます。

モジュールへのデータの書き込み Edit

モジュールへのデータの書き込みには次のプロシージャを使うことができます。このプロシージャを呼び出す際に,"保存する文字列","ライブラリ名","モジュール名"を与えます。

Sub save2module(sLocSaveLine As String, sLocLibName As String, sLocModule As String)
Dim oBasicLib As Object, oLib As Object

  oBasicLib = Globalscope.BasicLibraries
  If oBasicLib.hasByName( sLocLibName ) Then
    If NOT oBasicLib.isLibraryPasswordProtected( sLocLibName ) Then
      If NOT oBasicLib.isLibraryReadOnly( sLocLibName ) Then
        oLib = oBasicLib.getByName( sLocLibName )
        If oLib.hasByName( sLocModule ) Then
          oLib.removeByName( sLocModule )
          oLib.insertByName( sLocModule, sLocSaveLine )
        Else
          oLib.insertByName( sLocModule, sLocSaveLine )
        End If
      Else
        MsgBox "This library is readonly!", 0, "Save Error"
      End If
    Else
      MsgBox "This library is password prtected!", 0, "Save Error"
    End If
  End If
End Sub

このプロシージャについて詳しく見ていきます。

まず,

  oBasicLib = Globalscope.BasicLibraries

の部分は Globalscope を使用しているので OpenOffice.org のアプリケーションライブラリにおいて使用することになります。ここで,アプリケーションのライブラリではなく個別のファイルの Basic ライブラリを使用する場合には次のように書き換えます。

  oBasicLib = BasicLibraries

つぎに,

  If oBasicLib.hasByName( sLocLibName ) Then

といった処理があります。指定したライブラリ名のライブラリが存在するかどうかを確認しています。ここではライブラリがない場合に何も処理していませんが,新しくライブラリを作成することもできます。しかし,設定用のライブラリなどを作成するよりも現在使用しているライブラリ中のモジュールへの保存をお勧めする意味でもここでは新たにライブラリを作成していません。

    If NOT oBasicLib.isLibraryPasswordProtected( sLocLibName ) Then

ライブラリはパスワードで保護することができるため,ライブラリがパスワードで保護されていないかどうかを調べています。パスワード保護されているライブラリに書き込みを行おうとするとエラーとなります。

また,ライブラリが書き込み専用の場合には書き込むことができませんので次のように書き込み専用かどうかを判断しています。

      If NOT oBasicLib.isLibraryReadOnly( sLocLibName ) Then

さて,ここからが重要です。

        oLib = oBasicLib.getByName( sLocLibName )
        If oLib.hasByName( sLocModule ) Then
          oLib.removeByName( sLocModule )
          oLib.insertByName( sLocModule, sLocSaveLine )
        Else
          oLib.insertByName( sLocModule, sLocSaveLine )
        End If

の部分で実際にモジュール中へデータを保存しています。まず,指定したライブラリを取得してそのライブラリ中にデータ保存に指定したモジュールがあるかどうかを調べています。モジュールが存在する場合には,モジュールを一度削除してから新しくモジュールを作り直しています。ない場合にはそのまま作成します。

一度モジュールを削除しているのはこの操作を行ったほうが安定した動作が得られたためです。

このプロシージャを使用することでデータをモジュール中へ保存することができます。このモジュールを使用する際の注意点は,モジュール中へ保存する文字列が Basic ライブラリのモジュールとして読み込まれたときにエラーの出ない形式の文字列としておくことです。

関数データ形式と読み込み Edit

書き込むデータの形式とデータの読み込みについてです。

モジュールへデータや設定として書き込む文字列はただ単なる文字の羅列ではいけません。Basic のモジュールとして作成されるために,モジュールが読み込まれた際にコンパイルが行われてエラーとなる可能性があるからです。このエラーを防ぐためには書き込むデータが OpenOffice.org Basic の文法に合致している必要があります。

文法的にエラーが出ないようにするために一番簡単な方法は,全ての行をコメントとして "'" (シングルクォート) で始めることです。

モジュールへ保存するのが設定の時には,「キー=データ」の形式を使いたくなります。しかし,OOoBasic ではハッシュ型の配列がサポートされていないためにこの形式の読み込みは複雑になります。また,モジュールのデータを文字列として読み込むことが必要になるので,データの読み出しの際にもライブラリとモジュールを取り扱うコードを記述しなければいけません。

そこで提案するのが,Function としてのデータの保存です。文法的なエラーが出ないようにするには保存するデータを注意して作成する必要がありますが,データの読み出しが簡単になる利点があります。

関数データ形式 Edit

Function としてのデータ形式の例をデータの型で注意する必要のあるものを取り上げます。

まずは,データが Long 型の値です。

Function Setting_Shifted() As Long
Setting_Shifted = 1199
End Function

Basic の関数の形として戻り値を As Long として定義しています。型が Integer などの時にも同じようにできます。

次は String 型のときです。

Function Setting_FontName() As String
Setting_FontName = "Impact"
End Function

文字列としてのデータは """ (ダブルクォテーション) でくくっておく必要があります。

配列をデータとして保存するときには Function の戻り値を設定せずに次のようにします。

Function Setting_BGColor()
Setting_BGColor = Array( 255, 255, 255 )
End Function

配列が Function の戻り値の場合に型を設定しようとするとエラーとなります。

文字列 Edit

データに使用する文字列で """ (ダブルクォート) や改行コードについてです。

" (ダブルクォート)
ダブルクォートは """" と 4 つのダブルクォートで出力できます。
改行
改行は Chr(10) または Chr(13) および Chr(13) & Chr(10) のどれでも可能です。
タブ
タブは Chr(9) で行います。

データ文字列を作成する際は複雑になりがちです。エラーが出ないように注意して作成してください。

関数データ形式の読み込み Edit

Function としてデータを保存した際には読み込みは非常に簡単で,OOoBasic で Function から値を取得する際と同様のコードを記述するだけです。そのため一つのデータの読み込みに一行のコードしか書く必要はありません。

上記の関数データ形式で示した保存データを読み込むコードを示します。

Sub Reading_Settings(sLocLibName As String, sLocModule As String)
Dim oBasicLib As Object, oLib As Object
Dim nShifted As Long
Dim sFontName As String
Dim nBGColor(2) As Integer

  oBasicLib = Globalscope.BasicLibraries
  If oBasicLib.hasByName( sLocLibName ) Then
    oLib = oBasicLib.getByName( sLocLibName )
    If oLib.hasByName( sLocModule ) Then
      nShifted = Setting_Shifted()
      sFontName = Setting_FontName()
      nBGColor() = Setting_BGColor()
    End If
  End If
End Sub

データを読み込む前にライブラリの有無とモジュールの有無を確認しています。この二つを確認しないでおくと,保存データがないときにエラーとなります。その後,普通に関数を呼び出すことで戻り値としてデータを変数へ取得しています。

ここでは簡略化のために複雑な処理は省略しました。実際に使用するときには,ライブラリやモジュールが存在しないときのためおよびデータの読み出しエラーのために処理を記述する必要があります。ライブラリやモジュールがない,設定が保存されていないときには,データを初期化するような処理を行うようにしておけば問題ありません。

注意点 Edit

データや設定を文字列として Basic モジュール中へ書き込み,保存する際に注意しなければいけない点を取り上げます。

文法エラー Edit

モジュール中の文字列は普通の文字列ではモジュールが読み込まれた際にエラーとなります。モジュール中へ保存する文字列は Basic モジュールへ書き込んだ際にコメントもしくは Basic マクロコードとして認識される必要があります。

Basic IDE の表示の更新 Edit

Basic IDE が開いたままの状態でモジュール中へデータを書き込んでもモジュールのデータは新たに読み込まれるまで更新されることはありません。なので,試しにモジュール中へデータを書き込んだ際には確認する前に一度 Basic IDE を終了,再度開く必要があります。そうしなければモジュール中のデータが更新されません。

モジュールデータのファイル Edit

モジュールのデータは拡張子が "xba" のファイルとして保存されます。このファイルはモジュールを動的に生成しているときにはファイルとしてライブラリのデータファイル群の中に現れません。OpenOffice.org を終了したときにファイルが生成されます。ファイルが作成されていないからといってデータが保存されていないわけではないので,確認する必要がある場合には一度 OpenOffice.org を終了してから確認してください。


Reload   New Lower page making Edit Freeze Diff Upload Copy Rename   Front page List of pages Search Recent changes Backup   Help   RSS of recent changes