過去の桐井戸端BBS (桐ver.9)
18239 サブフォームからメインフォームへ制御を移す方法 はちがめ 2002/12/16-15:46
教えてほしいこと。(イベント処理)
1.一表を元表とするメインサブフォームで、
  サブフォームのイベントで制御をサブからメインに移す方法。
2.現在制御のあるフォームを知る方法。
3.サブフォームのハンドルの取得方法。

環境 win2k 桐Ver9

過去ログを見ておりましたらありました。

http://www.fuku3.com/~habata/kbbs/kakov8/11841.htm

この中で悲しげさんが総括されている2)の方法で出納簿を作成しています。
つまりメインフォームを伝票形式、サブフォームをカード形式で作成し、
項目[ID](カウンタ型)でリンクさせています。
普通に使用する分には、これで完璧に動きますが、
今回特殊が使い方を計画しています。
一つの表で複数の会計を管理するため、
メインフォオームは、フォーム開始イベントで、
[会計名]の内容で絞り込んで表示させています。
メインフォームは一覧表示用で編集を全て禁止、
サブフォームに「入力」「訂正」ボタンを貼り付けて編集するようにしています。

両ボタンの機能名はいずれも「訂正」のみにし、
左クリックイベントの前処理で、区別しています。
この状況で「入力」ボタンをクリックすると、
サブフォーム上では見事に行追加されます。
がメインフォームの一覧表に反映されません。(当然ですね)
そこで、サブフォームのボタンクリックで、
制御をメインフォームに移して行追加をすればいいのではと考えています。

メソッド呼び出し ハンドル = &hwindow,@フォーム.アクティブ設定()

を使ってみましたがうまくいきません。
よろしくお願いします

「入力」「訂正」ボタンの機能名 訂正
****************************************************************
出納簿.kev (メインフォームのイベントファイル)
          
名札 メイン
変数宣言 局所,文字列{&会計名}


手続き定義開始 フォーム::フォーム開始(長整数 &表番号)
オブジェクト操作 ハンドル=&hwindow &会計名=@会計名.標題
           *フォームの「@会計名」ソース変更により会計変更
if (&会計名="" .or &会計名="一般会計")
  絞り込み 条件名="一般会計"
 else
  絞り込み [会計名]=&会計名
end
手続き定義終了


****************************************************************
出納簿入力.kev (サブフォームのイベントファイル)

名札 メイン



手続き定義開始 フォーム::行訂正終了(長整数 &明細番号,長整数 &モード)
グループ選択解除              /* 再抽出のため
絞り込み解除
並べ替え 索引名="日付順"
if (&会計名="" .or &会計名="一般会計")
  絞り込み 条件名="一般会計"
 else
  絞り込み [会計名]=&会計名
end
置換
ジャンプ 行マーク=2
グループ選択
手続き定義終了

手続き定義開始 b入力::マウス左ダウン(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)
グループ選択解除
メソッド呼び出し ハンドル = &hwindow,戻り値=&あ,@フォーム.アクティブ設定()
行追加 [会計名]=&会計名
ジャンプ 行番号=最終
行マーク定義 2
手続き定義終了

手続き定義開始 b訂正::マウス左ダウン(長整数 &マウス位置[2],長整数 &明細番号,長整数 &フラグ,参照 長整数 &処理中止)
行マーク定義 2
グループ選択解除
手続き定義終了



18240 グループ選択状態と多重化表 悲しげ 2002/12/16-18:53
記事番号18239へのコメント
どもっ、はちがめさん
私の固有名詞が出ているので、シブシブ(^^;)コメントします。

>1.一表を元表とするメインサブフォームで、
>  サブフォームのイベントで制御をサブからメインに移す方法。
>2.現在制御のあるフォームを知る方法。
>3.サブフォームのハンドルの取得方法。

こういう難解な一般論は私は不得手ですので他に方にお任せするとして、
挙げられた「左右連動フォーム3態」の中の2)は私は実際には最も使ったことがないタイプのものですし、
さらに云えば、v9での「アクティブ設定」メソッドも使ったことがない等で、
有用なコメントはできそうもありません。
以下は、その前提で、的を外している可能性が高いコメントです。

ざっと見ただけですが、メインフォームが伝票形式、サブフォームがカード形式で、
メインの伝票はどうやらグループ選択状態にあるようです。
グループ選択状態だと多重化した別表での行追加は当然反映されないと思います。
ですから、サブの方の行追加が完了した時点における何らかのイベントにおいて、
メイン部の表のグループ選択状態を一時解除→再度のグループ選択をさせてみたらどうでしょうか?
なお、再度のグループ選択に際しては、例えば、必要なグループ項目値を取得しておいて
「グループ検索」させる必要があると思います。

その線で、タイトルも勝手に書き換えてしまいましたが、でも改めて本文を読み直してみると、
このようなことをどう実現させたらいいのかの質問ではなくて、
それは単なる例示であって、質問の本旨は冒頭の一般論にあるようにも取れたりします。(^^;)

18243 補足(一般論的な) 悲しげ 2002/12/16-19:36
記事番号18240へのコメント
kevはメインとサブ、それぞれ別なものを使います。
そうすると、メイン用のkevはメインフォームを、サブ用のkevはサブフォームをそれぞれ制御します。
同じkevを使うことは不可能ではありませんが、しばしば泥沼に落ちます。
サブのkevから見たとき、メインフォームについて「メソッド呼び出し」その他のコマンドを記述する場合には、
「ハンドル=&hwindow」パラメータを付けます。
サブフォームのハンドルは「無い」ような気がします。
だから、メインのkevにおいてサブの記述を行うに際しては、
例えばサブ内のコマンドボタンを実行させる場合は、連結したオブジェクト名を使います。
例えば次のように。
  メソッド呼び出し @sub.@なんとか牡丹.実行()

あと、メイン&サブの対象表が同一の場合に、しばしば問題となるのは
「ハンドル」と云うよりも、多重化表の「表番号」ではないかと思います。
これは、例えばメインのkevの「名札 メイン」イベントで
  変数宣言 共通,長整数{&メイン表番号,&サブ表番号}
とし、メイン・サブのそれぞれの「フォーム開始」イベントで
  &メイン表番号=&表番号   ←メインkevの場合
  &サブ表番号=&表番号    ←サブのkevの場合
としておけば、編集表の切り替えに随時利用できると思います。

18244 サブフォームからメインフォームを操作 はちがめ 2002/12/16-20:17
記事番号18240へのコメント
悲しげさん、早速のご返答有難うございます。

>私の固有名詞が出ているので、シブシブ(^^;)コメントします。
勝手に引用しまして申し訳ありません

>こういう難解な一般論は私は不得手ですので

いえ、私の方こそよくわかってないのです。
投稿文を何度も読み返しながら、迷いながら投稿するボタンを押したものです。

>メインの伝票はどうやらグループ選択状態にあるようです。
いえ、メインフォームは[会計名]による絞り込み状態です。
サブフォームは[ID]のリンクによるグループ選択状態です。

>ですから、サブの方の行追加が完了した時点における何らかのイベント
>において、メイン部の表のグループ選択状態を一時解除→再度のグルー
>プ選択をさせてみたらどうでしょうか?
グループ選択を絞り込みと読み替えて、
確かにそのような処理を組んでみましたがうまくいきません。
(メインの一覧表示が更新されません。)
メインに配置した再描画ボタンで絞り込み解除・再絞り込みを実行すると
希望どおり追加した行を表示させることはできます。

ならばいっそ、メインフォームを操作して行追加を行えば、
再描画等もいらないのではと考えたわけです。
で、これをサブフォームに配置したボタンから実行できないかと。

>でも改めて本文を読み直してみると、
>このようなことをどう実現させたらいいのかの質問ではなくて、
>それは単なる例示であって、
>質問の本旨は冒頭の一般論にあるようにも取れたりします。(^^;)
いえ、お察しのとおり、このことを実現したいのです。
が、別のフォームのオブジェクト操作だけでなく、
制御(この表現が正しいのかどうかはわかりません。)そのものを別のフォームに移して、
あたかもそのフォームの中から実行したように振る舞うことができるなら
いろいろ使い道があろうかと、先の質問のようになってしまいました。

ありがとうございました。

18245 Re:補足(一般論的な) はちがめ 2002/12/16-20:25
記事番号18243へのコメント
先のご回答のお答えしているうちに新たなご指導をいただき有難うございます。
さすがに早いですね。
ただ、今からちょっと出かけますので、内容については帰ってから吟味します。
ご丁寧なご指導に感謝します。

18246 Re:サブフォームからメインフォームを操作 悲しげ 2002/12/16-21:18
記事番号18244へのコメント
仰っている処理が「行追加」なのか「行訂正」なのか、どうも
曖昧ですが、ここは「行追加」に限定してコメントを続けます。

>メインに配置した再描画ボタンで絞り込み解除・再絞り込みを実行すると
>希望どおり追加した行を表示させることはできます。

う〜ん、ならばそのように「絞り込み解除・再絞り込みを実行」すれば
いいと思うのですが、どうしてそうしないのかがよく判りません。(?_?)
例えばサブで行追加の確定が完了した後の何らかのイベントで次のように処理させるとか。
----------------------------------------------------
*&某ID的項目値=[某ID的項目]
編集表 &メイン表番号 /*メインの表に編集表を移す*/
絞り込み解除
if (&会計名="" .or &会計名="一般会計")
 絞り込み 条件名="一般会計"
else
 絞り込み [会計名]=&会計名
end
編集表 &サブ表番号 /*サブの多重化表に編集表を戻す*/
*検索 [某ID的項目]{&某ID的項目}
----------------------------------------------------
※「ハンドル」よりも多重化表の表番号が問題と書いたのは、このような使い方を想定。
※某ID的項目云々は、多重化表同士では(それぞれは別表であるため)
行マーク定義が使えないので、もしレコードを特定できるID的項目が
あればそれを利用して当該レコードにジャンプさせようとの苦肉策。

あるいは「メインに配置した再描画ボタン」をサブから実行させる、
でもいいかもしれません。次例。
----------------------------------------------------
メソッド呼び出し ハンドル=&hwindow,@メインに配置した牡丹.実行()
編集表 &サブ表番号 /*念のためサブの多重化表に編集表を戻す*/
----------------------------------------------------

18247 Re:サブフォームからメインフォームを操作 悲しげ 2002/12/16-21:21
記事番号18246へのコメント
  編集表 &サブ表番号 /*サブの多重化表に編集表を戻す*/
  *検索 [某ID的項目]{&某ID的項目}

ではなく

  *検索 [某ID的項目]{&某ID的項目}
  編集表 &サブ表番号 /*サブの多重化表に編集表を戻す*/

ですね。そうじゃないと無意味です。(^^;)

18249 Re:補足(一般論的な) はちがめ 2002/12/16-22:49
記事番号18243へのコメント
>kevはメインとサブ、それぞれ別なものを使います。
はい。過去ログを見ていると常に出てきますね。
そのように心がけます。

>サブフォームのハンドルは「無い」ような気がします。
やはりそのようですね。また、その必要もないような気がしてきました。

>あと、メイン&サブの対象表が同一の場合に、しばしば問題となるのは・・・
このことについては、別欄で返事させていただきます。

ありがとうございました。
18251 Re:サブフォームからメインフォームを操作 はちがめ 2002/12/16-23:21
記事番号18246へのコメント
>仰っている処理が「行追加」なのか「行訂正」なのか、どうも曖昧ですが、
行追加です。会計名を自動入力させるためにマウス左ダウンイベントで行追加を
行い、追加した行をコマンドボタンの機能名で訂正処理しています。

>多重化表同士では(それぞれは別表であるため)
全て合点しました。
それぞれが別表を元表にしたメインサブフォームだったら、ひょっとしたら
こんな深みにはまらなかったのかも知れません。
同一表を元表にしていたため、サブフォームで処理した内容は
メインにも反映するものと思っていました。
現に、メインを絞り込みしてないときは、サブフォームで行追加した結果は、
メインに反映していました。ところが、メインを[会計名]で絞り込んだとたん
追加した行が表示されないため、制御?をメインフォームに移して再表示等の
処理をしなければいけないのかなと思ってしまいました。
あたかもウインドウコマンドのように。
ご指導のとおり、
編集表コマンドで処理対象表を変更したところ何とか動き出しました。
立ちこめていた霧が、一瞬にして晴れた気分です。
ありがとうございました。今後ともよろしくお願いします。

と、全て解決かと思いきや新たな疑問がでできました。
別スレッドにて質問します。
ご迷惑でなければおつきあいをお願いします。

戻る