Top > OOobbs2 > 80
  • The added line is THIS COLOR.
  • The deleted line is THIS COLOR.
  • Go to OOobbs2/80.

** [[OOobbs2/80]] [#ree5ace3]
-''サマリ'': OOo BasicでQuickLauncherを作成する試み
-''環境'': Basic
-''状態'': 解決
-''投稿者'': M.Kamataki
-''投稿日'': 2007-10-17 (水) 16:21:02

*** 質問 [#b6019972]
サマリのような、無謀なことに挑んでおります。"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を呼び出してみましたが、やはりダイアログだけの状態からは、起動できませんでした。起動プロセスまでは実行されるものの、静かにお亡くなりになるようでした。
*** 回答 [#t8b2ea29]
- ぢすぱっち

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

-- [[はにゃ?]] &new{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>http://api.openoffice.org/docs/common/ref/com/sun/star/util/URL.html]] は、完全な URL を示す Complete のみ指定してやり、後は [[URLTransformer>http://api.openoffice.org/docs/common/ref/com/sun/star/util/URLTransformer.html]] サービスに任せます。parseStrict メソッドの引数は [inout] なので与えた変数に与えた値が保存されます。OOo Basic のプロシージャ呼び出しは参照なので Sub ParseURL の戻り値は必要ではありません。

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

#comment
*** 感想,コメント,メモ [#oa61aea3]
- 質問内容とは直接関係ありませんが、Basic IDE のダイアログエディタで作成したダイアログを CreateUnoDialog で作成して execute したダイアログをずっと開いておこうとすると、他の Basic の実行と競合します。

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


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

#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