サブフォームの初期化タイミング
サブフォームの初期化タイミングについて困っています。
同じ処理を動かしていますが、初回と2回目以降で結果が異なります。
ポップアップ的なことを実現するためにサブフォームの遷移および表示切替を利用しています。
サブフォームの遷移先に利用する画面の初期化というのはいつやることが正しい実装なのでしょうか。
現在は同ロジック内で「遷移先に画面を設定し、画面の(コントロールの状態、DBの値等を)初期化」という実装方法を行っています。
上記説明で伝わればいいのですが自信がないので、簡略化した機能を実装し、一部抜き出したログを貼ります。
私が実装している動きだと初回が意図した動きになりません……。
画面A
ボタンA:押すとロジックA実行
テキストA:値A
画面B(サブフォームに表示させるための画面)
コンボボックスB:数字をKeyにした名称のリスト(≒ユーザ一覧(番号と名前)的なDBを使ってリスト化している)
ロジックAの処理
1.サブフォームの遷移先に画面Bを設定します。
2.画面BのコンボボックスBの内容に値Aを設定()
3.処理終了
例:値Aに012を設定した状態で、
アプリ起動後初めて実行した時:コンボボックスBが001で表示(意図していない動き)
アプリ起動後2回目:コンボボックスBが012で表示(意図した動き)
初回のイベント発生物(42行目)と2回目以降のイベント発生物(104行目)が変わります。
2回目以降で取れるイベント発生物が意図しているものになります。
■■■■■■■■■■■■■■■■サブフォームの遷移先に画面「ユーザ選択画面」を設定(この画面を使うのはアプリ起動後初めて)
▽ロジック開始 コントロール/サブフォーム遷移先(名称指定)
○パラメーター[00] 10617555271866184298
○パラメーター[01] ユーザ選択画面
◇[成功]処理結果
△ロジック終了 コントロール/サブフォーム遷移先(名称指定)
▽ロジック開始 コントロール/有効状態セット
○パラメーター[00] 10617555271866184298
○パラメーター[01] 1
◇有効状態に設定
◇[成功]処理結果
△ロジック終了 コントロール/有効状態セット
◇[成功]処理結果
△ロジック終了 制御文/処理実行
■■■■■■■■■■■■■■■■「ユーザ選択画面」のコンボボックスに012をセット
▽ロジック開始 制御文/処理実行
▽ロジック開始 コントロール/内容セット
○パラメーター[00] 2568386354886641628
○パラメーター[01] 012
◇内容をセット
◇[成功]処理結果 012
△ロジック終了 コントロール/内容セット
△ロジック終了 制御文/処理実行
☆処理ロジック 正常終了--------------------------------------------------
■■■■■■■■■■■■■■■■「ユーザ選択画面」のコンボボックスに内容セットを行ったことで実行処理が動いている。
★イベント発生物のテキストが001になっている
★コントロールの内容取得で001が取れるので、001をKeyとして続きの処理を動かしていきます ← ここが012になることが期待値です★★★★★★★★★★★★
☆処理ロジック開始--------------------------------------------------
▽ロジック開始 制御文/デバッグログ
◇★★イベント発生物★★ テキスト:001 名称:ユーザコンボ 個別値1:0 個別値2:0
△ロジック終了 制御文/デバッグログ
▽ロジック開始 コントロール/内容取得
○パラメーター[00] 2568386354886641628
◇[成功]処理結果 001
△ロジック終了 コントロール/内容取得
▽ロジック開始 データベース/取得
○パラメーター[00] 14090883928606372614
○パラメーター[01] 14090883928606372614
○パラメーター[02] 0
○パラメーター[03] 001
○パラメーター[04]
◇[成功]処理結果 001
△ロジック終了 データベース/取得
▽ロジック開始 データベース/取得
○パラメーター[00] 5877798249027916313
○パラメーター[01] 14090883928606372614
○パラメーター[02] 0
○パラメーター[03] 001
○パラメーター[04] 山田 太郎
△ロジック終了 データベース/取得
☆処理ロジック 正常終了--------------------------------------------------
■■■■■■■■■■■■■■■■サブフォームの遷移先に画面「ユーザ選択画面」を設定(2回目)
▽ロジック開始 コントロール/サブフォーム遷移先(名称指定)
○パラメーター[00] 10617555271866184298
○パラメーター[01] ユーザ選択画面
◇[成功]処理結果
△ロジック終了 コントロール/サブフォーム遷移先(名称指定)
◇[成功]処理結果
△ロジック終了 制御文/処理実行
■■■■■■■■■■■■■■■■「ユーザ選択画面」のコンボボックスに012をセット(前と同じ動き)
▽ロジック開始 制御文/処理実行
▽ロジック開始 コントロール/内容セット
○パラメーター[00] 2568386354886641628
○パラメーター[01] 012
◇内容をセット
◇[成功]処理結果 012
△ロジック終了 コントロール/内容セット
△ロジック終了 制御文/処理実行
☆処理ロジック 正常終了--------------------------------------------------
■■■■■■■■■■■■■■■■「ユーザ選択画面」のコンボボックスに内容セットを行ったことで実行処理が動いている。期待した動きになっている
★イベント発生物のテキストが012になっている ←(期待どおり)
★コントロールの内容取得で012が取れるので、012をKeyとして続きの処理を動かしていきます ←(期待どおり)
☆処理ロジック開始--------------------------------------------------
△ロジック終了 文字列関数/連結
▽ロジック開始 制御文/デバッグログ
◇★★イベント発生物★★ テキスト:012 名称:ユーザコンボ 個別値1:0 個別値2:0
△ロジック終了 制御文/デバッグログ
▽ロジック開始 コントロール/内容取得
○パラメーター[00] 2568386354886641628
◇[成功]処理結果 012
△ロジック終了 コントロール/内容取得
▽ロジック開始 データベース/取得
○パラメーター[00] 14090883928606372614
○パラメーター[01] 14090883928606372614
○パラメーター[02] 0
○パラメーター[03] 012
○パラメーター[04]
◇[成功]処理結果 012
△ロジック終了 データベース/取得
▽ロジック開始 データベース/取得
○パラメーター[00] 5877798249027916313
○パラメーター[01] 14090883928606372614
○パラメーター[02] 0
○パラメーター[03] 012
○パラメーター[04]
◇[成功]処理結果 日本 一子
△ロジック終了 データベース/取得
-
渡辺様
ご質問頂きありがとうございます。
お手数ではございますが、以下についてお教え下さいますでしょうか。
・画面Bは何らかのテーブルとの連携を行っている画面でしょうか。
・画面Bのコンボボックスは何らかのフィールドとの連携が設定されておりますでしょうか。また、実現したい内容は以下のような内容とお見受けします。
・画面Aで社員番号などのキーとなる値を入力し、ボタンを押す
・画面Aのサブフォームに画面Bを設定し、入力されたキー値と関連するデータを画面に表示する。
上記のような処理であれば、画面Aのボタン押下で発生する処理内で「データセット/フィルター」「データセット/読込」をご実行頂くことでも実現可能となります。以下に実装例を記載致しますので、併せてご確認頂けますと幸いです。
また、わかりにくい箇所などございましたらご指摘を頂けますと幸いです。実装例
●画面A
・キーを入力するためのテキストを配置
・画面Bを入力するためのサブフォームを配置
・後述する「検索処理」を実行するためのボタンを配置●画面B

・ユーザ一覧(番号と名前)を格納するテーブルとの連携を設定
・コンボAを配置し、フォームと関連付けたテーブルのいずれかの列と関連付け

●処理「検索処理」
・画面Aのサブフォーム遷移先に「画面B」を指定
・画面Aのテキストから【検索値】を取得
・画面Bに表示するデータを【検索値】フィルターでフィルターする
・画面Bに表示するデータを明示的に読み込む -
回答ありがとうございます。
うまく表現できず、若干目的がずれて伝わってしまったようなので、構成を添付します。
またA,Bなどではなく伝わりやすいように画面に具体的な名前を付けました。(画面A:添付画像でメイン画面/画面B:添付画像でユーザ設定画面)また、実現したい内容は以下のような内容とお見受けします。
・画面Aで社員番号などのキーとなる値を入力し、ボタンを押す
・画面Aのサブフォームに画面Bを設定し、入力されたキー値と関連するデータを画面に表示する。2つ目でやりたいことが若干異なります。
入力されたキー(社員番号)の関連情報を表示したいのではなく、入力されたキー(社員番号)の社員をコンボボックスで選択した状態にしたいです。お手数ではございますが、以下についてお教え下さいますでしょうか。
・画面Bは何らかのテーブルとの連携を行っている画面でしょうか。
・画面Bのコンボボックスは何らかのフィールドとの連携が設定されておりますでしょうか。・ユーザ設定画面では、テーブルと連携させています。(社員テーブル)
・コンボボックスは内容とリストそれぞれ連携させています。
内容:フォーム、社員番号
リスト:テーブル、社員テーブル、社員番号、表示名
-
渡辺様
構成についてお教え頂きありがとうございます。
サブフォームの初期化及び画面構成について回答致します
長文となり恐れ入りますが、ご確認下さい。
また、ご不明点などございましたらご指摘を頂けますと幸いです。●サブフォームの初期化について
お問い合わせ頂いた初回・2回目の挙動については、アプリの内部状態の差異により以下のように動作しているよう見受けられます。●前提条件
・親画面に子画面未設定のサブフォーム(以下、SubA)を配置する。
・子画面として表示する画面Bを作成し、何らかのDBと連携する。
●初回のボタン押下
(1)親画面のボタン押下で以下の処理を実行
①「コントロール/サブフォーム遷移先」でSubAに画面Bをセット
→ここでは画面Bの実体化・初期化は行われない。
画面Bの実体化・初期化は処理実行キューに追加され、ボタン押下処理終了後に実行される。
②「コントロール/内容セット」画面BのDBの列と関連付けられているコントロールの値を更新
→値のセット先が実体化されていないため、本処理で設定した値は画面Bに反映されない。
(2)ボタン押下処理の終了後、(1)-①で発生した画面Bの実体化・初期化が実行される。
→初期化処理の結果、画面Bと連携するDBの値を画面に表示する。
●2回目移行のボタン操作
①「コントロール/サブフォーム遷移先」でSubAに画面Bをセット
②「コントロール/内容セット」画面BのDBの列と関連付けられているコントロールの値を更新
→「●初回のボタン押下」の際に画面Bの実体化が完了しているため、セットした値が画面Bに反映される。サブフォームの遷移先に利用する画面の初期化というのはいつやることが正しい実装なのでしょうか。
サブフォームとして表示するコントロールが実体化された状態で初期化を行っていただきますようお願い致します。
例えば、画面設計からサブフォームの「オブジェクト>動作設定>明細」に画面Bをご設定頂ければ、
初回のボタン押下も画面Bが実体化された状態で実行され、値のセット処理が期待通りに動作するようになるかと存じます。●お送りいただいた構成について
「ユーザーリストコンボ」がユーザーの選択を目的とするコントロールの場合、
「ユーザーリストコンボ」の「データ>内容」の設定は不要かと存じます。「ユーザーリストコンボ」の「データ>内容」に値が設定されている場合、以下画像のようにユーザ設定画面で表示している行の値が書き換えられてしまいます。

「ユーザーリストコンボ」の選択値に応じてユーザ設定画面で表示する行を切り替えたい場合には、
以下のようにご実装頂くことで実現可能かと存じます。・「ユーザーリストコンボ」の「データ>内容」を「値入力」に設定する。

・ユーザ設定画面で表示するデータを検索する処理を作成し、「ユーザーリストコンボ」の「オブジェクト>動作設定>実行処理」に設定する。

-
サブフォームとして表示するコントロールが実体化された状態で初期化を行っていただきますようお願い致します。
例えば、画面設計からサブフォームの「オブジェクト>動作設定>明細」に画面Bをご設定頂ければ、
初回のボタン押下も画面Bが実体化された状態で実行され、値のセット処理が期待通りに動作するようになるかと存じます。事前(プロパティ)にサブフォームの明細に設定できない場合は、初期化はできないと考えてよろしいでしょうか。
サブフォーム1つに対して、複数のフォームを使うことを考えているので現状の設計では事前にどれかに絞って設定できません。●お送りいただいた構成について
「ユーザーリストコンボ」がユーザーの選択を目的とするコントロールの場合、
「ユーザーリストコンボ」の「データ>内容」の設定は不要かと存じます。「ユーザーリストコンボ」の「データ>内容」に値が設定されている場合、以下画像のようにユーザ設定画面で表示している行の値が書き換えられてしまいます。
こちらはまだ試すことできていませんが、参考にさせていただきます。
-
渡辺様
ご返信遅くなり申し訳ございません。
事前(プロパティ)にサブフォームの明細に設定できない場合は、初期化はできないと考えてよろしいでしょうか。
サブフォーム1つに対して、複数のフォームを使うことを考えているので現状の設計では事前にどれかに絞って設定できません。上記のような場合、サブフォームの明細として表示する画面のテーブルと連携する項目を初期化する方法はございません。
渡辺様にお送りいただいたメイン画面のように、複数のサブ画面を操作に応じて画面表示するような場合には、以下のようにご実装頂けますと幸いです。
●画面設計
親画面に各サブ画面毎のサブフォーム配置し、「オブジェクト>可否>表示」をOFFにする。(非表示で配置する)
●サブ画面の制御を行う処理
表示したいサブフォームを「コントロール/可視状態セット」で可視状態にする。
単一の画面ではございますが、サンプルアプリ「テンキーを使ってデータを入力する」でも操作に応じてサブフォームの表示制御を行っております。
代替案のご案内となり恐れ入りますが、ご参考となれば幸いです。 -
渡辺様
ご確認いただきありがとうございます。
お教えいただいたイメージは以下のような構成となる認識でお間違い無いでしょうか。
このような構成の場合、画面Aで子画面の初期化が行われていない状態で初期値の設定を行ってしまうことになり、期待通りの動作とならないかと存じます。
別の代替案の提示となり申し訳ございませんが、
子画面を「コントロール/サブフォーム遷移先」で設定した後に行う初期値設定を
「コントロール/内容セット」ではなく、「データベース/更新」などからテーブルへ直接書き込みを行うことをご検討頂くことは可能でしょうか。処理実装のイメージは以下となります。

「コントロール/サブフォーム遷移先」によって生じる子画面の初期化処理が非同期で実行されてしまうことにより、「コントロール/サブフォーム遷移先」の後に行った子画面のコントロールへの値セットが無視されてしまうことが問題となっているよう見受けられます。
上記のように、コントロールが連携するテーブルの値を更新できれば、子画面の初期化後に設定した値を表示できるかと存じます。
代替案ばかりで申し訳ございませんが、ご検討下さいますと幸いです。
-
回答ありがとうございます。
このような構成の場合、画面Aで子画面の初期化が行われていない状態で初期値の設定を行ってしまうことになり、期待通りの動作とならないかと存じます。
図までありがとうございます。あくまで実際使いたい画面のサブフォームの遷移先に設定しておかないとダメということですね。
「コントロール/内容セット」ではなく、「データベース/更新」などからテーブルへ直接書き込みを行うことをご検討頂くことは可能でしょうか。
データベース連携で対応できるか考えてみます。
代替案ばかりで申し訳ございませんが、ご検討下さいますと幸いです。
こちらこそいくつも代替案の提示ありがとうございます。
サインインしてコメントを残してください。

コメント
9件のコメント