4つのテキストボックスにある文字をBASICでつなぎたいのです。

やはり、リストボックスにはTextプロパティは無いために起きています。エラーを出したStarBasicの主張は正しいです。

  1. Writerを起動

  2. メインメニューから[フォーム]→[コントロールウィザード]があればチェックを外す

  3. [リストボックス]を選択してから、文書上でドラッグドロップしてリストボックスを配置します

  4. このリストボックスを右クリック→[フォーム]

  5. [名前]をForm1としました。

  6. 再びこのリストボックスを右クリック→[コントロール]

  7. [名前]をListBox1にします。
    8.さらに[リストの項目]に「a」「b」「c」の3つの項目を追加しました。なお、Shiftを押しながらEnterすると新しい項目を作れます。

  8. さらに[標準選択範囲]に"0"を入力しました。

  9. このような準備を整えてから、以下のコードを実行してみました。サブルーチン内でF8を押していくとステップ実行されます。なお、If文の中のExit Subが実行されたら誤りです

    Option Explicit
    Sub Main()
    Dim lb As Object
    lb = ThisComponent.DrawPage.Forms.getByName(“Form1”).getByName(“ListBox1”)
    If IsEmpty(lb.SelectedValue) Then
    Exit Sub
    End If
    Msgbox(lb.SelectedValue)
    End Sub

そしたら、(この手のやつは0から数えるので) 0番目に相当する「a」がダイアログに表示されました。
ちなみに[標準選択範囲]を"1"にしていたら、「b」が表示されます

うげ、getByNameのメソッド名の途中に開き角括弧が紛れ込んでた。こそこそと編集(汗

暇人さん



ありがとうございます。

もう何度、この言葉を使わせていただいたでしょう。



情けないです。。



でもおかげさまで、少しづつですがわかってきた気がします。

でもまだまだ入口のところですけれど。



先に朗報から。

ここまで悩んでいた部分、すなわち4つのテキストの連結です。



ただおそらく、このフォームでの最後の難関?

にまたぶつかってしまいまいした。それは報告の後に記載します。



=====





フォーム上に新しいテキストボックスを、リストボックスと同じ数だけ作成しました。

全てのリストボックスを単にコピペして。それをリストボックスに変換しました。





新たなテキストボックスを、リストボックスの後ろ側に配置して、非表示にしました。

最初は単に後ろ側に配置しただけだったのですが、何故か上から透過して下側がダブって見えます。

たぶんそういう仕様なのだろうと判断して、コントロールの設定で非表示にしました。





コードを以下のようにしました。

別に理由はないのですが、なんとなく簡単に書きたかったので

JOIN は使用せず、&で繋いでいます。



以下のようになりました。

====

Sub ConcatAABBCCDD()

Dim oForm As Object

Dim oField0 As Object
Dim oField1 As Object
Dim oField2 As Object
Dim oField3 As Object
Dim oField4 As Object

Dim document As Object
Dim dispatcher As Object

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

dispatcher.executeDispatch(document, ".uno:RecSave", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:RecRefresh", "", 0, Array())

oForm = ThisComponent.Drawpage.Forms.getByName("ABCDフォーム") 
Doc = ThisComponent
DocCtl = Doc.getCurrentController()

oField0 = oForm.getByName("AA")
oField1 = oForm.getByName("BB")
oField2 = oForm.getByName("CC")
oField3 = oForm.getByName("DD")

oField4 = oForm.getByName("EE")

AaBbCcDd = oField0.Text & oField1.Text & oField2.Text & oField3.Text
 
CtlView = DocCtl.GetControl(oField4)
CtlView.Text = AaBbCcDd

dispatcher.executeDispatch(document, ".uno:RecSave", "", 0, Array())
dispatcher.executeDispatch(document, ".uno:RecRefresh", "", 0, Array())

End Sub

=======



フォーム上に、ボタンを1つ作成して、上記のMACROを配置しました。





このボタンを押すと。ちゃんと。

oField4に、oField0.Text & oField1.Text & oField2.Text & oField3.Text された表示が出ます。



ところが。。。



保存ボタンを押すと、テーブル側のレコードに、oField4だけ保存されません。

NULLしてしまいます。



oField0.Text

oField1.Text

oField2.Text

oField3.Text

はレコードとして反映されているのにです。



もしかしたらこれかな??


CtlView = DocCtl.GetControl(oField4)
CtlView.Text = AaBbCcDd

と思い、ネットでビューの意味を勉強しました。
恥ずかしながら、実はこの CtlView の意味をわかっていませんでした。
そのように見えてるだけの「幻みたいなもの」なのですね。

じゃあどうすればペーストできるのかがわからず、調べたら、

"uno:Past " というのを使うみたいだな、。。

と思うのですが、書き方がわかりません。
適当にいろいろ書いてみたのですが、駄目でした。

ダメ元で、

oField4 = AaBbCcDd

してみましたがプロパティがどうとか言われて駄目です。

よろしくおねがいします。

追伸です


oField4.Text = AaBbCcDd

したらエラーは出なくなりましたが、同じ結果です。

レコード側には反映されません。

DocCtl.GetControl(oField4)

これの意義が自分にはよくわかっていません。確かにネットを検索するとそれらしき情報はヒットするのですが…

コミットしてから、RecSaveでレコードを保存するんじゃないかなと自分は思います。

oField4.commit()

元のodb側を更新したいときはDataSourceをちゃんとflushしてあげてください。
一応3つのテキストボックスを使ってサンプル作って検証しました。(odtとodb)

正直、書いたマクロ、自分の好みに合わせて型を厳密に書いて煩雑にしすぎた気がします。

使い方に関する重要な注意事項

  1. ツール→オプション LibreOffice→Basic IDE オプションの「拡張型を使用」を有効にするか、変数宣言の型を全てObjectかVariantにしてから使ってください
  2. odtファイルを開き、メインメニューの「フォーム」→「デザインモード」をクリックし、テキストボックスかプッシュボタンどれでもいいから選択します。右クリックしてコンテキストメニューを開き、「フォーム」の「データ」タブの「データソース」が当該odbファイルを指していることを確認してください。もしかしたら自分の環境のパスがそのまま出ているかもしれません。尚、その場合に、himajin100000ではなくhimajin1000000になっているのは、Windows 10の初期設定をするときに後で変えるつもりで設定したのですがトラブルの可能性に怖気づいているだけなので仕様です。
  3. 使い方ですが、「デザインモード」のチェックが外れた状態で、下の二つのテキストボックスに何かを入力してボタンを押してください。

暇人さん。いつもお世話になります。



頂いたファイルですが、ダウンロードしました。で、、開くことができません。


外部データソースへの接続が確立できませんでした。
firebird に接続する SDBC ドライバがありません。

と言われてしまいます。

今、どういう状況かを画像でまとめたPDFを作成しました。以下からダウンロードしてください。



https://yahoo.jp/box/k1LySY



それとやはり私のLIBREにはウォッチリストというのがありません。
画像から見る限り、オブザーバーというものに名称が変更されている気がします。

あー、色々と俺がミスったり説明不足だったりしています。ごめんなさい。

  • メインで使っているのがナイトリービルドっていう素人お断りの超最新版(豆知識: masterという。自分は当面6.3系と呼ぶことがある。)
  • 実験用の機能は常に有効で使っていた
  • 機能名を調べるのが面倒だったこともあり、MS Office VBAの同様の機能の用語を借りた。

オブザーバー

あ、これで大丈夫です。

「拡張型を使用」がない

うわぉ、これ実験的機能だったんだ。
オプションから「LibreOffice」→「詳細」→「実験的な機能を有効にする」のチェックを入れて再起動すると、多分出てくると思う。「実験的機能」こわくないよー。

SDBC

使っているLibreOfficeのバージョンが知りたいかな。

うまく行けば、上記「実験的機能」の後、読み込めばいけるかもしれない。うまくいかないかもしれないけど。

一応、今RC3の6.2系では実験機能ではなくなっている。

https://wiki.documentfoundation.org/ReleaseNotes/6.2/ja#Base

まぁうまく行かなかったら作り直します。(なお、このエラーにつき「amadaさんに過失は全くない」)

SDBCは多分C++ネイティブで作られているドライバだと思っている。JDBCはJavaに頼ったものだね

暇人さん



1日、間が空いてしまいました。

再び、画像つきで、返信を作成しました。



つまり、、まだ動きません。

以下から、ダウンロードをお願いします。



https://yahoo.jp/box/KB59QC



>オプションから「LibreOffice」→「詳細」→「実験的な機能を有効にする」



は暇人さんの指示通りに行いました。

その結果、ファイルは開くようになりました。



ですが、マクロで2種類のエラーが出ます。

言葉で説明しにくいので、ステップ・バイ・ステップで画像にしました。



よろしくおねがいします。



あ!LIBREのバージョンですが、6.0.7.3(x64) です。



彰子


暇人さん 追伸です。新事実を発見しました。



現在のマクロを実施して、フォーム上のテキストボックスに、連結した文字が表示されることは既にお伝えしました。そしてそれなのに、肝心のテーブルレコード側に反映されないということも、既にお伝えしました。



それはそのままなのです。

なんでかな~と悩みながら、何気なく、ホントに何気なく、



①テキストボックスの中に表示されている文字列を、マウスでカットして、

②同じテキストボックスの中に、再度、ペーストし直してみました。



すると、、



③保存アイコンが変化して「保存しなさいよ~という緑の星」が出現したのです。

④素直に押してみたら、テーブルに反映されました!!??



やはり現状のマクロでは「表示されていただけ」なのですね。

ただどう考えても不思議なのは、



別のフォームに書いたマクロ、単純に、A→Bへとコピーするマクロ

も全く同じ書き方をしている(つまり連結のマクロが無いだけ)のに、

こちらはテーブルにちゃんと反映されます。


ただいずれにしても、このマウスの作業を、マクロでどう書けばよいのかわかりません。



ためしに、テキストボックスをひとつ増やしてみました。

同じテーブルを参照するテキストボックスです。 完璧な素人発想です。



(前略)

oField0 = oForm.getByName(“AA”)

oField1 = oForm.getByName(“BB”)

oField2 = oForm.getByName(“CC”)

oField3 = oForm.getByName(“DD”)



oField4 = oForm.getByName(“EE”)

oField5 = oForm.getByName(“EE”) ←これを増やした



oField4.Text = oField0.Text & oField1.Text & oField2.Text & oField3.Text

oField5.Text = oField4.Text

(後略)



この MACRO ですが、エラーでずに最後まで行きました。

ですが、結果は何も変わりませんでした。(あたり前ですよね。。)



現状、テーブルに反映させる方法は、手によるマウス操作でのコピペだけです。


上記文章の最後の「たぶん出てくると思う」というのがよくわかりませんが

↓これの話です

ツール→オプション LibreOffice→Basic IDE オプションの「拡張型を使用」を有効にする

よく読むと…

使い方ですが、「デザインモード」のチェックが外れた状態で、【下の】二つのテキストボックスに何かを入力してボタンを押してください。

まぁサンプルだし作りは雑でいいかと思って…

このBOXは何ですか?

同時に別質問の実験もしていました。実りませんでしたが。

その消し忘れというか。odtから始めるから消さなくていいや、と思って放置した名残です。

更に追伸です。もっと不可思議な事を発見しました。

上記の方法で「手によるコピペをしなくても反映」されます。



oField4 の中にマクロの結果として表示されているものを、



いったんマウスで選択して削除します。

②もういちどボタンを押して、マクロをもういちど実行します。



これでテーブルに反映されます。何ででしょう???


何ででしょう?

「フォーカスが失われたとき」にFormControllerが更新を行うってどこかで見た気がする

※先にご報告。「拡張型を使用」を有効にしました。



更に、更に、、追伸です。



上記の方法(いったんテキストボックス内を削除)で反映されるようになった後は、

更に新しく追加するレコードは、1回のマクロ実行で反映されます。

つまり毎回のレコードで、いったん削除する必要がありません。。。



ところが、いったんファイル全体を閉じて再起動すると、再び同じ症状に戻ります。



これも同じで、最初の1回だけテキストボックス内を削除したら

普通に使えるようになります。


先程のコメント、修正します。



①1回目のマクロ実行→テキストボックスには表示されるが、テーブルに反映されない状態。

②いったんテキストボックス内に出現した表示を削除

③2回目のマクロ実行→テキストボックスに表示され、テーブルにも反映される。



この後、続けて新しいレコードの登録。



④追加されるレコード→1回のマクロ実行で、テキストボックスに表示され、テーブルにも反映される。



ここから2つの現象に別れます。



現時点では、俗にいうデバッグ?(この表現が正しいのかどうかわかりません)ですので、

入力しているレコードは、実際のものではなく、適当なダミーです。



ゆえに、以下の(A)(B)のどちらかになります。



(A)ダミーで登録したレコードを全削除して再起動

(B)ダミーで登録したレコードを削除せずにそのまま再起動



⑤(A)だと、再び同じ症状にもどります。つまり1回だけテキストボックスの中を削除しないと正常に動きません。

⑥(B)だと、再起動しても症状が出ません。つまりそのまま使用できます。



理由がわからないので気持ち悪いのですが、

とりあえず動くようになったということで、ほっとしています。



ただ、なんでなんでしょう。。

ただ、なんでなんでしょう。。

わからんが、調査するにしてもちょっと時間がかかりそうなタイプなので躊躇してます。

直ぐに返信があるかもと待たれてしまうのも何なので、一応報告。

うーん。そっちで作ってそうなファイルをこっちで作ってみたけど、再現しないなあ…(というかエラーが出る)

作っているものを俺が誤解している可能性があるので、そっちのファイルがほしい。

あと、念の為、データベースに反映されていることはどうやって確認していますか?(自分のファイルの場合は「ボタン押した後、odbファイルを開いてみる」を想定しています。

あと、相当前に枝分かれした話に戻るけど

これやると、つまりグループ化をするとフィールドの名前が強制的に初期化されてしまうのです。

これ具体的にどういう手順でやった?やる方法が正直わからないんだけど。

暇人さん



ご質問に対する返答ですが、言葉で説明するのが難しいので、ファイルを送信しようと思います。

ただ申し訳ありませんが、数日だけお待ち下さい。



先に、急ぎの仕事を済ませてから、ファイルをお渡しできるように修正して送信します。

項目的に、おそらく企業秘密(私はペーペーですが)の内容も含まれていますので。。



彰子