過去の桐井戸端BBS (桐ver.8)
19447 多重化で開いたフォームが前面に表示されない むぅ 2003/03/17-10:54
桐8sp6を使用しています。
早速ですが、質問させて下さい。

Aフォームを開いています。
Aフォームから、イベントでBフォームを呼び出します。
Bフォームから、更にCフォームをコマンドボタンの多重化_フォーム編集で呼び出します
(この時、機能2でBフォームを閉じています)。
*A、B、Cフォーム共に全画面表示です。

すると、CフォームがAフォームの裏に行ってしまって、Aフォームを閉じるなどしないとCフォームが見れません。
Cフォームを前面に表示させるには、どのようにすれば良いのでしょうか。
Cフォームのフォーム開始イベントでフォーカス設定()をしてみたのですが、
効果はありませんでした。
*全てにおいて一括処理は使用していません。

宜しくお願いします。
19451 Re:多重化で開いたフォームが前面に表示されません 悲しげ 2003/03/17-14:19
記事番号19447へのコメント
どもっ、むぅさん

まず

>Aフォームから、イベントでBフォームを呼び出します。



>*全てにおいて一括処理は使用していません。

の関係ですが、「イベントで」と云うことは、一般的には拡張子がkevである一種の一括処理ファイルを使っていることを指します。
しかるに、「一括処理を使用していない」と云うことは、拡張子がcmdであるファイルを使っていないと云うことなのか、
あるいはkevファイルも使っていないと云うことなのか、どちらを指すのでしょう?

もし後者、即ちkevも使っていないのであれば、それは一般には「イベントで」とは云いません。
その場合はそうですね、例えば「コマンドボタンだけで」と云うと思います。

で、以下は「イベントで」ならぬ「コマンドボタンだけで」との仮定でコメントを続けます。

まずAフォームからBフォームを呼び出した際のコマンドボタンの「機能名」は、
「開く」と「モーダルフォーム」のどちらでしょう?
(ちなみに、厳密に云えば「呼び出す」=「モーダルフォーム」です)

もしAからBを「モーダルフォーム」で呼び出したのなら、Cも「モーダルフォーム」で呼び出す必要があります。
つまり全て「モーダルフォーム」で走る訳です。
その際にBでのボタンの2行目の機能で特に「閉じる」必要はありません
(いえ、閉じてもいいのですが)。
それとCフォームの定義においては、「編集表」タブの「許可作業」ボタンから必ず「多重化」にチェックを入れておく必要があります。

AからBを「開く」で開いた場合は(これは「モードレスフォーム」となるようなのですが
そのことの説明はパスさせていただいて)、手前に来て欲しいフォームが背面に行ってしまうことはよくあることです。
で、対策は幾つかありそうですが、最も簡単なことで云えば、
Aフォームの「ウィンドウの形式」を「チャイルド」にして試してみて下さい(「オーバーラップ」でもいいのですが、
一寸制限がかかります)。
多分、現在は「ポップアップ」になっているのだと想像されます。

19452 Re:多重化で開いたフォームが前面に表示されません 悲しげ 2003/03/17-14:31
記事番号19451へのコメント
補足。
あるいは、Aを「ポップアップ」のままとして、BもCも全て「ポップアップ」に統一してしまうと云う手もあるかと思います。
(現在の設定がAがポップアップでBCがチャイルドであるのなら)

ps:
ちなみに私の好みは全てモーダルフォームです。(^^;)
他人に使ってもらう処理だと、これが一番安全なので。

19453 Re:多重化で開いたフォームが前面に表示されません むぅ 2003/03/17-14:44
記事番号19451へのコメント
悲しげ様、早速のアドバイス有り難うございます!

>「イベントで」と云うことは、一般的には拡張子がkevで
>ある一種の一括処理ファイルを使っていることを指します。

すみません、私の認識不足でした。kevも一括処理の一部だったのですね。
今回の件では、kevファイルを使用しています。
AフォームからBフォームの呼び出しは、kevファイルに
 フォーム呼び出し "Bフォーム"としています。

BフォームからCフォームの呼び出しは、Bフォームのコマンドボタンに、
 機能名1:多重化_フォーム編集 機能パラメータ:"Cフォーム"
 機能名2:閉じる
としています(Bフォームは閉じておきたいので、敢えて閉じています)。

>「ウィンドウの形式」を「チャイルド」にして試してみて下さい
各フォームは全て「チャイルド」になっていました。

多重化ではなく、フォーム呼び出しを使えば良いのかとも思うのですが、
表を絞り込み状態にしているので、その状態をそのまま引き継げる多重化で
何とか出来れば有り難いのですが・・・。
何か対策をご存じでしたら、アドバイスお願いします。
19456 Re:多重化で開いたフォームが前面に表示されません 悲しげ 2003/03/17-18:20
記事番号19453へのコメント
どもっ、むぅ様
kevを使うイベントのことだったのですね。
いや、言葉使いとしては全く正しいです。失礼いたしました。(^^;)

さて、Bを「フォーム呼び出し」しているのなら、これはモーダルですから、
牡丹の機能「多重化_フォーム編集」で開いたC(多分モードレス)が、
結果的にAの背後になってしまうのも何となく有り得るかな、と云う気がします。
やっぱりBをモーダルにしたらCもモーダルにするしか無い、と私なら素直に諦めます。(^^;)

>多重化ではなく、フォーム呼び出しを使えば良いのかとも思うのですが、表を絞り
>込み状態にしているので、その状態をそのまま引き継げる多重化で何とか出来れば
>有り難いのですが・・・。

多重化表たるものは、そもそも元表の絞り込み状態や行マーク定義などを継承させることはできなかったと記憶しています。
それは「多重化_フォーム編集」でもおそらく同じかと思います。
多重化せずに絞り込み状態等を他フォームに継承できるのは「使用フォーム」コマンドか、
牡丹の機能「フォームの選択」くらいかと思いますが、
これらはイベントでは使用が制限されていたような気がします。

と云う訳で、私ならこうする、を書いてみます。
諦めてCはBから「フォーム呼び出し」する。(Cは多重化チェック済み)
絞り込み状態を反映させるための苦肉策として(何らかの法則性があるのなら
それを利用するのがベターなのですが、そんなものは無いと仮定すれば)、
B.kevにおいてCを呼び出す直前に、絞り込んだレコードについて作業項目[tmp]を「1」で置換しておく(*1)。
呼び出されたC.kevの「フォーム開始」イベントで
 絞り込み [tmp]=1
とする。
なお、Cを閉じる時(「フォーム終了」イベント等)は、必ず
 絞り込み解除
 置換 [tmp]=""
としておく。結構苦しいでしょうか? (^^;)

なお、

>(Bフォームは閉じておきたいので、敢えて閉じています)。

の件ですが、どうせアクセスできないのだから閉じないままでも別に構わないような気がしないでもありません。
「見せたくない」のであれば、(*1)の際に、
 置換 [tmp]=1
 ウィンドウ位置 最小化
 フォーム呼び出し "c.wfm"
 ウィンドウ位置 復元
 *あるいは method @b閉じる牡丹.実行() のようにすぐに閉じてしまう?
とか。
どうしてもBを閉じたいのであれば、呼び出し先フォームがあるのに呼び出し元を閉じることはできないので、
Bを一旦閉じてAに戻り、AからCを呼び出す形をとることになります。
この過程をあたかもBからやっているように見せることは、できないことは無いけれども、
少し複雑な仕掛けを要します。

19459 フォームの切り替えとモーダルフォーム 佐田 守弘 2003/03/18-00:05
記事番号19447へのコメント
むぅさん
この件については悲しげさんが詳しく書かれておりますが、私からも何点か
補足させて頂きます。

●モーダルフォームとは
モーダルとは、そのダイアログやフォームなどを閉じない限り、
他のダイアログやフォームに戻れないものを言います。
桐の各種設定画面でも設定を終了しなければ、
別の設定に戻れない場所がある事は気がつかれていると思います。
フォームの場合、フォーム呼び出しで開いたフォームは
モーダルフォームになります。
モーダルフォームから別のモーダルフォームを更に開く事はできますが、
それを閉じないと、呼び出したフォームへは戻れません。
ご質問の件で言えば、A→B→Cの順に開く様ですが、閉じるときには、
この逆の順に順を追って閉じます。
Cを開いてからBを閉じる事は許されません。

●別の考え方や方法について
いくつかの方法を提示してみます。どれが良いか、またそれが可能かは、
書かれている内容では判断できないので、ご自身で試して判断して下さい。

1)BとCはフォームを切り替える
どうやら同じ表を編集しているらしいので、フォームを切り替える方法が使えるかも知れません。
機能名の「フォームの選択」でフォームを切り替える方法を試してみて下さい。

2)機能名の開く、閉じる機能で開く
この方法は、オーバーラップフォームに初変えませんが、
チャイルド形式であれば、一般的に使う方法です。
コマンドボタンに以下の機能を定義します・
・開く <次に開くフォームファイル名>
・閉じる ← この機能で自分自身が閉じられる。
この方法は、フォーム呼び出しでモーダルフォームを呼び出すのと違い、
次々と新しいフォームを開いては、元のフォームを閉じる方法です。
前のフォームに戻るには、そのフォームを開きます。

佐田守弘(KS-00119)
19470 Re:多重化で開いたフォームが前面に表示されません むぅ 2003/03/18-17:43
記事番号19456へのコメント
悲しげ様、アドバイス有り難うございます!
結果報告が遅くなって申し訳ありませんでした。
色々いじくっていたら”致命的なエラー”と言われて強制終了されたりしていたもので・・・。

>やっぱりBをモーダルにしたらCもモーダルにするしか無い、と私なら素直に
>諦めます。(^^;)

Cをモーダルで開く方法を試してみたところ、見事、Cフォームが前面に表示されました。
ですが、表を改めて絞り込もうと思ったのですが、変数を使用しての絞り込みが上手くいかず、
悲しげさんが提示して下さった方法は、表に新たな項目を追加出来ないため(仕様が決まっているので)
活用できませんでした。(T_T)

BフォームからCフォーム(ちなみにメイン&サブフォームです)を多重化_フォーム編集で開くと、
Bフォームで表示されている(絞り込まれている)データがCフォームにそのまま表示されたので、
結果的に、Aフォームも閉じてしまうことでCフォームを前面に表示させることにしました。
A・B各フォームを閉じる処理がチラチラと見えるのが少し気になりますが・・・。

色々と詳しくアドバイスして下さって有り難うございました。
時間のある時に、最小化する処理などを試してみたいと思います。
19472 Re:フォームの切り替えとモーダルフォーム むぅ 2003/03/18-18:00
記事番号19459へのコメント
佐田様、丁寧なご説明を有り難うございます!

>Cを開いてからBを閉じる事は許されません。
そうだったのですね。AフォームからBフォームを呼び出した後にAフォームを閉じる処理をしたのですが、
Bを呼び出した後すぐにAフォームを閉じるものだと思っていたのですが、
Bフォームを閉じた後にAフォームを閉じるのはそういった理由だったのですね。
勉強になりました。

>機能名の「フォームの選択」でフォームを切り替える方法を試してみて下さい。
この方法を試してみたのですが、何故かボタンが使用不可表示になってしまい、
クリックすることが出来ませんでした。(^_^;

>2)機能名の開く、閉じる機能で開く
この方法も試してみたのですが、元の表は閉じてくれるのでCフォームは前面に表示されるのですが、
悲しげさんにご説明したように、変数での絞り込みが上手くいかず、断念しました・・・。

フォームを開くという一つの処理にも色々な方法があるのですね。
今後はアドバイス頂いた内容をもとに、その時に合った方法を利用させて頂きたいと思います。
有り難うございました。
19477 Re:多重化で開いたフォームが前面に表示されません 悲しげ 2003/03/18-19:21
記事番号19470へのコメント
どもっ、むぅさま

>表を改めて絞り込もうと思ったのですが、変数を使用しての絞り込みが上手くいかず、

ここんとこでうまい智恵が出るかもしれないので(出ないかもしれないが)
もう少し具体的に書いてみるつもりはありませんか?

>BフォームからCフォーム(ちなみにメイン&サブフォームです)を多重化_フォーム編集で開く
>と、Bフォームで表示されている(絞り込まれている)データがCフォームにそのまま表示された
>ので、結果的に、Aフォームも閉じてしまうことでCフォームを前面に表示させることにしまし
>た。

この記述の意味を、実は私は殆ど想像できないのですが(^^;)、ちょっと
誤解を招きそうな部分のみコメントしておきます。
「多重化_フォーム編集」では絞り込み状態は継承されません。
でも、多重化前にカーソルのあったレコードにジャンプ(自動検索)しているのですね。
今回初めて知りました。(^^;)

19482 Re:多重化で開いたフォームが前面に表示されません むぅ 2003/03/19-11:06
記事番号19477へのコメント
悲しげ様、こんにちは。またまたコメント有り難うございます。

変数での絞り込みについて、お知恵を貸して頂ける(かも?)とのことで、ご説明させて頂きます。
まず、Aフォームで一覧表データの中から1件を選択(絞り込み)して、Bフォームを呼び出します。
次に、そのデータの詳細を表示したい場合、Cフォームを呼び出します。
データは年度ごとのフォルダに分かれていて、メインフォームで年度を選択して変数に代入しています。

変数は、固有 文字列 &NENDO, &CODE です。
テーブルはA・B・C(メインフォーム)共に、&NENDO + "情報.TBL" です。
●Aフォーム
 <kevファイル、メイン>
  オブジェクト操作 @フォーム.編集対象表 = &NENDO + "情報.TBL"
 <OKボタン右クリックイベント>
  代入 &CODE = [コード]
  フォーム呼び出し "Bフォーム"
●Bフォーム
 <kevファイル、メイン>
  オブジェクト操作 @フォーム.編集対象表 = &NENDO + "情報.TBL"
 <フォーム開始イベント>
  解除 *
  絞り込み [コード] = &CODE
ここで、Bフォームの詳細表示ボタンの機能で、モーダルフォーム "Cフォーム"として、
CフォームのkevファイルにBフォームと同じイベントを記述してみたのですが、
Cフォームにはデータが何も表示されませんでした。
試しにCフォームにレコードスクロールバーを付けてみたのですが、1件もデータがありませんでした。

分かりにくい説明かと思いますが、宜しくお願いします。


>「多重化_フォーム編集」では絞り込み状態は継承されません。
>でも、多重化前にカーソルのあったレコードにジャンプ(自動検索)しているのですね。

Cフォームにフォームスクロールバーを付けてみたのですが、Bフォームで表示されていたデータの1件しかありませんでした。
これは絞り込み状態とは違うのでしょうか??(^_^;
19483 Re:多重化で開いたフォームが前面に表示されません 悲しげ 2003/03/19-11:51
記事番号19482へのコメント
どもっ、むぅさま

>テーブルはA・B・C(メインフォーム)共に、&NENDO + "情報.TBL" です。

編集対象表は全て同じなのですか!
(と、ビックリマークをつけるのは、何故かhidetakeさんふう)(^^;)
それはそれとしても、これらがメイン&サブであることの関係が全然想像できません。
原因はひょっとするとメイン&サブであることに起因しているのかもしれません。
ここの過去ログで例えば「サブフォームの編集対象表」なるキーワードで
検索したら幾つか出ては来ました。



以下、本題に関係なさそうですが

>●Bフォーム
> <kevファイル、メイン>
>  オブジェクト操作 @フォーム.編集対象表 = &NENDO + "情報.TBL"
> <フォーム開始イベント>
>  解除 *
>  絞り込み [コード] = &CODE

Bを「フォーム呼び出し」で多重化オープンする場合、開始条件で設定していない限りは
表は基本状態で開かれますから、「解除 *」は不要かと思います。

B、Cともに「名札メイン」部で&CODEを変数宣言してませんよね?
(もししていたら中味はクリアされます)

>>「多重化_フォーム編集」では絞り込み状態は継承されません。
>>でも、多重化前にカーソルのあったレコードにジャンプ(自動検索)しているのですね。
>
>Cフォームにフォームスクロールバーを付けてみたのですが、Bフォームで表示されていたデータの1件
>しかありませんでした。これは絞り込み状態とは違うのでしょうか??(^_^;

変ですね。私が「多重化_フォーム編集」試した限りでは書いたとおり、
スクロールバーで云えば多レコードの中のある1件として表示されます。
これもメイン&サブがらみ?

19485 Re:多重化で開いたフォームが前面に表示されません むぅ 2003/03/19-14:29
記事番号19483へのコメント
悲しげさん、早速コメント有り難うございます!

Cフォームのみメイン&サブフォームで、メインの[コード]をグループ項目に指定して、
該当するデータの別情報をサブフォームに表示しています。
サブフォームの参照表は、&NENDO + "サブ情報.TBL" です。
ちなみに、全てのフォームは閲覧のみなので、更新:しない としています。

>ここの過去ログで例えば「サブフォームの編集対象表」なるキーワードで
>検索したら幾つか出ては来ました。
Cフォームで改めて年度選択して、それをサブフォームに反映させようとしているのですが、
こちらでもつまずいていました。
上記のキーワードで検索したところ、この状況に当てはまりそうな例がありましたので
試してみたいと思います。今回の件とは別になりますが。(^_^;
今回の参考になりそうな例も探してみます。

>Bを「フォーム呼び出し」で多重化オープンする場合、開始条件で設定し
>ていない限りは表は基本状態で開かれますから、「解除 *」は不要かと思います。
そうだったのですね、この1行は削除したいと思います。
有り難うございました。

>B、Cともに「名札メイン」部で&CODEを変数宣言してませんよね?
>(もししていたら中味はクリアされます)
&CODEの変数宣言は、Aフォームでしか宣言していません。
19494 Re:多重化で開いたフォームが前面に表示されません 悲しげ 2003/03/19-17:49
記事番号19485へのコメント
どもっ、むぅ様
もう少し再現を試してみたのですが、結局はcフォームにおいて

1)「多重化_フォーム編集」による(レコード検索ならぬ)絞り込み状態の継承
2)「フォーム開始」イベントでの変数による絞り込みの《失敗》

の2点とも再現させることは全然できませんでした。(^^;)
殆ど迷宮状態ですが、特に後者については、Cの「フォーム開始」の記述を
  確認 "コードは"+&CODE
  絞り込み [コード] = &CODE
として、変数値を確認させてみて下さい。もし値がうまく来ていないようであれば、
Bの中で変数値が動いてしまった可能性もあるので、Cを呼び出す直前に
変数に項目値を改めて代入する必要があるのかもしれません。
これで駄目ならお手上げ。
19520 Re:多重化で開いたフォームが前面に表示されません むぅ 2003/03/20-10:11
記事番号19494へのコメント
悲しげ様、度々アドバイス有り難うございます。

>  確認 "コードは"+&CODE
>  絞り込み [コード] = &CODE
Cフォームのフォーム開始イベントにて、上記を追加してみました。
結果、確認で表示されたコードは、Bフォームで表示されているデータのコードと一致しておりました。
絞り込みを実行しないと、一番若いコード番号のデータが表示されます。
絞り込みをすると、[コード]には一番若いコード番号が表示されているのですが、
項目の内容は空(真っ白)になってしまいました。
・・・なかなか上手くいかないものですね。(T_T)

戻る