* .odtで作ったフォームを開いた時に指定サイズにするマクロ [#pc2c26ee]
 |RIGHT:|LEFT:|c
 |~ページ|[[OpenOffice.org FAQの登録ページ]]|
 |~投稿者|さいきゆみ|
 |~分類|#listbox3(Q&A,faq03,class)|
 |~優先順位|#listbox3(重要,faq03,priority)|
 |~状態|#listbox3(完了,faq03,state)|
 |~カテゴリー|#listbox3(その他,faq03,category)|
 |~投稿日|2011-01-09 16:08:25 (日)|
 |~OS|win7|
 |~依存するページ|faq/4/801|
 |~バージョン|#listbox3(3.3.1,faq03,version)|
 
 //////////バグ対策(以降マッチさせない)
 
 ** メッセージ [#yf527031]
 |LEFT:|c
 |回答ページでは行末に「~」を付加する必要はありません|
 #contents
 
 http://www.oooforum.org/forum/viewtopic.phtml?t=8930 をよみまして、書いてみました。~
  REM  *****  BASIC  *****
  Sub ResizeWindow(X As Integer, Y As Integer) 
  Dim aSize As New com.sun.star.awt.Size 
  aSize.Width = 800
  aSize.Height = 700 
  thisComponent.CurrentController.Frame.ContainerWindow.setOutputSize(aSize) 
  End Sub
 
 //
 
 マクロの画面状の実行ボタンでは、これでサイズが変更されます。
 ところが開いた時にこのマクロを実行するというのを登録しても何も起こらないです。
 
 また、マクロの実行をしたところ「実行中にスクリプトフレームワークのエラーが発生しました」となります。
 
 マクロの文章が悪いのでしょうか?
 
 #ref(errra.jpg,,70%)
 
 #clear
 
 ----
 ***引数 [#ha0d358a]
 >Wannwanno (2011-01-09 16:56:00 (日))~
 ~
 先頭行の引数を修正して下さい、又マルチステートメントには「:」(コロン)を使います。~
  REM ***** BASIC *****
  
  Sub ResizeWindow(Event As com.sun.star.document.DocumentEvent)
  	Dim aSize As New com.sun.star.awt.Size
  	aSize.Width = 800 : aSize.Height = 700
  	thisComponent.CurrentController.Frame.ContainerWindow.setOutputSize(aSize)
  End Sub
 
 //
 ***ありがとうございます。しかし、やはり同じエラーが出ます [#ucb8085d]
 >さいきゆみ (2011-01-09 19:21:35 (日))~
 ~
 マクロを書く画面では問題なく動きます。~
 しかし、フォームのプロパティの読み込み時のマクロの割り当てをして閉じて開いても変化がありません。~
 また、ドキュメント状でのマクロの実行では同様のエラーが出ます。~
 ~
 入力フォームを適度な大きさで開けるようにしたいというのはよく使うので是非知りたいのです。よろしくお願いいたします。~
 
 //
 ***やはりマクロの書き方が違うみたいです [#h3147c6f]
 >さいきゆみ (2011-01-09 21:46:56 (日))~
  Sub ResizeWindow 
  dim vFrame as Object 
  dim vWindow as Object 
  dim vRect as Object 
  dim intHeight as Integer 
  dim intWidth  as Integer 
  dim intXPos as Integer 
  dim intYPos as Integer 
     
  vFrame = StarDesktop.getCurrentFrame() 
  vWindow = vFrame.getContainerWindow() 
  vRect = vWindow.getPosSize() 
  intXPos=vRect.X 
  intYPos=vRect.Y 
  intHeight=712 
  intWidth=1024 
  vWindow.setPosSize(intXPos, intYPos, intWidth, intHeight, 15) 
  End Sub
 このようにしたら動きました。 今あるドキュメントのサイズを変更ということになるようです。 まったくカンでしかわかってないのですが…。~
 ~
 ただ、フォームを開いた時に入力モードにするにはどうしたらいいんでしょうか?~
 入力モードにしないと反映されないようです。
 
 //
 ***マクロの記録で実行しました。 [#e2c3f957]
 >さいきゆみ (2011-01-09 22:20:23 (日))~
 ~
 記録されたマクロに上記のマクロを書いて実行したら思ったようなことができました。~
 ~
 ありがとうございました。~
 
 //
 ***無題 [#z9313adb]
 >Wannwanno (2011-01-10 19:41:52 (月))~
 ~
 文書を開いた時イベントではなくフォームの読み込む時イベントだったんでつね.....(´・ω・`)~
 解決して良かったでつ...~
 
 //
 ***イベントの割り当ての問題 [#h08f4bab]
 >M.Kamataki (2011-01-11 12:10:01 (火))~
 ~
 解決されているようですが、エラーになるのはイベントの割り当ての問題も絡んでいます。その点、整理しないとすっきりしないと思いますので、補足します。~
 ~
 まず、エラーが出るサンプルです。~
 ~
 &attachref(faq6_114sample1.odt);~
 ~
 OpenOffice.orgに標準で登録されているBibliographyデータベースを利用しているので、どなたでも確認できると思います。さいきさんもこのように、どなたでも確認できるサンプルを最初にご提供いただければ、回答される方もイベントの割り当ての問題にも気づいたと思います。~
 ~
 Wannwannoさんの最初のマクロも、イベントの割り当てを「ツール」-「カスタマイズ」‐「イベント」で、「文書を開いた時」に割り当てれば、エラーなく動作します。下記サンプルになります。~
 ~
 &attachref(faq6_114sample2.odt);~
 ~
 また、さいきさんが紹介された別のマクロも「文書を開いた時」に割り当てれば、マクロの記録でとったマクロを追加する必要はないと思いますが、どうでしょうか。以下、サンプルです。(こちらは、「フォームデザイン」バー上の「オートコントロールフォーカス」をオンにしています)~
 ~
 &attachref(faq6_114sample3.odt);~
 ~
 ;; 「スクリプトフレームワークのエラー」がイベントの割り当てが不適正だと発生するのは、faq/6/113のご質問のコメント[[「テストの結果」>http://oooug.jp/faq/index.php?faq%2F6%2F113#j4f13148]]と関連しているかも。ユーザー設定の問題以外でも再現できましたので、貴重な情報だと思います。~
 
 //
 ***ありがとうございました。よくわかりました。 [#h998cdfe]
 >さいきゆみ (2011-01-13 12:33:28 (木))~
 ~
 &attachref(inputresize.bas);の添付のマクロを~
 「ツール」-「カスタマイズ」‐「イベント」 で「文書を開いた時」に実行しても可能なことを確認しました。Wannwannoさんが書いてくれたマクロの方が理解しやすくていいと思います。~
 ~
 フォームを入力状態で閉じれば入力状態のまま開くことができるんですね。~
 いろいろ勉強になりました。~
 ありがとうございました。 ~
 ~
 新しいレコードを追加状態にするマクロはマクロの記録で作ったものですが、これをもう少しスマートに書く方法がありましたら教えてくださるとありがたいです。 ここまでくるとかなり使いやすいフォームになると思います。~
 ~
 今回のことを私のブログにこちらにまとめてみました。~
 http://yumisaiki.blogspot.com/2011/01/blog-post_13.html ~
 
 //
 ***Wannwanno さん分に追加しました [#bf3a9c70]
 >ike@九州 (2011-01-13 18:00:15 (木))~
 ~
  Sub ResizeWindow(Event As com.sun.star.document.DocumentEvent)
   Dim oDoc As Object,oCtrl As Object,oForm As Object
   Dim aSize As New com.sun.star.awt.Size
   oDoc = Event.Source
   oCtrl = oDoc.getCurrentController
   aSize.Width = 800 : aSize.Height = 700
   oCtrl.Frame.ContainerWindow.setOutputSize(aSize)
   oForm = oDoc.getDrawPage.getForms.getByName("MainForm")
   '新規挿入行に移動
   oForm.afterLast
   oForm.moveToInsertRow
   'フォーム上の"txt住所"という名前のテキストボックスにカーソルを持っていく
   oCtrl.getControl(oForm.getByName("txt住所")).setFocus
  End Sub
 
 //
 ***新しいレコード [#x4fe0fcf]
 >M.Kamataki (2011-01-13 20:19:34 (木))~
 ~
 「ドキュメントを開く」イベントではなくボタンの「実行時」のイベントに割りつけることを想定して、「フォームのナビゲーション」バーの「新しいレコード」ボタンの操作を「マクロの記録」で保存したものを紹介したことがあります。faq/4/1244「フォームでボタンでいろんな機能を作成したい」です。このときは知らなかったのですが、マクロを使わないで実現できます。ボタンコントロールのプロパティの設定で「アクション」の中から「新しいレコード」を選べばマクロと同じ動作になります。~
 ~
 フォームでも、入力用のフォームと割り切ればマクロは不要です。さいきさんの以下のサイトで紹介されているスクリーンショットに、「フォームの属性」ダイアログボックスが写っていますよね。その中の「データのみ追加」欄を「はい」に変更すれば、「新しいレコード」ボタンをクリックした状態でフォームが開きます。~
 ~
 >スマートに書く方法がありましたら教えてくださるとありがたいです~
 ~
 英語のフォーラムで同じ質問がありましたが、以下のように回答は付いていません。~
 ~
 Go to field~
 http://user.services.openoffice.org/en/forum/viewtopic.php?f=25&t=35349~
 ~
 関連して以下では、Villeroyさんが、ボタンのアクションを使う方法を紹介しています。~
 ~
 How Do I Create a Form Button to Add a New Record?~
 http://user.services.openoffice.org/en/forum/viewtopic.php?f=39&t=3745~
 ~
 ike@九州さんが回答されたマクロとほぼ同じですが、任意のフィールドにフォーカスを置く方法はprobe1さんが回答されています。~
 ~
 今回はボタンイベントではありませんし、「データのみ追加」のフォームを意図されていないのであれば、「マクロの記録」でとったマクロで十分かと思います。~
 
 //
 ***ありがとうございました。 [#o03aba1a]
 >さいきゆみ (2011-01-13 20:52:14 (木))~
 ~
 ike@九州 様が書いてくださったのは、とてもわかりやすく、これなら覚えられそうな気がします。~
 これからもコツコツ勉強していきます。~
 
 //
 ***見落とし [#c598b7a8]
 >M.Kamataki (2011-01-13 21:06:25 (木))~
 ~
 「新しいレコード」ボタンに相当するのが、以下の部分ですね。見落としていました。~
  '新規挿入行に移動
  oForm.afterLast
  oForm.moveToInsertRow
 
 //
 ***とてもbasicわかりやすいと感じられてよかったです。 [#i6021a69]
 >さいきゆみ (2011-01-13 21:24:33 (木))~
 ~
 &attachref(inputresizeup.bas); ちなみにわかればでいいのですが、今回からスライサーで表示のパーセントが変更できますが、これを150%とかにするとかいうマクロはどう書いたらいいんでしょうか? わかったら教えてください。これもマクロの記録で実現できましたけど^^; おもしろくなってきました。~
 
 //
 ***ズームについて [#eb321b63]
 >M.Kamataki (2011-01-14 00:29:41 (金))~
 ~
 はにゃ?さんのサイトの以下の掲示板でズームについて情報がやり取りされています。~
 ~
 ズームの状態の取得~
 http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOobbs2%2F36~
 
 //
 ***とてもビューティフルになりました。 [#o7676220]
 >さいきゆみ (2011-01-14 07:09:56 (金))~
  REM  *****  BASIC  *****
  Sub ResizeWindow(Event As com.sun.star.document.DocumentEvent)
  Dim oDoc As Object
  Dim oCtrl As Object
  Dim oForm As Object
  Dim oViewSettings As Object
  Dim aSize As New com.sun.star.awt.Size
  oDoc = ThisComponent
  oCtrl = oDoc.getCurrentController
  aSize.Width = 800 : aSize.Height = 750
  oCtrl.Frame.ContainerWindow.setOutputSize(aSize)
  oForm = oDoc.getDrawPage.getForms.getByName("addressinput_form")
  '新規挿入行に移動
  oForm.afterLast
  oForm.moveToInsertRow
  'フォーム上の"fmt郵便番号"という名前のテキストボックスにカーソルを持っていく
  oCtrl.getControl(oForm.getByName("fmt郵便番号")).setFocus
  '120%に拡大
  oViewSettings = oCtrl.ViewSettings
  oViewSettings.ZoomValue = 120
  End Sub
 素人質問で恐縮ですが、一番最初の行の~
 (Event As com.sun.star.document.DocumentEvent) はどういう意味なのでしょうか? わかりましたらよろしくお願いします。~
 
 //
 ***イベント割り当ての場合のみの利用 [#p63f202b]
 >ike@九州 (2011-01-14 09:25:25 (金))~
 ~
 (Event As com.sun.star.document.DocumentEvent) は~
 イベントを変数で受け取り利用したい場合の記述です~
 Event 変数名は任意です oEvent、oEv、ev などの記述を見かけます~
 ~
 利用しないのであれば記述は必要ありません。~
 ~
 利用した場合、以下の記述に違いが出ています~
 oDoc = ThisComponent --> oDoc = Event.Source~
 
 //
 ***ike@九州  それがoDoc = Event.Source にするとマクロの画面上でエラーになりました。 [#sc2a0e14]
 >さいきゆみ (2011-01-14 12:05:55 (金))~
 ~
 #ref(errar.jpg,,70%)
 普通に実行する分には問題ないのですが。~
 とりあえず記述がなくても動くのを確認しました。~
 ~
 こういうところはどのあたりで勉強したらいいんでしょうか? 手探りで覚えているのですが。~
 ~
 返答が早くて嬉しいです。ありがとうございました。~
 
 //
 ***イベントの動作ではありません [#g1a13a0d]
 >ike@九州 (2011-01-14 12:57:47 (金))~
 ~
 マクロの実行は、割り当てたイベントの動作ではないので…~
 あくまで~
 割り当てたイベントが発生したときに取得できる変数なので~
 文書を開いた時に割り当てていた場合、文書を開いた時のみ正しく Event 変数は利用できます。~
 ~
 はにゃ? さんのサイトでの勉強が多いです。~
 情報が得られなかった場合、~
 http://www.oooforum.org/forum/search.phtml~
 での検索になります。~
 ~
 それでもなかった場合、以下の mri を利用しての手探りになります。~
 http://hermione.s41.xrea.com/pukiwiki/index.php?OOo%2FExt%2FMRI~
 ~
 mri の使い方(使えるメソッド、プロパティを調べる)~
 faq/5/474~
 他の方の情報も参考にして下さい~
 
 //
 ***はにゃ? さんのサイトってどこでしょうか? [#z04af8e0]
 >さいきゆみ (2011-01-15 02:44:18 (土))~
 ~
 検索したら怪しい枕のサイトに行ってしまいました。~
 ご親切にいろいろ教えてくださりありがとうございます。~
 
 //
 ***OOoBasic Wiki [#s56d40e4]
 >ike@九州 (2011-01-15 09:00:47 (土))~
 ~
 はにゃ? さんのサイトはこのぺージ左ペインの関連サイトにある~
 [[OOoBasic Wiki:http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoBasic]] です。~
 ~
 Zoom情報、MRI の作者などで、既に訪問されてると思います。おほほ~
 
 //
 ***ありがとうございました。 [#me88c918]
 >さいきゆみ (2011-01-15 22:43:27 (土))~
 ~
 ポチポチがんばります。とても今回やる気になりました。 マクロの本が1冊しかなく、その本の内容があまりに…だったもので…。 助かりました。~
 
 //
 ***なぜかまたエラーが出るようになってしまったのですが [#tdfd3a29]
 >さいきゆみ (2011-02-18 00:40:21 (金))~
 ~
 この間にしたことといえば…アクロバットのアップデートくらいの気がするのですが…。~
 &ref(erra.jpg,,70%);~
 
 //
 ***どうも、マクロのルールが変わったような気がしてしかたありません。 [#k0965bfc]
 >さいきゆみ (2011-02-18 01:09:37 (金))~
 ~
 リサイズまでなら正常に動くことが確認されました。~
 へこみます。~
 
 //
 ***問題ないですけれど [#ocb52551]
 >ike@九州 (2011-02-18 10:28:49 (金))~
 ~
 Vista OOo3.3~
 さいきさん のコードで問題なく~
 ~
 リサイズ~
 新規レコードへ移動~
 指定テキストボックスへ移動~
 拡大してます。~
 ~
 エラーの場合は~
 エラー箇所が反転しています~
 添付のエラー画像から判断するとフォームが基にしているテーブル又はクエリの最終レコードは正常でしょうか?~
 新規レコード追加は普通に追加ボタンで行った方が良いかも知れませんね。~
 
 //
 ***検証 [#u16bfdee]
 >ike@九州 (2011-02-21 13:46:30 (月))~
 ~
 原因が分かりました。~
 エラーはフォームを編集で開いた時に出現するのではないでしょうか?~
 ~
 ので、解決策~
  '編集モードの場合何もしない
  If oCtrl.isFormDesignMode Then Exit Sub 
  oForm.AfterLast()
  oForm.moveToInsertRow()
 に変更してください。~
 
 //
 ***そのとおりでございます [#lc4bdb42]
 >さいきゆみ (2011-02-21 22:49:05 (月))~
 ~
 よかった〜。ありがとうございます。やる気が復活しました。まったく原因がわからなかったのですが、そういうこともあるんですね。 ありがとうございます。~
 
 //
 ***完了にします [#yb766d45]
 >M.Kamataki (2011-02-22 11:11:36 (火))~
 ~
 みなさん、コメントありがとうございます。~
 
 //
 #article