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

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

気分に余裕のあるときに検証してみたいです。

以前の質問に対して全くレスがつかないままなので

自分は単純に答えがわからなかったんです。odsやodtのときは当該構文で出来るようなんですけどね…
実は一回手元で成功したんですが、その際IDEがクラッシュしてしまい、復元されてきたものに、成功したコードが含まれておらず、かつ、そのコードを再び書き上げることが出来ず、調査が難航しています。

あ、これらoField0とかはテキストボックスだと仮定しています。

↓↓ ご推察のとおりです。
全てテキストボックスです。

実は、教えていただいた以下ですが、既に試していました。
それでも同じ場所で止まってしまうのです。
Dim AaBbCcDd As String ' 型をStringに変更
Dim AaBbCcDdText(3) As String

AaBbCcDdText(0) = oField0.Text
AaBbCcDdText(1) = oField1.Text
AaBbCcDdText(2) = oField2.Text
AaBbCcDdText(3) = oField3.Text

AaBbCcDd = Join(AaBbCcDdText,"")
CtlView.Text = AaBbCcDd '代入する変数を変更


これで出てくるメッセージは以下です。

BASIC ランタイムエラー.
'423'
Text

ちなみにエラーメッセージは変わっています。

型が Object のままだと、エラーメッセージは以下です。

BASIC ランタイムエラー.
'380'
プロパティ値が正しくありません。

ここで、更に試したことがあります。
Option VBASupport 1 をREMしてみました。

以下のようにメッセージ文が変わります
まさか、、Textプロパティ?メソッドが、無い???
なんてことは考えにくいと思うのですが。。

REM Option VBASupport 1 すると。
正しくありません。→見つかりません。に変わったのです???
BASIC ランタイムエラー. 次のプロパティまたはメソッドが見つかりません: Text。

もう諦めたほうが良いのでしょうか??
繰り返しますが、何をやっても「同じ行」で止まります。 エラーメッセージが変わるだけです。

自分はOption VBASupport 1は外して物事を考えることが多いです。今の実装だとエラーメッセージではなくエラー番号が出てしまいますし、前述のデフォルトプロパティのせいで本来の原因とは違うエラーメッセージが表示されたりして厄介なので。

次のプロパティまたはメソッドが見つかりません: Text

LibreOffice自体のC++のコードを読んだわけではありませんが、このプロパティが見つからないということは、「自分がその変数に代入されているものがテキストボックスだ誤解しているが、実は違うものが入っている」可能性があると考えてます。

自分なら、oField0をウォッチウィンドウに放り込んで中身を確認してみます。SupportedServiceNamesやImplementationNameが何になっているのか確認するわけですね。まぁ文字列とかだったらそのプロパティとかはないわけですが。

また、再現する最小限のファイルが作れ、個人情報等を含まず、俺に見られてもいいファイルを準備できるなら、そのファイルをどこかにアップロードして、「ちょっとhimajin100000さんや、実際のファイル提供するから再現するか、した場合何が原因か調べてくれんかのう?」という風にするのもアリです。まぁ解決できる保証はできないのですが。

深夜遅くのお返事。驚きました。ありがとうございます。

最後、どうしようもなければ、見ていただきたいです。



ですが、上記のコメントを拝見して、はたと気がついました。



oField0

oField1

oField2

oField3



は、テキストボックスを、入力ミスを避けるためにリストボックスに変換したものです。

それぞれ、他に入力用の一覧表として作成してある4つのフォームの1列面を参照します。



oField4 はテキストボックスです。



もしかしたらこれでは駄目なのでしょうか?

実は、oField4がプライマリーキーです。



つまり、



oField0

oField1

oField2

oField3



は、一意のプライマリーキーを生成するための要素として考えています。

ですが、プライマリーキーが無いとテーブルレコードの保存ができません。

ようするに、このマクロを実行する時は



oField0

oField1

oField2

oField3



がまだ保存されていない状態なのです。



これが駄目なら、

このテーブルでの oField4 (プライマリーキー)は、連番で発行し、

その状態でいったん保存して、

oField5をさらに作成しその次の処理で文字をつなげるしかないのかな。。

と気が付きました。



これで合っていますでしょうか?



ちなみにこのフォームは、

この処理で繋げるコードを作成するだけのためのものです。

ここで生成したコードを全てのレコードと紐づけて、操作したいのです。





追伸:

ちなみに、ウォッチウィンドウがわかりません。

これはなんですか?何のためのものですか?どこで見つければいいですか?


暇人さん



この掲示板の仕様でしょうか。

よほど気をつけなければ続きのコメントを見逃しそうなので。

こんな感じで続きを入れてます。



↓↓ ご推察のとおりです。
全てテキストボックスです。

リストボックスに変換したものです。

なんとなくそんな気はしてました。後でどんなプロパティがあるか調べておきます。

確かメールで届いたコメントにはウォッチウィンドウがどれかわからないという話が書いてあったのでひとまず図で示しておきます。

やはり、リストボックスには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 の中にマクロの結果として表示されているものを、



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

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



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