過去の桐井戸端BBS (桐ver.8)
8114 モーダルフォームとは? KH 2000/10/17-21:03
モーダルフォームという言葉が頻繁に出てくるのですが、なかなか調べられず困っています。
普通のフォームとどこが違うのかよく分かりません。

過去ログの#3940で佐田先生が次のように定義されているのですが、

「モーダルフォームとは、そのフォームを閉じない限り、新しく別のウィンドウを開いたり、
他の処理をできなくするウィンドウのフォームの事です。」

フォームのコマンドボタンのなかに機能としてモーダルフォームがありますが、
フォーム定義の時点からモーダルフォームとして定義する事が出来るのか、よくわかりません。
さらに具体的にこのモーダルフォームはどのように利用するためのものか教えていただければ幸いです。

8115 Re:モーダルフォームとは? 悲しげ 2000/10/17-22:23
記事番号8114へのコメント
私もKHです。いや、私はHKか。(^^;)

実は私ごときが断定することはできないのですが、間違っている可能性を承知の上で、この点につき少々断定的に書いてみます。
ま、シロン、シロンS、パンシロン、新パンシロン、パンシロンG、パンシロン01……、失礼しました。試論です。(^^;)

フォームファイルの開きかたには大雑把に云って二通りあります。
その1は
 ・cmdまたはkev→「フォーム呼び出し」
 ・ボタン→「モーダルフォーム」
その2は、
 ・cmd→「ウィンドウ作成」(私はkevから使ったことないけど?)
 ・ボタン→「開く」
概ねこのような対応関係にありそうです。
そして、前者の方が、佐田さんの定義に従えば
「モーダルフォームとは、そのフォームを閉じない限り、新しく別のウィンドウを開いたり、
他の処理をできなくするウィンドウのフォームの事です。」と云うことです。
では後者はと云うと、上に倣って云えば「そのフォームを閉じなくても新しく別のウィンドウを開いたり、
他の処理ができるウィンドウのフォームの事です。」となりましょうか。(^^;)
ま、少し意味が取りにくいかもしれませんが、当たらずとも遠からず
と云ったところでしょうか。
で、この定義だけから読むと、後者(その2)の方が有利のようにも取れますが、
しかしながら桐v8においては一概にそうとも云えないのが辛いところです。
私個人の考えでは、桐v8ではむしろ前者(その1)
の方が相対的には有利くさいとすら考えています、特に大規模な処理ほど。
後者(その2)が完全にメインとできるのは、ひょっとして桐v9以降になるのではないかとも想像しています
(実は確たる根拠がある訳でもないのだが)。
その理由は、複数フォーム(ウィンドウ)が存在する時、どのウィンドウを任意にアクティブにできるかどうかと云う点です。
v8の現時点では、確かにどっちもどっち、一長一短はありますが、少なくとも前者(モーダルフォーム)の方が
(限界はあれ)意図どおりの素直な挙動を示します。
つまりは一番手前(即ちモーダルの)フォームを呼び出すor閉じるだけのことですから、極めて単純なことです(^^;)。
対して後者の方は、しばしば挙動を読み切れなくて収拾がつかなくなることがあります(;_;)。
端的な例としては、手前に表示させたいフォームが何かの機会に後ろのフォームの陰に隠れてしまって出て来れない、とか。
要するに、アクティブウィンドウの扱い(メソッド)が未完であると云うことなのでしょうか?
いえ、これは私が後者(即ち非モーダル)のこの点を嫌って、単に使い込んでいないせいなのかもしれません。
うまく使いこなしている方からのコメントと反論を期待したいところです。
ただし、本来的(将来的)には、メインの流れとしては後者を使い、部分的に前者(モーダルフォーム)を呼び出して処理させる、
みたいな方法がベターなような予感がしています。

あ、ちょいと総論に走ってしまいましたが、具体的な用途についても質問されてましたね。
  >さらに具体的にこのモーダルフォームはどのように
  >利用するためのものか教えていただければ幸いです。
例えば、あるフォームを「フォーム呼び出し」(即ちモーダルフォーム)して何らかの処理をさせた後、
呼び出したフォームを閉じて、呼び出し元のフォームに戻る(そして処理の結果を反映させるとか)。
つまりはDOS桐的に云えば「手続き実行 名札」の名札範囲のように
この「フォーム呼び出し」を使いまわすこともできます。結構便利ですよ。(^^)v
8116 Re:モーダルフォームとは? 悲しげ 2000/10/17-22:45
記事番号8115へのコメント
本格的に「モーダル命」で行くのなら、
メインメニューのみを普通にオープンさせ(親)、個々のメニューについては、
それぞれの(例えばメニュー1用の)フォーム(子)を「フォーム呼び出し」して処理させる。
そのフォームから、さらに別なフォーム(孫)を「フォーム呼び出し」したり閉じたり、
さらにさらに別フォーム(曾孫)を「フォーム呼び出し」たり……。
閉じる時は閉じるボタンを実行することでパタパタパタとメインメニューに戻ることができます。
子をa.wfm、孫をb.wfm、曾孫をc.wfmとします。
この時、子aから孫bを呼び出し、次いで孫bから曾孫cを呼び出してから、
cを閉じ、bも閉じてaに戻るやり方がひとつ。
これが上で書いた方法です。階層はかなりのものに耐えられるようです。
そうではなく、孫bを閉じて子aに戻り、子aからcを孫(つまり曾孫ではなく)として呼び出す方法もあります。

う〜ん、ますます混乱してきましたか?(^^;)
あっ、前稿冒頭で書いたとおり、「フォーム呼び出し」コマンドで呼び出したフォームは必ず「モーダルフォーム」です。
8118 Re:モーダルフォームとは? Ogo 2000/10/17-23:15
記事番号8116へのコメント
一般論です。

本来的には、「モーダルウィンドウ」とは、これを閉じない限り
次の処理には移れないというウィンドウを指します。

Windows ではマルチウィンドウで別スレッドで動くのが基本ですから、
任意の時点で任意のウィンドウに制御を切り換えることができるのが前提になっています。
が、中には、特定の処理を実行中に別の操作を禁止させたい場合や、
順序指定に従って順序よくウィンドウ表示させる必要がある場合とかがあります。

例えば、指示したコマンドを本当に実行していいか否かを確認のウィンドウを出している最中に、
勝手に別ウィンドウをアクティブにして別のコマンドボタンを押されたりしたら破綻するとかいう場合。

例えば、フロッピーのフォーマットをしている最中に、別のウィンドウをアクティブにすることを許可したら、
そのウィンドウでフロッピーにアクセスし兼ねないので絶対許可できないとかいう場合。

一般的には「確認ダイアログ」は全部「モーダルウィンドウ」です。

桐の場合はダイアログだけでなく、一般のフォームでも「モーダル」を指定することができます。

DOS 桐5 までの場合はマルチウィンドウではなかったので、必然的に全部「モーダルフォーム」でしたが、
Win 桐 になると、マルチウィンドウこそが Windows の持ち味(メリット)になっているので、
標準を「モーダル」にするわけにはいきません。

で、ユーザーにその選択肢を渡しているのです。
どちらが目的に合致しているかは、システム構築者・当該システムユーザーにしか判りません。

#しかし、モーダルであるか否かで(本来同じであるべき)挙動が
#違うことが多過ぎるとは感じています。 (^^;;

ちなみに、「モーダル」は 桐 に限らず、Windows の開発言語では必ず出て来る概念です。

8121 Re:モーダルフォームとは? 佐田 守弘 2000/10/18-01:26
記事番号8118へのコメント
KHさん
モーダルフォームのモーダルの意味については、Ogoさん、悲しげさんが書かれている通りですので省略します。
モーダルフォームを使うべきか、通常のモーダルでないフォームを使うべきかは、
Ogoさんが書かれている様にシステム設計の考え方なのですが、別の言い方をすれば、
「メニュー構造をどの様に作るか?」と言い換えた方が分かりやすいかも知れません。
そこで、2つのメニュー構造についてお話します。
なお、名称は私が勝手につけた名前です。
@階層構造型
メニューを開く時には、悲しげさんの書き方で言えば、親→子→孫という様に、階層を追って順次開き、
別の系列のメニューを開くには、一度その逆順で戻り、再び同じ様に降りて行くメニュー構造です。
一般的なビジネスアプリなどは、この様な形が普通なのではないでしょうか。
A総当たり型
どのメニュー画面からでも別のどこのメニューでも呼び出せるような構造です。
実際には全てがそのように作る事は不可能ですが、いくつかの作業画面を開いておき、
必要に応じてユーザーが自由に行き来できる形があり得ます。
ある意味では、WEBのリンク関係などは、この様な自由に呼び出し合える関係とも言えます。

で、どちらを良しとするかは、使い易さと共に、それによって互に影響がでないかでしょうね。
例えば、1つのファイルに互に異なる変更を行う様な事を同時に許してしまうと、不都合を来します。
そう言った事を考慮しながら、どこまでは並列的に処理させて良いかを設計する事が必要なのかと思います。

ユーザーからすれば、自由度が高いメニュー構造の方が使いやすいに決まっております。
しかしながら、システムの開発者あるいは管理者としては、階層構造型にメニューを作っておく方が、
安心できるケースが少なくありません。

佐田守弘(KS-00119)
8127 モーダルフォームでない汎用メニュー アックン 2000/10/18-11:15
記事番号8121へのコメント
こんにちは。
こういう話題好きなんで、ちょっと私も寄せてくださいな。(=^・^=)
佐田さんがおっしゃる「総当たり型」メニューを今kevで書いているところなんですよ。
PC98のDOS桐時代に作った汎用メニュー「マコチャンメニュー」のWindows版であります。
メニューを登録(編集)するとき、同時に最大3個のフォームを開いて、自由に行き来して操作できるようにしました
(メインメニューのフォーム、編集メニューのフォーム、プロパティのフォームの3個)。
各フォームの整合性をとるためには、ハンドル、変数、そして処理するタイミングに注意すればいいようです。
参考になるモノが全くない手探りの状態でやっているので、悩ませてはくれますが、かなりはまってます。
さて、この汎用メニュー自身と、登録する桐アプリとの間の挙動が、いずれは問題になりそうです。
自作の桐アプリしか登録しないのなら、クリアできるのでしょうが。

アックン(=^・^=)
8136 Re:モーダルフォームでない汎用メニュー 悲しげ 2000/10/18-17:04
記事番号8127へのコメント
どもっ、アックン君
試作版のモニター希望します。(^^;)
8139 Re:モーダルフォームとは?失礼ながらまとめてお礼です。 KH 2000/10/18-19:39
記事番号8114へのコメント
 悲しげさん、Ogoさん、佐田先生、アックン(コメント順)どうもありがとうございました。
今まで、もやもやしていたものがすっきり青空です。
恥ずかしい話しですが、一時は編集対象表のない初期メニューに使うようなフォームの事かなどと
勝手に解釈しようとしていた時期もありましたがどうも違うなと感じていました。
本当に質問してよかったです。

ここで私事。私は佐田先生の仰る「階層構造型」で処理をしていたようです。
ウィンドウ作成と会話コマンドで。階層下ではメニュー2をかなり使っています
(V5からのコンバートでフォームに直すのが面倒だから)。
フォーム呼び出しは、桐を意識させないためにオーバーラップ形式のフォームを呼び出すために使って
処理をしようと試みた事がありますが、あの挙動は私にはちょっと。
しかし今説明を伺ってモーダルフォームの存在意義がわかりました。
有難うございます。
8141 Re:モーダルフォームでない汎用メニュー アックン 2000/10/19-08:14
記事番号8136へのコメント
kanasy様>
いよいよただ今佳境に入ったところ故、も少し待ってちょーらいね。<(^∞^)
フォーム呼び出しオンリーの悲sy大明神様には是非ご覧頂きたく早老。いや、早漏?。ちゃう。候。

参考になるモノがまったくないと書いたんだけど、それは3個のフォームを操るケースのこと。
実はいかさんメニューをしっかり参考にさせていただいております。(^^;

メニューは他の桐アプリに比べて複雑でない分、まだやりやすいんだろうと思うけど、
それでも頭の中がウニュ〜となりますね。
悲しげさんの超複雑系アプリともなると・・・・どうなるか想像できません。(^^;

アックン(=^・^=)

戻る