過去の桐井戸端BBS (桐ver.8)
14229 ソース値更新イベントをファミリで使いたい Hosey 2001/11/24-13:36
Windows2000
桐ver.8 sp6

フォームを使ってレコードを編集する際に以前(桐ver.5)は
編集に移る直前に行退避コマンドを実行し、フォームに
定義されている項目を

&編集前 = [A] + [B] + [C] + ・・・ + [n]
というように変数に格納し

編集作業に入ります。

編集を終了したら
&編集後 = [A] + [B] + [C] + ・・・ + [n]

保存終了、破棄終了を判定させ

破棄終了であれば 行復旧 破棄=する

保存終了であれば
&編集前=&編集後 → そのまま終了
&編集前<>&編集後 → 印字コマンドでレコード印字
印字されたk3ファイルをサーバへコピー

簡単に説明するとこんな処理を行っていましたが

ver.8で編集後レコード更新の有無を判定するにはソース値更新イベントを用いてフラグをたて、
更新されていれば印字...という処理が妥当だろうと考えました。

が、実際に定義するにはフォームに配置された項目すべてに
イベントを設定しなければならずファミリも利用することが出来なそうです。

ver.8を使い始めてまだ日が浅く、このような目的を達成する為に
皆様はどのような処理をなさっているかご意見を伺いたいと思います。

よろしくお願いします。

14231 Re:ソース値更新イベントをファミリで 悲しげ 2001/11/24-16:15
記事番号14229へのコメント
どもっ、Hoseyさん
既にご承知のとおり、「ソース値更新」イベントはファミリにできません。
このような場合は、次のツリーが参考になりそうな気がします。

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

つまり「行訂正開始」と「行訂正終了前」イベントの利用です。

14257 Re:ソース値更新イベントをファミリで Hosey 2001/11/26-11:53
記事番号14231へのコメント
悲しげさん有り難うございます。

>既にご承知のとおり、「ソース値更新」イベントはファミリにできません。
>このような場合は、次のツリーが参考になりそうな気がします。
>http://www.fuku3.com/~habata/kbbs/kakov8/12089.htm
>つまり「行訂正開始」と「行訂正終了前」イベントの利用です。

これだとver.5で処理した方法と内容的には変わらないということですね。

問題点:項目を追加したときや汎用性で問題があるようです。

そこで

ソース値更新というファミリを作成し、フォーカス取得・喪失イベントで次のようにしてみようと思いました。

手続き定義開始 ソース値更新::フォーカス取得(文字列 &喪失オブジェクト名)
  変数宣言 固有,文字列{&編集前 }
  &編集前 = #cond(#文字位置(#項目属性(#項目番号(""),2),"文") \
       .or #文字位置(#項目属性(#項目番号(""),2),"時") \
       ,#項目属性(#項目番号(""),0),1\
       ,#str(#項目属性(#項目番号(""),0)))

手続き定義終了

手続き定義開始 ソース値更新::フォーカス喪失(文字列 &取得オブジェクト名)
  変数宣言 固有,文字列{&編集後 }
  &編集後 = #cond(#文字位置(#項目属性(#項目番号(""),2),"文") \
       .or #文字位置(#項目属性(#項目番号(""),2),"時") \
       ,#項目属性(#項目番号(""),0),1\
       ,#str(#項目属性(#項目番号(""),0)))

  if (&編集前 <> &編集後)
    確認 &編集前 + " & " + &編集後
  end

手続き定義終了

が、このような書き方だと確認のところで&編集前の変数が
フォーカス取得イベントの影響で異動先のデータソースが格納されてしまい、
判定できません。


そこで、皆様のお知恵をお借りしたいと思います。
よろしくお願いします。

14259 Re:ソース値更新イベントをファミリで うにん 2001/11/26-15:39
記事番号14257へのコメント
Hoseyさん

>ソース値更新というファミリを作成し、フォーカス取得・喪失イベントで
>次のようにしてみようと思いました。
>
>手続き定義開始 ソース値更新::フォーカス取得(文字列 &喪失オブジェクト名)
>  変数宣言 固有,文字列{&編集前 }
>  &編集前 = #cond(#文字位置(#項目属性(#項目番号(""),2),"文") \
>       .or #文字位置(#項目属性(#項目番号(""),2),"時") \
>       ,#項目属性(#項目番号(""),0),1\
>       ,#str(#項目属性(#項目番号(""),0)))

この#condはいらないと思います。無条件に#strで問題ないでしょう。

>が、このような書き方だと確認のところで&編集前の変数が
>フォーカス取得イベントの影響で異動先のデータソースが格納さ
>れてしまい、判定できません。

「ファミリ」のフォーカス取得イベントなら、ファミリ外のオブジェクトには
イベントを定義しなければいいような気がしますが。

14260 Re:ソース値更新イベントをファミリで 悲しげ 2001/11/26-15:45
記事番号14257へのコメント
どもっ、Hoseyさん

ファミリの手続き定義の名前に「ソース値更新」などを使ってしまうと、
特にここのように他の人も含めてやりとりする場では、「ソース値更新」イベントとの間で
無用な混乱を招きそうな気がするのであまり好ましくないように思いますが、それはさておき・・・・(^^;)

試してませんが、例えば「フォーカス取得」時の「&喪失オブジェクト名」を使って、
「ソース値取得」メソッドでソース値を取り出す方法なんてどうでしょう?

「フォーカス*」系のイベントを使う場合で、もうひとつ注意すべきことがあります。
それは「フォーカス」(「項目」と云ってもよい)が変わらずに「レコード」が変わった場合、
「フォーカス*」系のイベントは発生しないことです。
これは、フォーカス自体が変わっていないのだから当然のことでして、
変数などには前のレコードの値が入ったままになっていたりします。
私はこれで数時間ドツボにハマッタことがあります。(^^;)

14269 Re:ソース値更新イベントをファミリで 遊び人です 2001/11/27-22:07
記事番号14257へのコメント
こんばんわ。たまに通りかかる遊び人です。

>が、このような書き方だと確認のところで&編集前の変数が
>フォーカス取得イベントの影響で異動先のデータソースが格納さ
>れてしまい、判定できません。

ようするに、値が変更されたかどうかを知りたいわけですよね。
このやり方では駄目です。フォーカスイベントでは、行訂正開始時の最初の入力前項目値が取得できるとは限らないし、
フォーカスイベントが発生しないケースもありますよ。
このイベントは、こと項目値の更新関連ではあてにできないです。
面倒くさいでしょうけど、ここはやはり入力前後のイベントと、
行訂正開始と行訂正終了イベントの4種類を使わないと駄目です。
入力前後のイベント定義が面倒くさいのだと思いますが、
ハンドラ内をひとつの手続きで済ませてしまえば、
あとはコピー&ペーストしてオブジェクト名を変更するだけですから、いくらか楽でしょう。
私なら、つぎのような感じで書きます。

----
名札 メイン
 変数宣言 局所,文字列{&前[5],&後[5]}, \
      局所,長整数{&ObjNo,&更新}

手続き定義開始 フォーム::行訂正開始(…
 &更新 = 0
手続き定義終了

手続き定義開始 フォーム::行訂正終了(…
 条件 ( &モード = 0 ) 手続き終了
 If ( &更新 = 1 )
   メソッド呼び出し @フォーム.更新モード設定(0)
   印字開始
   …
 End
手続き定義終了

手続き定義開始 txt1::入力前(…
 手続き実行 IsUpdate( &this, "前", &編集文字列 )
手続き定義終了

手続き定義開始 txt1::入力後(…
 手続き実行 IsUpdate( &this, "後", &編集文字列 )
手続き定義終了


手続き定義開始 IsUpdate(文字列 &myObj, 文字列 &VarName, 文字列 &myStr)
 &ObjNo = #対応番号("txt1,txt2.txt3.txt4,txt5", &myObj)
 &myStr = #Setvar( &VarName, &ObjNo, &myStr )
 条件 ( &VarName = "後" .and &前[&ObjNo]<>&後[&ObjNo] ) &更新 = 1
手続き定義終了

戻る