過去の桐井戸端BBS (桐ver.8)
14823 モーダルウインドウからフォーム選択をするとモーダルでなくなってしまう ケント 2002/01/22-12:11
メインフォームからコマンドボタンで開いたモーダルウインドウ(F_発行先一覧)で下記のイベントを実行しています。

|手続き定義開始 行セレクタ::マウス左クリック(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)
| 絞り込み 行数=1
| メソッド呼び出し @フォーム.フォーム選択("F_発行先")
|手続き定義終了

この結果開いた"F_発行先.wfm"がモーダルでなくなってしまいます。
メインフォームを訂正モードにできるのです。
これを回避する(モーダルのままにする)にはどうしたらよいのでしょうか。

|手続き定義開始 行セレクタ::マウス左クリック(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)
| 多重化
| フォーム呼出し "X:\F_発行先.wfm",編集表=する
|手続き定義終了

も考えたのですが、"F_発行先"の編集データが、そのままでは"F_発行先一覧"に
反映されないので、上記のイベントになりました。

よろしくお願いいたします。m(__)m
14830 行セレクタクリック行を多重化表で 悲しげ 2002/01/22-23:39
記事番号14823へのコメント
どもっ、ケントさん、「モーダル」と聞いて出てきました。(^^;)
で、行セレクタをクリックしたレコードを、モーダルフォームで多重化
オープンした時に、何らかの形で特定することが難しいですね。
もし、何かユニークなcodeのような項目値が存在していれば、それを利用すればいいことになるのですが、それが無いとなると……。
と云う訳で、今回はたまたま[Ctrl]+や[Shift]+クリックではないようですから、
次のような苦肉の策を考えてみました。

手続き定義開始 行セレクタ::マウス左クリック(長整数 &マウ・・・・
 行訂正 [某項目]=1
 フォーム呼出し "X:\F_発行先.wfm"
 行訂正 [某項目]=""
手続き定義終了

某項目と云うのは、この目的のためのフラグ的な項目とします。
整数型をイメージしていますが、文字列型でもかまいません。
"F_発行先.wfm"では、許可作業として「多重化」をチェックしておきます。
そして、こちらの方の「フォーム開始」イベントで
  絞り込み [某項目]=1
としておきます。
続いて(絞り込みに使った後は用済みなので)
  行訂正 [某項目]=""
とやっても構わないのですが、上記のように元フォームの方でやっても構いません。
なぜなら、モーダルフォームの方では多重化して(独立して)開かれており、
元フォームではレコードポインタは動いていないからです。
この方法だと、レコード数が多い場合には、モーダルフォームのオープンが遅くなると思います。
全レコードから(索引を使わない)絞り込みの過程が律速段階となりそうだから。


索引ありのユニークな項目値があれば、これらの過程でそれを利用すれば速いのですけどね。次のように

手続き定義開始 行セレクタ::マウス左クリック(長整数 &マウ・・・・
 &STR=[code]
 フォーム呼出し "X:\F_発行先.wfm"
手続き定義終了

モーダルフォーム側では開始条件にその索引を指定しておいて、「フォー
ム開始」イベントでは、
   絞り込み [ccode]{&STR}
とすれば、フォームオープンは激速となるはずです。


余計なことですが、呼び出すフォームはカード型で、
且つ1行絞り込み状態でしょうから、
もし[PageDown]キーで終端行(データは空)を表示させたくなければ、
「キーダウン」イベントで&仮想キーコード=34の場合に、
&処理中止=1としておけば、他の行に移動できないようになります。(^^;)

14845 Re:行セレクタクリック行を多重化表で ケント 2002/01/23-16:16
記事番号14830へのコメント
悲しげさん こんにちは

>どもっ、ケントさん、「モーダル」と聞いて出てきました。(^^;)
呼び出しモードのつもりではなかったんですが…^_^;アセアセ
どうもすみません。

>索引ありのユニークな項目値があれば、これらの過程でそれを利用すれ
>ば速いのですけどね。次のように
>
>手続き定義開始 行セレクタ::マウス左クリック(長整数 &マウ・・・・
> &STR=[code]
> フォーム呼出し "X:\F_発行先.wfm"
>手続き定義終了
>
>モーダルフォーム側では開始条件にその索引を指定しておいて、「フォー
>ム開始」イベントでは、
>   絞り込み [ccode]{&STR}
>とすれば、フォームオープンは激速となるはずです。
>
[発行先ID]を利用できるので、"F_発行先一覧.wfm"では

|手続き定義開始 行セレクタ::マウス左クリック(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)
|* 絞り込み 行数=1
|* メソッド呼び出し @フォーム.フォーム選択("F_発行先")
| 多重化
| &STR=#STR( [発行先ID] )
| フォーム呼出し "X:\F_発行先.wfm",編集表=する
|手続き定義終了

とし、(多重化コマンドはこれがないと"ウインドウはすでに割り当てられています。"
と叱られてしまうので必要?)"F_発行先.wfm"で

|手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
| 絞り込み [発行先ID]{ #NUM( &STR ) }
| if(#EOF=1)
| メソッド呼び出し @フォーム.更新モード設定( 6 )
| end
|手続き定義終了

としました。
[発行先ID]はカウンタ型なので数値型の変数に代入できるか心配だったので
文字列型に変換,逆変換しています。(ーー;)

>余計なことですが、呼び出すフォームはカード型で、且つ1行絞り込み状
>態でしょうから、もし[PageDown]キーで終端行(データは空)を表示させ
>たくなければ、「キーダウン」イベントで&仮想キーコード=34の場合に、
>&処理中止=1としておけば、他の行に移動できないようになります。(^^;)

痒いところに手が届く丁寧なコメントありがとうございます。

|手続き定義開始 フォーム::キーダウン(長整数 &仮想キーコード,長整数 &スキャンコード,長整数 &フラグ,参照 長整数 &処理中止)
| if(&仮想キーコード=34)
| &処理中止=1
| end
|手続き定義終了

としました。

以上のようにした場合、"F_発行先.wfm"での編集結果で"F_発行先一覧.wfm"を並べ替えしたい、
と言うのが悩みだったのですが、一般手続きにすれば良い、と気がつきました。

|手続き定義開始 データ更新()
| 編集表 3
| 並べ替え 索引名="ふりがな"
|手続き定義終了

として、"F_発行先.wfm"の"閉じる"コマンドボタンで手続き実行してから閉じるで
思い通りになりました。

おかげさまでこの2,3日の便秘が直った感じです。(汚い話ですみません。)
すっきりしました。どうもありがとうございます。
悲しげさんの調剤の腕は最高です。(^o^)V


14848 Re:行セレクタクリック行を多重化表で 悲しげ 2002/01/23-21:59
記事番号14845へのコメント
どもっ、ケントさん、それなりにお役に立てたみたいで何よりです。
-------------
手続き定義開始 行セレクタ::マウス左クリック(長整数 &マウス・・・・
 多重化
 &STR=#STR( [発行先ID] )
 フォーム呼出し "X:\F_発行先.wfm",編集表=する
手続き定義終了
-------------
この中の「多重化」も、その次の「フォーム呼出し」で「編集表=する」指定も不要です。
いえ、そうやってもいいのですが、でもそうすると後で多重化表を閉じるための記述をしなければならず、
表の管理が少し面倒になります。
ですから、前にも書きましたが、そうしないで呼び出すフォームの方で「多重化」の設定をしてしまう方が簡単になります。
この設定の仕方は、フォームのプロパティで「編集対象表」タブを指定、
右下にある「許可作業」釦をクリック。
そこで「多重化」にチェックを入れておきます。
こうすると、その表が既に開かれていた時は、自動的に多重化オープンされます
(桐から「ウインドウは既に割り当てられています」と叱られずに)。
kevの記述も
-------------
手続き定義開始 行セレクタ::マウス左クリック(長整数 &マウス・・・・
 &STR=#STR( [発行先ID] )
 フォーム呼出し "X:\F_発行先.wfm",ボタン=&釦
手続き定義終了
-------------
だけで済むことになる訳です。

※この設定ができないとすれば、プロパティが「詳細プロパティ」になっていないのもしれません。
そうだとすれば、上部メニューバーの「書式」から、
一番下の「定義画面の設定」をクリック、その中のこれまた一番下の「詳細プロパティを使用する」にチェックを入れます。

もう1点、前回云い忘れたことを補足します。それは「行セレクタ」のクリックイベントを利用している点についてです。
ここは判っていないと、しばしば「レレレのオッサン」になってしまいます。
要するに、「行セレクタ」をクリックした行(凹んでいる)と現在処理対象行は同じとは限らないと云うことです。
このことは、行セレクタのクリックが、[Ctrl]+や[Shift]+で複数行も対象にできることを考えれば、
それなりに得心が行くと思います。
ですから、たとえ1行が相手だとしても、行セレクタ指定と現処理対象行が異なるような状況を発生させてしまった時は、
思わぬ結果をもたらすことになる訳です。
またまた余談ながら、私はこのような用途に行セレクタのクリックは使いません。
代わりに、よく[Home]キーを使います(「キーダウン」イベントで)。
一覧表or伝票wfmを「表」ウィンドウと見立て、「カード」wfmとの間を往来させる訳です。
あたかも、[Home]キーで表/カード間を往来させるように。(^^;)

あと、意図を承知している訳ではありませんが、呼び出したモーダルフォームを閉じる際に
----------------
手続き定義開始 データ更新()
 編集表 3
 並べ替え 索引名="ふりがな"
手続き定義終了
----------------
を手続き実行させるとのことについて。
それが良くないと云う訳ではないのですが、一応別解も挙げておきます。
ひとつは、「フォーム終了」イベントも使えそうなこと。それともうひとつは
次のように(行セレクタクリックイベントの利用云々はさておき)元フォーム
のkevに戻ってから
-------------
手続き定義開始 行セレクタ::マウス左クリック(長整数 &マウス・・・・
 &STR=#STR( [発行先ID] )
 フォーム呼出し "X:\F_発行先.wfm",ボタン=&釦
 if(なんとか)
 /*この条件は&釦の値とか、呼出し元で代入した変数を利用するとか*/
  並べ替え 索引名="ふりがな"
 end
手続き定義終了
-------------
こんな感じの方が自分的には好みです。表番号とかウィンドウハンドルに
振り回されるのが何せ嫌いなもんで。(^^;)

14857 Re:行セレクタクリック行を多重化表で 悲しげ 2002/01/24-17:44
記事番号14848へのコメント
何度も小出しですいません。前回もうひとつ書くのを忘れていました。(^^;)
それは、呼出し先wfmの記述に関してです。
--------
手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
 絞り込み [発行先ID]{ #NUM( &STR ) }
 if(#EOF=1)
  メソッド呼び出し @フォーム.更新モード設定( 6 )
 end
手続き定義終了
--------
多重化表では、呼出し元で現存するレコードと同じレコードを絞り込むのだから、
EOFとなることは有り得ないと思います。(^^;)
推測するに、終端行を指定した場合は、呼出し先カードにおいて、
行追加としてオープンしたいと云うことでしょうか?
だとすれば、その判断はむしろ呼出し元でやった方がいいと思います。
例えば、
-------------
手続き定義開始 行セレクタ::マウス左クリック(長整数 &マウス・・・・
 if(#EOF)
  &STR=""
 else
  &STR=#STR( [発行先ID] )
 end
 フォーム呼出し "X:\F_発行先.wfm",ボタン=&釦
手続き定義終了
-------------
このことは、呼出し元に於て、終端行でクリックした場合に「処理対象行がない」エラー対策にもなりそうに思いますが、
ともあれ、こうしておいてですね、呼出し先フォームにおいて
--------
手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
 if(&STR="")
  メソッド呼び出し @フォーム.更新モード設定( 6 )
 else
  絞り込み [発行先ID]{ #NUM( &STR ) }
 end
手続き定義終了
--------
のようにするやり方なんかいかがでしょう?(但し、挙動は全く未確認)

14861 Re:行セレクタクリック行を多重化表で ケント 2002/01/24-19:54
記事番号14857へのコメント
悲しげさん こんにちは。度重なるご指導感謝いたします。

>この中の「多重化」も、その次の「フォーム呼出し」で「編集表=する」指定
>も不要です。いえ、そうやってもいいのですが、でもそうすると後で多重化表

やっとわかりました。
許可作業の多重化は前からチェック入れてあるのですが、なぜか"ウインドウ云々"
としかられていました。
その犯人は「編集表=する」でした。このパラメータを外す
ことにより、「多重化」コマンドは不要となりました。"F_発行先一覧.wfm"ですでに
開いている編集対象表を使って多重化するんだから、という発想で「編集表=する」
としたのですが、どうも違うみたいですね。ヨクワカラナイケド…(・・;)

「行セレクタ」のクリックイベントを利用している点についてはただ気分です。^_^;
行セレクタのクリック1回目でイベントが発生するので[Ctrl]+や[Shift]+でも
複数選択はない、と判断しています。ただ、今気づいたのですが、[space]で押下状態にできるんですね。
そこで

|手続き定義開始 フォーム::キーダウン(長整数 &仮想キーコ…)
| if(&仮想キーコード=32)
| &処理中止=1
| end
|手続き定義終了

としました。
又、[Home]はノートパソコンのため使いづらく、今回はパスです。すみません。

あと、並べ替えの件ですが、これも私の思い込みでした。
それは"多重化するときは呼び出し元の編集対象表を共有にしなければならない。"と
思っていたのです。色々やっているうちに、専有で(呼び出し元も呼び出し先も)開けば、
呼び出し先で更新した時点で呼び出し元も更新並べ替えになることがわかりましたので、いらなくなりました。
実際はマスターの編集になるので、訂正時には"注意;コメント"のメッセージボックスを出し対応したいと思っています。

>手続き定義開始 行セレクタ::マウス左クリック(長整数 &マウス・・・・
> if(#EOF)
>  &STR=""
> else
>  &STR=#STR( [発行先ID] )
> end
> フォーム呼出し "X:\F_発行先.wfm",ボタン=&釦
>手続き定義終了
>-------------
>このことは、呼出し元に於て、終端行でクリックした場合に「処理対象行
>がない」エラー対策にもなりそうに思いますが、ともあれ、こうしておい
>てですね、呼出し先フォームにおいて
>--------
>手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
> if(&STR="")
>  メソッド呼び出し @フォーム.更新モード設定( 6 )
> else
>  絞り込み [発行先ID]{ #NUM( &STR ) }
> end
>手続き定義終了
>--------
>のようにするやり方なんかいかがでしょう?(但し、挙動は全く未確認)
>
ありがとうございます。利用させてもらいます。
おかげさまでだんだん形になってきました。
あとは細々としたところと、レポートを定義すればβ版の完成です。

戻る