Top > OOobbs > 33

OOobbs/33 Edit

  • サマリ: セルの値をDialogのテキストボックスに読み込み、その値を編集後、セルに書き込む
  • 環境: Calc
  • 状態: 解決
  • 投稿者: CyksArt?
  • 投稿日: 2004-10-08 (金) 16:10:09

質問 Edit

OOoBASICでの初めてのコーディングです。

ダイアログ(Dlg1)を表示させるときに、デフォルトの値として、特定のシート(Sheet1)上の特定のセル(C3)に書き込まれている値を読み込んで、テクストボックス(TextBox1)内に表示させ、そして、その値を編集後、それを元のセルに書き戻す、という操作をやりたいと思っています。

まず、セルの値を読み込んで、それをダイアログ上のテクストボックス内に表示させる方法がわかりません。

もちろん、そのテクストボックス内の値を元のセルに書き戻す方法もわかりません。

ExcelのVBAでは、上記の操作を作成済みなのですが、それをOOoのCalcに移植したいと思っています。

どなたか、ご教授願えると幸いです。

回答 Edit

  • ユーザーの方が増えそうな予感ですね。 -- はにゃ?? 2004-10-10 (日) 01:50:41

ええっと,ダイアログの表示のさせ方は分かったのでしょうか?

とりあえず,ダイアログを次のように作成してみました。

33-dialog.png

そういえば,特定のセル (C3) というのは,決まった型の値のみが入力されることを前提にして作成するのでしょうか?たとえば,「値 Value」,「テキスト Text」,「数式 Formula」などがありますが。さまざまな値が入力される可能性があるのであれば,それぞれ判断して取得してやる必要があります。

とりあえず,数値 (Value) が入力されるとしていきます。

上記のようなダイアログに対して,次のようにしました。部分ごとに取り上げていきます。

このファイルを参考にしてください。 file33.sxc

Dim oDialog As Object, oMDialog As Object
Dim oDoc As Object
Dim oSheet As Object, oCell As Object

Sub Main
  DialogLibraries.LoadLibrary( "Standard" )
  oDialog = createUnoDialog( DialogLibraries.Standard.Dlg1 )
  oMDialog = oDialog.getModel()
 
  oDoc = ThisComponent
  oSheet = oDoc.getSheets().getByName("Sheet1")
  oCell = oSheet.getCellRangeByName("C3")

  oMDialog.TextField1.Text = oCell.Value
  
  oDialog.execute()
  oDialog.dispose()
End Sub

Sub OK_Click()
  oCell.Value = oMDialog.TextField1.Text
  oDialog.endExecute()
End Sub

まずは,

Dim oDialog As Object, oMDialog As Object
Dim oDoc As Object
Dim oSheet As Object, oCell As Object

つぎの部分で,ダイアログを準備します。

Sub Main
  DialogLibraries.LoadLibrary( "Standard" )
  oDialog = createUnoDialog( DialogLibraries.Standard.Dlg1 )
  oMDialog = oDialog.getModel()

ダイアログの表示ができているかどうかわからないので,とりあえず次です。

次の部分では,ドキュメントにアクセスしています。

  oDoc = ThisComponent
  oSheet = oDoc.getSheets().getByName("Sheet1")
  oCell = oSheet.getCellRangeByName("C3")
oDoc = ThisComponent

ドキュメントを使うときの定石です。

oSheet = oDoc.getSheets().getByName("Sheet1")

シートコンテナからシート (Sheet1) オブジェクトを名前指定で取得。

oCell = oSheet.getCellRangeByName("C3")

セル (C3) オブジェクトをセルの名前指定で取得。

次の行は,ダイアログの TextField1 へセル C3 から取得した値 (数値 Value) を入力する行です。

  oMDialog.TextField1.Text = oCell.Value

ダイアログのモデルオブジェクト oMDialog のプロパティーとしてアクセスできるようになっているテキストフィールド TextField1 の Text プロパティーに文字列を設定することで,テキストフィールドに文字を入力することができます。

セルから値を取得する時には,セルオブジェクトの Value プロパティーを使用します。 ここでは,数値を取得するので Value プロパティーを使用しています。テキストなら Text プロパティーを使用します。

そして,ダイアログの表示とダイアログの開放。

  oDialog.execute()
  oDialog.dispose()
End Sub

次の Sub OK_Click() は,ダイアログの OK ボタンをクリックしたときに動作するように設定します。

Sub OK_Click()
  oCell.Value = oMDialog.TextField1.Text
  oDialog.endExecute()
End Sub

始めの行の,

oCell.Value = oMDialog.TextField1.Text

では,取得するときの逆にして設定します。

oDialog.endExecute()

では,ダイアログを閉じています。

これで,簡単に値の取得,設定が行えました。

OK_Click() を OK ボタンに割り当てる方法ですが,ダイアログの編集画面で OK ボタンを選択した状態にしておき,プロパティーのイベント設定タブで「実行時 (When initiating)」に上記の OK_Click() を割り当てます。

  • 分かりましたか?多分分かりにくかったと思います。分からないところがあればどんどん聞いてください。
  • ご教授ありがとうございます。会社に出社したら早速試してみます。 -- CyksArt? 2004-10-10 (日) 14:23:09
  • できました! ありがとうございました。ただ、1つわからないのは、oMDialogの役目です。getModel()はどんな役目のオブジェクトなのでしょうか。 -- Cyksart? 2004-10-12 (火) 11:02:51

Cyksartです。

以下のように、組みました。

CInputDialogを表示させ、calcというシート名の各セルの数値を読み込み、編集後、その数値をセルに戻す、というマクロです。

余分な質問をすれば、Retという整数変数にOKの戻り値を与えて、その値でIf文で動作を選択するには、どうするのかな、ということです。まあ、以下のコーディングで目的の動作をしてくれますので、充分です。

Dim CIDlg as object, oMDlg as object, oSheet as object, oDoc as object
Dim oCell(4) as object
Sub ConstInput()
	Dim Ret as integer
	DialogLibraries.LoadLibrary("Standard")
	CIDlg = CreateUnoDialog(DialogLibraries.Standard.CInputDialog)
	oMDlg = CIDlg.getModel()
	oSheet = ThisComponent.Sheets.getByName("calc")
	oCell(1) = oSheet.getCellRangeByName("C3")
       oCell(2) = oSheet.getCellRangeByName("C5")
       oCell(3) = oSheet.getCellRangeByName("C6")
       oCell(4) = oSheet.getCellRangeByName("C7")
       oMDlg.TextBox1.Text = oCell(1).Value
	oMDlg.TextBox2.Text = oCell(2).Value
	oMDlg.TextBox3.Text = oCell(3).Value
	oMDlg.TextBox4.Text = oCell(4).Value
	Ret = CIDlg.Execute()
	CIDlg.Dispose()
End Sub
Sub CIDlg_OK
	oCell(1).Value = oMDlg.TextBox1.Text
	oCell(2).Value = oMDlg.TextBox2.Text
	oCell(3).Value = oMDlg.TextBox3.Text
	oCell(4).Value = oMDlg.TextBox4.Text
End Sub

ありがとうございました。

  • まず、oMDialog の役目ですが、 -- はにゃ?? 2004-10-12 (火) 14:19:42

oDialog と違って、oMDialog は見た目を取り扱うオブジェクトとみなせます。実際は、ダイアログオブジェクト oDialog にビジュアルを追加するような oMDialog オブジェクトを被せてあるような形です。同じことが、ダイアログに含まれる全てのコンポーネント (ボタンやテキストボックスなど) にもいえます。

Dim oTextBox1 As Object, oMTextBox1 As Object

oTextBox1 = oDialog.getControl("TextBox1")
oMTextBox = oDialog.getModel().TextBox1

getControl メソッドは com.sun.star.awt.XControl インターフェースを戻しますが,getModel メソッドでは com.sun.star.awt.XControlModel インターフェースが戻ります。

ダイアログコンポーネントによっては,どちらかでしか設定できないプロパティーなどがあるので,使い分ける必要があります。

  • 使い分けがよくわかりませんが、意味合いはわかる気がします。丁寧なご回答ありがとうございます。 -- Cyksart? 2004-10-12 (火) 16:49:43
  • OK ボタンまたは,Cancel ボタンを押すと execute メソッドの戻り値がそれぞれ,OK = 1, Cancel = 0 となります。 -- はにゃ?? 2004-10-12 (火) 20:55:08

これを使えば,

	Ret = CIDlg.Execute()
       If Ret = 0 Then
          CIDlg_OK
       End If
	CIDlg.Dispose()
End Sub

Sub CIDlg_OK
	oCell(1).Value = oMDlg.TextBox1.Text
	oCell(2).Value = oMDlg.TextBox2.Text
	oCell(3).Value = oMDlg.TextBox3.Text
	oCell(4).Value = oMDlg.TextBox4.Text
End Sub

のような形にして,Sub CIDlg_OK をボタンに割り当てる必要がなくなります。その代わり,OK に相当するボタンの,「ボタンの種類」を "OK" にしておきます。が,このときには Cancel ボタンを追加した方が使いやすいと思います。



Attach file: file33-dialog.png 217 download [Information] file33.sxc 1092 download [Information]

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