Top > OOobbs2 > 161
** [[OOobbs2/161]] [#p529a731]
-''サマリ'': ODB ファイルへのマクロの保存 OOo 3.1 以降?
-''環境'': Other
-''状態'': 投稿
-''投稿者'': [[はにゃ?]]
-''投稿日'': 2008-12-02 (火) 01:15:27

*** 質問 [#b3db020f]
OOo 3.1 から Base の ODB ファイルへマクロが保存できるようになるようです。

OOo の開発者用ビルド DEV300 m36 が公開されていますが、このバージョンでは ODB ファイルへマクロが保存できるようになっています。

(cws odbmacro1-3 が取り込まれたのが DEV300 m34 付近です。)

開発者用ビルドを利用してみたい方は OpenOffice.org 公式からダウンロードしてください。テスト版なので正式に使用しないことが推奨されていることに注意。

変更点などを見ていきます。

リンク
-http://wiki.services.openoffice.org/wiki/Macros_in_Database_Documents


#contents
*** 回答 [#pb8bf263]

***Basic マクロの管理 [#tdb7745c]
ツール - マクロ - マクロの管理 - OpenOffice.org Basic... からマクロの保存先を表示すると ODB ファイルも表示されていることが分かります。以前のバージョンでは ODB ファイルはここには表示されませんでした。

&ref(organizer.png,nolink);

ライブラリの作成およびモジュールが表示されています。

***フォームドキュメント [#sa3a6a1c]
ODB ファイルにフォームを作成してそこにマクロを入れようとすると、保存先や Basic IDE のライブラリ選択にフォームドキュメントが表示されません。

ODB ファイルに含まれるフォームドキュメントに OOo Basic のマクロは保存できなくなりました。

&ref(form-1.png,nolink);

フォームドキュメントが Basic IDE のライブラリ選択リストボックスに表示されていません。また、フォーmドキュメントのタイトルバーに表示されているドキュメントのタイトルが以前とは違っています。前にデータベースファイル名が付いています (ここではフォームのタイトルは Table1)。

***フォームコントロールへのイベントの割り当て [#ra520d25]
フォームにマクロが保存できなくなったので、ODB ファイルにマクロを作成して保存しておきました。

フォームにボタンを配置してイベントを割り当てようとすると、マクロセレクターは次のように ODB ファイルを含めて表示します。

&ref(selector.png,nolink);

フォームコントロールから ODB ファイルへ記述したマクロを実行できます。

***フォームコントロールからのマクロの実行 [#e1d4b17c]
上記で割り当てたマクロを実行します。ボタンに次のようなマクロを割り当てます。

 Sub Button_1_Push( oEv )
   mri ThisComponent
   
   mri ThisDatabaseDocument
 End Sub

mri はオブジェクトを調べるための拡張機能ツールです。また、ThisComponent は以前からあるランタイム関数でドキュメントオブジェクトを返します。ThisDatabaseDocument は新設されたランタイム関数でそのドキュメントが所属するデータベースドキュメントオブジェクトを返します ([[参照>http://wiki.services.openoffice.org/wiki/Macros_in_Database_Documents#Changes_with_Macros_in_Database_Documents]])。ドキュメントがデータベースドキュメントに所属していなければ ThisDatabaseDocument 関数は Null を返します。

実行すると、確かに ThisComponent はフォームドキュメントオブジェクトを、ThisDatabaseDocument はフォームが所属しているドキュメントのオブジェクトを返していることが分かります。

(Basic IDE が絡んでいるときには ThisComponent に対して注意が必要です。)

ThisDatabaseDocument がフォームの所属しているデータベースオブジェクトを返す様になったことから、ThisComponent.getParent() としてフォームドキュメントから親ドキュメントのデーターベースドキュメントにアクセスするのは推奨されなくなりました。その代わりに ThisDatabaseDocument が利用できます。

***既存の ODB ファイル [#mafa2c19]
フォームなどにマクロを埋め込んだ既存の ODB ファイルはどうなるでしょうか?

以前のバージョンで作成して、フォームにマクロを埋め込んだもの、を開いてみると次のような表示が出ます。

&ref(notice.png,nolink);

別に以前のバージョンで利用するのと同じように利用できます。しかし、推奨しないとのことです。

また、ツール - マクロ - マクロの管理 - OOo Basic でマクロの一覧を表示すると、フォームドキュメントが表示されていてマクロがあることが分かります。その代わりにデータベースドキュメントのライブラリは表示されません。共存は無理なようです。

また、移行ツールを利用できると書かれています。

***移行ツール [#t22cff97]
Tools - Migrate Macros... メニューからマクロ移行ツールが利用できます。(このメニューが表示されるのは以前のバージョンで作成してフォームなどにマクロが含まれている場合のみです。新たに作成したドキュメントではこのメニューは表示されません。)

&ref(mw-1.png,nolink);

&ref(mw-2.png,nolink);

&ref(mw-3.png,nolink);

&ref(mw-4.png,nolink);


移動されたマクロはデータベースドキュメントの"種類_フォーム名_ライブラリ名"のライブラリに入ります。

(一度、以降ツールでうまくいかなかったのですが原因不明。ウィザードでバックアップを取るようになっていますが、事前にバックアップを取ることをお勧めします。)

***ドキュメントのイベント [#yd96b9e5]
ドキュメントを開いたときなどのイベント駆動マクロもフォームなどに割り当てられます。これらも ODB ファイルやそのほかの場所にあるマクロを選択することになります。


***最後に [#s6c2acb4]
- 以前のバージョンで作成したマクロを含むフォームなどがある ODB ファイルは同じように利用できる
- マクロを移すための移行ウィザードが用意される
- ODB ファイルに含めたフォーム、レポートドキュメントにマクロが保存できなくなる
- その代わりに ODB ファイルにマクロを保存できるようになる
- ThisComponent 類似のデータベースドキュメントオブジェクトを返すランタイム関数 ThisDatabaseDocument が利用できるようになる


3.1 以降のバージョンに乗り換える可能性があるのであれば ODB ファイルにフォームを作成せずに外部のファイルとしてフォームを作成したほうがいいかもしれません。

※完全に移行させられるわけではありません。上記の様に以前のものも使用できます。

とりあえずここまで。invokationContext 関連は書く気が起きたら書きます (OOo Basic をのみを使用しているのであれば特に関係ありません)。

#comment
*** 感想,コメント,メモ [#xa6a3150]
- DEV300_m37で確認しました。移行ツールは日本語化されていてわかりやすくなっています。ただ、問題は日本語のフォーム名を使っていると、確実に移行に失敗します。なぜならば、マクロのライブラリには日本語が使えないにもかかわらず、移行の際にライブラリ名の一部にフォームの名前を使ってしまうので。事前に日本語のフォーム名を英語に直さないといけません。これは必須なのですが、よほど事前にアピールしないと問題になりそうです。 -- M.Kamataki &new{2008-12-19 (金) 10:50:53};
- なるほど。フォーム名 "フォーム1" で試すとマクロが表示されませんでした。同様に、"Flöte" など西欧系の文字が入ったフォーム名でも同様に失敗しますね。アジア圏以外、ヨーロッパ圏でも問題が多発しそうです。issue 登録すべきでしょう。以下はどうでもいいことを書きますが、ウィザードで移行したファイルを zip 解凍するとマクロが保存されていることがわかります。しかし、ファイルを OOo で開くとマクロが表示されません。移行後に開く ODB ファイルに Basic IDE から、ライブラリ名に問題のあるライブラリにモジュールを作成、マクロを入力して保存すると、odb ファイルには正しく保存されます。やはり読み込みには失敗しますけど。%%なにかの関連 issue でライブラリ名にマルチバイト文字を利用できるようにするものが・・・たぶん気のせいですね。%% -- はにゃ? &new{2008-12-19 (金) 12:12:39};
- non-ASCII文字のライブラリ名についてはすでにIsseuが登録されていました。Q&Aページにまとめのためにページを作成しました。http://oooug.jp/faq/index.php?faq/4/1426 です。 -- M.Kamataki &new{2008-12-19 (金) 16:19:11};

#comment

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