メインコンテンツへスキップ

xpaへマイグレーションした場合にサブフォームが後ろに隠れてしまう

コメント

20件のコメント

  • Tanda

    nnさん、

    1点確認なんですが、「サブフォーム」と言われているのは、「サブタスクのフォーム」のことでしょうか、それとも「サブフォームコントロール」のことでしょうか?

  • Tera

    解決策でなくて申し訳ありません。

     

    1番目タスクのサブフォームが2番目タスクのフォームの下に隠れるので

    2番目タスクが表示された時点で1番目タスクのサブフォームが見えなくなるのは

    当然だよなあと思いながら、

    xpa4/uniPaaS両方で同様のプログラムを作成してみたら、、、

    なるほど、おっしゃる通りの動きをしますね。

    xpa4では上記の動きですが、

    uniPaaSでは2番目タスクが表示されていても

    フォーカスが1番目タスクにある時は

    2番目タスクのフォームの上に1番目タスクのサブフォームが表示されます。

    xpa4とuniPaaSでは仕様が異なるのですね。

     

  • nn

    Tanda様
    サブフォームとは、「サブフォームコントロール」のことです。
    uniPaaSで実行した場合は、2番目タスクのフォームが表示された後、1番目タスクのサブフォームコントロールが再表示されるのですが、xpaで実行した場合は、2番目タスクのフォームが表示されたまま1番目タスクのサブフォームコントロールは再表示されない状態です。

    Tera様
    ご確認ありがとうございます。
    1番目タスクの項目のコントロール前処理に「サブフォーム再表示」イベントを実行させても、前面に表示されませんでした。


    もう少し調査して、解決が難しい場合は、eSupportへの問い合わせも考えております。

  • Tera

    Magicではコントロールの上に呼び出されたフォームが表示されるのが常なので

    逆にuniPaaSの動きが標準外のように見えます。

     

    フォームとコントロールの表示順の問題であり、

    MagicでのZオーダはフォーム内のコントロールに限った表示順なので

    SpecialOldZorderの設定でも手に負えないと思います。

    他のINIファイル特殊パラメータも調べてみましたが該当しそうな設定は見当たりませんでした。

    そのままのコーディングでは対応は難しそうに見えます。

     

    私が作成したプログラムでは、

    2番目タスクもサブフォームにしたら

    2番目タスクのフォームの上に1番目タスクの項目説明サブフォームが表示されました。

    更に2番目タスクにカーソル移動したら2番目タスクの項目説明サブフォームが表示されました。

    2番目タスクを抜けると1番目タスクの項目説明サブフォームが表示されました。

    お望みの動きに近づけたように思うのですが、いかがでしょう?

     

  • Tanda

    nnさん、

    「サブフォームコントロール」ですと、下図のように「接続先」などの設定が必要となりますが、これらの設定はどうなっていますか?

  • nn

    Tera様

    ご返答が遅くなり申し訳ございません。

    ご確認ありがとうございます。

    おっしゃるような表示になるとuniPaaSと同様の表示になります!!

    私の方でも2番目タスクをサブフォームコントロールを使用しての表示に変更したのですが、1番目タスクのサブフォームコントロールの項目説明が前面に表示されるようになりましたが、2番目タスクに移動しても1番目タスクのサブフォームコントロールの項目説明が前面に表示されてしまいます。

    2番目タスクのサブフォームコントロールの「TABで移動」を「TRUE」に設定して、1番目タスクの3番目の項目の次に移動させるように設定しております。

    私の方の実行結果と、開発画面は次の通りです。2番目タスクの呼び出しをサブフォームコントロールに変更して、2番目タスクの終了条件を削除しております。

    変更方法を教えていただけないでしょうか?よろしくお願いいたします。

     

    2番目タスクをサブフォームに変更後の実行画面

    2番目タスクをサブフォームに変更

     

    Tanda様

    ご返答が遅くなり申し訳ございません。

    接続先は、項目説明表示用のプログラム番号を設定し、パラメータに「タスクの階層番号、項目番号」を設定しております。

  • Tanda

    nnさん、

    「サブフォーム再表示」のパラメータは、フォーム自体のコントロール名を渡す必要がありますが、間違いはありませんか?

  • Tanda

    nnさん、

    あと、サブフォームの更新は、通常はサブフォームのプロパティの「自動再表示」で行い、「サブフォーム再表示」のイベントは、プログラムを接続するときのパラメータが同じであるにも関わらず、サブフォーム内のデータが変更されている可能性がある場合に有効となるイベントですが、ロジックの解釈はそれに合致していますか?

  • Tera

    言葉足らずでした。ポイントがあります。

     

    まず、2番目タスクはファントムタスクなのでタスク終了条件とウインドウ消去が設定してあった筈で、これをデフォルトのタスク終了条件:No、ウインドウ消去:Yesに変更する、というのは問題無いと思います。

     

    課題がフォームとコントロールのZオーダであり、このままだと手を出せません。コントロール間のZオーダの問題にするために、2番目タスクをサブフォームにします。2番目タスクサブフォームコントロールのZオーダーより項目説明サブフォームコントロールのZオーダーを大きくする事により、項目説明サブフォームコントロールが上に表示されるようになります。

    ここまでは出来ているように見えます。

     

    ここからがポイントです。

    このままだと2番目タスクサブフォームにカーソル移動しても1番目タスクの項目説明サブフォームが上に重なったままなので2番目タスクの項目説明サブフォームが隠れたままです。なので、2番目タスクサブフォームは表示のみとし、カーソルを止めません。パーキング可:False、Tab移動:Falseにします。

    カーソルを止めるための2番目タスクは、普通のコールタスクで呼出すようにします。私の場合は3番目項目のコントロール検証で呼出すようにしました。(この辺りは仕様や規約で方法が変わると思います)

    呼出された2番目タスクのフォームは更に上に重ねて表示されるので、2番目タスクのフォーム内の項目説明サブフォームも表示されます。2番目タスクを終了すると2番目タスクのフォームが消えるので、その下にあった2番目タスクサブフォームや1番目タスクの項目説明サブフォームが見えてきます。

     

    いかがでしょうか?

     

  • nn

    Tanda様

    1番目のタスクでは、操作説明のサブフォームコントロール名「1.Sub/操作説明」を設定し、2番目のタスクでは、操作説明のサブフォームコントロール名「2.Sub/操作説明」を設定してますので、間違ってないと思います。

    マイグレーション前のuniPaaSプログラムで、コントロール前に設定しているイベント実行の「サブフォーム再表示」の条件を「No」に変更して、実行すると項目を移動しても項目説明が切り替わらないので、サブフォームコントロールのパラメータは同じと判定していると考えられます。
    そのため、ロジックのコントロール前処理にて、「サブフォーム再表示」イベントを実行して、再表示させていると思われます。

  • Tera

    余談ですが、私はサブフォーム再表示イベントを好まないので(クロスリファレンスしにくい、サブフォームのコントロール名を変更しても追随しない等、メンテナンス性がイマイチかなと)極力使わないようにしています。その部分のコーディング方法が異なりますが、今回の件には影響ないと思います。

     

    あと、いま思い付いたのですが、

    2番目タスクをコールタスクとせずサブフォームのまま、2番目タスクの項目にカーソルが止まったら1番目タスクの項目説明サブフォームを非表示にするというのもアリかもしれませんね。コーディング箇所が増えてしまいますが。

  • Tanda

    nnさん、

    > そのため、ロジックのコントロール前処理にて、「サブフォーム再表示」イベントを実行して、
    > 再表示させていると思われます。

    そのサブフォーム内のデータは、タスクをコールするときのパラメータの値が変わっていないのにも関わらず、データの内容自体が変更になっているという確証はありますか?

  • Tanda

    nnさん、

    「サブフォーム再表示」のイベントを発動する時のパラメータをもう一度確認されてみてはいがかでしょうか?特にパラメータ内に数値やドットが混じっているような場合は、思わぬ不具合を引き起こす可能性もあります。

  • nn

    Tera様

    ご丁寧に説明いただき、ありがとうございます。
    フォームとコントロールのZオーダーについて勉強になりました。
    「ここからがポイントです。」以降の変更を行いましたら、望んでた通りに項目説明が表示されるようになりました。
    マイグレーションのプログラムでも同様の修正方法で対応可能か確認します。

    こちらも余談になりますが、今回マイグレーション対象プロジェクトの立ち上げに携わった開発者が全て退社しているため、何故このようなコーディング方法にしているのか不明な箇所が幾つもあり非常に難儀しております。
    開発時に思案されてコーディングしていると思うのですが。。。


    Tanda様

    >サブフォームコントロールのパラメータは同じと判定していると考えられます。
    とお伝えしていたのですが、間違っておりました。
    コントロール前処理のイベント実行「サブフォーム再表示」の前に、エラーコマンドでサブフォームコントロールのパラメータの「LASTPARK関数」を確認した所、項目移動毎に前回パークしていた項目のコントロール名が表示されました。
    サブフォームコントロールのパラメータ値が変わっているにも関わらず、「自動再表示」がされてないようです。

    >「サブフォーム再表示」のイベントを発動する時のパラメータをもう一度確認されてみてはいがかでしょうか?特にパラメータ内に数値やドットが混じっているような場合は、思わぬ不具合を引き起こす可能性もあります。
    このプロジェクトでは「サブフォーム再表示」イベントのパラメータ値の頭に「タスク階層№とドット.」を付与しているのが規約のようでして、全て変更するのは難しいと思われます。今後の開発の際に気をつけていきます。ありがとうございます。

  • Tanda

    nnさん、

    > サブフォームコントロールのパラメータ値が変わっているにも関わらず、「自動再表示」が
    > されてないようです。

    これは、単純なプログラムを作ってみて、正常に動作するようでしたら、どこが違っているのかを比較してみられるといいと思いますよ。

  • nn

    Tanda様

    デバッグ機能の「ブレイクポイント」「ウォッチ」「SubformExecMode」を使って、サブフォームコントロールの「Sub/項目説明」のプログラムで内容を確認した所、変数に項目番号をパラメータとして設定した場合は、コントロール前処理でその変数を更新するとサブフォームコントロールの「自動再表示」と判定され、「Sub/項目説明」のプログラムが実行されましたが、「LASTPARK関数」を設定した場合は、「自動再表示」と判定されませんでした。
    そのため「サブフォーム再表示」をイベント実行させて、項目説明を再表示させていたと思われます。
    全てのプログラムが同様のコーディングになっているので、Tera様が、ご提案された「フォームとコントロールの表示順」の変更で対応を進めたいと考えております。
    ありがとうございます。

  • nn

    Tera様

    1番目の項目(1番目のタスク)にカーソルがパークしている状態で「5番目の項目」または「6番目の項目」の項目にマウスクリックで、カーソルパークすることは難しいでしょうか?
    「5番目の項目」または「6番目の項目」の項目をマウスクリックすると、4番目の項目にカーソルパークしてしまいます。
    1番目タスクのレコード前処理で、2番目タスクの表示のみ(ファントムタスク?)に変更すると、1回目は「5番目の項目」または「6番目の項目」にカーソルパークしますが、何度も繰り返すと4番目の項目にカーソルパークします。
    2番目タスクのサブフォームコントロールのパーキング可を「TRUE」に変更すると、「5番目の項目」または「6番目の項目」にカーソルパークするのですが、項目説明が正しく表示されなくなります。
    ご返答よろしくお願いいたします。

  • Tera

    それは私の提示した方法では出来ませんね。

    普通のコールタスクなので2番目タスクは初期化された状態で表示されてしまいます。

     

    それを実現するにはファントムタスクかサブフォームしかなさそうです。

    単純な方法なのですが、元のファントムタスクのまま

    カーソルが1番目タスクにいる時は

     2番目タスク内のサブフォームを非表示にし

     2番目タスクのフォーム高さを小さくして1番目タスク内のサブフォームを隠さない

    カーソルが2番目タスクにいる時は

     2番目タスク内のサブフォームを表示にし

     2番目タスクのフォーム高さを大きくして1番目タスク内のサブフォームを隠す

    というように切り替える方法では対応できませんか?

  • Tera

    具体的には、

     2番目タスクに切替えるためのフラグ変数を追加。

     2番目タスクのタスク前処理でフラグを立てる。

     2番目タスクのタスク後処理でフラグを倒す。

     2番目タスクのフォーム高さを、

      フラグが立っている時は大きい値/立ってない時は小さい値

     という式で設定。

     2番目タスク内のサブフォームで、

      フラグが立っている時は表示/立ってない時は非表示

     という式を可視欄に設定。

    といった感じです。

  • nn

    Tera様

    丁寧なご説明をありがとうございます。
    コールタスクを使うと、マウスクリックでの移動は出来ないのですね。

    サブフォームコントロール表示の切り替えがマイグレーションしたプログラムでも対応可能か確認いたします。
    また状況を報告させていただきます。

サインインしてコメントを残してください。