Top > OOobbs2 > 80

OOobbs2/80 Edit

  • サマリ: OOo BasicでQuickLauncherを作成する試み
  • 環境: Basic
  • 状態: 解決
  • 投稿者: M.Kamataki
  • 投稿日: 2007-10-17 (水) 16:21:02

質問 Edit

サマリのような、無謀なことに挑んでおります。"soffice.exe macro:///QuickLauncher.Module1.Main"で起動したBasicのダイアログ上のボタンにプロシージャを割り当てて、".uno:NewDoc"などのコマンドを実行できればと考えたのですが、うまくいきません。

コマンドは、フレームオブジェクトが必要なので、ダイアログのTitle名で拾えないかと、次のようなプロシージャを作成しました。

Sub NewDoc
dim document   as object
dim dispatcher as object
rem フレームオブジェクトの取得はさる方のものを拝借
iLast = StarDesktop.getFrames().getCount() 

For i = 0 To iLast - 1
	sTitle = StarDesktop.getFrames().getByIndex(i).Title
	If Instr(sTitle, "QuickLauncher") <> 0 Then
		iNum = i
	End If
Next i

document = StarDesktop.getFrames().getByIndex(iNum)

dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:NewDoc", "", 0, Array())

End Sub

これで、IDEからの起動では実行できましたが、ダイアログの名前が拾えたわけではなく、単に変数"iNum"の値が"0"を返して実行可能となったようで、Basicのダイアログを起動しての実行では、Basicランタイムエラーとなり、

Message: OFrames=getByINdex - Index out of bounds。

と表示されます。

このことから、Basicのダイアログはフレームオブジェクトとはならないようです。

ということで、何か代替えの方法がないかどうか、お知恵をお借りしたいと思っております。:p

なお、Shell関数でもsoffice.exeを呼び出してみましたが、やはりダイアログだけの状態からは、起動できませんでした。起動プロセスまでは実行されるものの、静かにお亡くなりになるようでした。

回答 Edit

  • ぢすぱっち

StarDesktop の getFrames からで取得できるフレームコンテナからアクセスできるフレームはそのコンテナオブジェクトに append されたものだけです。

それはさておき、

Sub Main
  aURL = CreateUnoStruct("com.sun.star.util.URL")
  aURL.Complete = ".uno:NewDoc"
  ParseURL(aURL)
  oDispatch = StarDesktop.queryDispatch(aURL,"_self",0)
  If NOT IsNull(oDispatch) Then
    oDispatch.dispatch(aURL,Array())
  End IF
End Sub


Sub ParseURL(aURL)
  oTransformer = CreateUnoService("com.sun.star.util.URLTransformer")
  oTransformer.parseStrict(aURL)
End Sub
  • はにゃ?? 2007-10-17 (水) 17:20:26
  • 追記 - 説明忘れてました。

com.sun.star.frame.Desktop サービスは com.sun.star.frame.Frame サービスを inculde しているので XDispatchProvider インターフェースもサポートしています。コマンドはフレームに読み込まれているドキュメントの種類などによって実行できるものが異なります。queryDispatch メソッドに URL を与えて呼び出したとき、対応するプロトコルハンドラが XDispatch インターフェースを返せばそのコマンドは利用できます。

要するに、queryDispatch メソッドの返り値が Null でなければそのコマンド URL は利用できます。

コマンド URL を与えるのに必要な URL struct は、完全な URL を示す Complete のみ指定してやり、後は URLTransformer サービスに任せます。parseStrict メソッドの引数は [inout] なので与えた変数に与えた値が保存されます。OOo Basic のプロシージャ呼び出しは参照なので Sub ParseURL の戻り値は必要ではありません。

  • はにゃ?? 2007-10-18 (木) 00:35:05
  • 説明まで付けていただいて、ありがとうございます。queryDispatchでぐぐると、過去のはにゃ?さんの2003年頃のコメントに行き当たったりします。昔からお世話になります。 -- M.Kamataki 2007-10-18 (木) 10:11:43
  • ググって見ました。前半は思い出せましたが queryDispatch を使った後半はぜんぜん記憶にありませんでした・・・。 -- はにゃ?? 2007-10-19 (金) 02:17:40

感想,コメント,メモ Edit

  • 質問内容とは直接関係ありませんが、Basic IDE のダイアログエディタで作成したダイアログを CreateUnoDialog で作成して execute したダイアログをずっと開いておこうとすると、他の Basic の実行と競合します。

XExcutable インターフェースの execute メソッドでダイアログを表示すると Basic のコードの実行が処理待ちになります。そのあとで BasicIDE を開くと実行ボタンが無効になりコードの編集も出来ません。

  • はにゃ?? 2007-10-17 (水) 17:37:21
  • そうですね。Basicを使う方にとってはいらないものかもしれません。実用的かどうかはともかく、まずダイアログを立ち上げることで、OOoの起動の遅さをごまかせるのではないかという意味合いが強いです。本来なら、Javaなど多言語で実現すべきなのでしょう。今回「も」ありがとうございました。 -- M.Kamataki 2007-10-18 (木) 10:17:49
  • なるほど。急速にPC性能が向上したせいで Office 系のソフトまでスペックが必要になったせいですねぇ。確かに、数年経過したPCだと OOo は起動が遅く感じますね。 -- はにゃ?? 2007-10-19 (金) 02:19:37


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