「Web出版サイト」ベータ公開

Q&A集[?]

当サイトでのご質問の受付は終了しました

すべてのコンテンツを読み込み専用としたため、回答欄からも投稿できません

Apache OpenOffice/LibreOfficeのご質問はそれぞれのフォーラムへご投稿ください

質問コーナー

サイト内検索

分類メニュー

関連サイト


本日:2
昨日:0
総数:2123
現在:3


フォームの日付欄に入力当日の日付を自動で入れる処理

ページOpenOffice.org FAQの登録ページ
投稿者こばし
分類
edit/refer
優先順位
edit/refer
状態
edit/refer
カテゴリー
edit/refer
投稿日2010-06-18 13:00:02 (金)
OSWindows XP
依存するページ
バージョン
edit/refer

メッセージ

回答ページでは行末に「~」を付加する必要はありません

Q&Aで類似の内容を探してみましたが、うまく解決できないので投稿します。

入力日(Date型)のフィールドがフォームにある状態とします。
そのフォームに「フォーカスを失ったとき」のイベントで以下の
サブルーチンを割り当てています。

Sub TODAY
	Dim oDoc As Object
	Dim oForm As Object
	Dim odat As Object
	' フォームオブジェクト取得
	oDoc = ThisComponent
	oForm = oDoc.getDrawPage().getForms().getByName("MainForm")
	' MainFormのオブジェクトの取得
	odat = oForm.getByName("dat入力日")
	If  odat.text=""  Then
	odat.text= DateValue( NOW)
	End IF
End Sub

以上のように入力日が未入力の場合にだけ
日付が入るようにしたいのですが、
新しいレコードに移動してもodat.textの値が
前のレコードで取得した値になったままになります。
表示されているレコードとodat.textの値を連動させるにはどうしたらよいでしょうか?

加えて、これに関連してもう一つ困ったことがあります。
上記のスクリプトでオブザーバを使いたいのですが
ランタイムエラーでgetDrawPageのプロパティかメソッドが見つからない
と出てしまいます。
これを回避するにはどうしたらよいでしょう。

ご教授よろしくお願いします。


2件目はサンプルないと把握できませんが

ike@九州 (2010-06-19 09:31:47 (土))

http://hermione.s41.xrea.com/pukiwiki/pukiwiki.php?OOoBasic%2FBase%2FRowSet
>フォームを利用する場合にはフォームオブジェクトは .sdb.ResultSet、.sdb.RowSet、.sdbc.ResultSet、.sdbc.RowSet サービスをサポートしているため同じ操作が行えます< とあります。

上記サイトの oRowSet は全て oForm に置き換える事ができます
oForm.next 、oForm.update〜 、oForm.get〜

取得したフォームオブジェクトはフォームのソース元の結果全てです。フォームのデータを更新する事がフォームで画面上表示されるデータを変更する事に繋がります。

'日付フィールドから親フォームを取得
'日付フィールドのイベント "フォーカスを失ったとき" に割り当て
Sub TODAY(oEV)
 Dim aDate As New com.sun.star.util.Date
  oForm = oEv.Source.getModel.getParent
  aDate.Year = Year(now())
  aDate.Month = Month(now())
  aDate.Day = Day(now())
  oForm.updateDate( oForm.findColumn("入力日"), aDate)
End Sub

当然上記イベント発生は一度日付フィールドがフォーカスを得る必要があります(クリックなど)

新規レコードボタンを押した時や最後のレコード表示時にネクストボタンを押した時にイベント"リセット前"・"リセット後"が発生します。
OOoのバージョンによって和訳が違っているので以前は"元に戻す前"・"元に戻した後"となっていました。
もし新規レコードが挿入された場合に日付フィールドに自動でフォーカスを持って行きたい場合は以下。(日付を入れる事も可能)

'フォームのイベント "リセット後" に割り当て
Sub FocusToDate
 oDoc = ThisComponent
 oForm = oDoc.getDrawPage().getForms().getByName("MainForm")
 oTxtControl = oDoc.getCurrentController().getControl(oForm.getByName("dat入力日")) 
 oTxtControl.setFocus()
End sub


BasicIDE上からの実行時以外で、ThisComponent では意図しないコンポーネントを取得して困る場合
開いている全てのコンポーネントから目的のコンポーネント例えば"フォーム1"というフォームを取得し前面に持ってくる場合の例です

Sub Test
 oFormDoc = fnGetFormDoc("フォーム1")
 If ISNULL(oFormDoc) then exit sub
'前面に持ってくる
 oFormDoc.getCurrentController.getFrame.getContainerWindow().toFront()
End Sub

Function fnGetFormDoc(sFormDocNAme As String) As Object
  oComponents = StarDesktop.getComponents
  oComponentsEnum = oComponents.createEnumeration()
  While oComponentsEnum.hasMoreElements()
   oComponent = oComponentsEnum.nextElement()
   'タイトルから目的のフォームを探す
   If oComponent.ImplementationName = "SwXTextDocument" then
    sTitle = oComponent.getCurrentController().getFrame().Title 
    IF Instr(sTitle,"フォームデザイン") * Instr(sTitle,": " & sFormDocName) > 0 then
     fnGetFormDoc = oComponent
    Exit Function
    End if
   End if
  Wend
End Function

早速のご回答ありがとうございます

こばし (2010-06-21 09:18:17 (月))

詳細なご説明ありがとうございます。
フォームを改良しようとして何日も躓いたままでしたが、ようやく前進です。

非常に助かりました。
これで完了に致します。

お名前:
題名: