過去の桐井戸端BBS (桐ver.8)
11189 メッセージボックスの戻り値の処理方法 やまぐっちゃん 2001/05/15-16:14
皆様、ご無沙汰をしております。
久々にプログラムを作るべく日夜努力をしておりますが
イベントが一向に理解できないような現状です。

イベント内で印刷処理を下記のような形で作成してみました。

手続き定義開始 送状印刷 ()
メッセージボックス ”送状印刷”,”FUJITSUプリンタに送状をセットしてください!” ,アイコン=!,ボタン指定=2,制御文字展開=しない,&戻値

レポート印刷 ・・・・・・・
手続き定義終了

ここで初歩的な質問なのですがボタン指定が2ですので”OK”,”キャンセル”のキャンセルが押された時、&戻値は2になります。
そこで判らないのですが、この場合の処理の記述はどのようにすればよいのでしょうか?

if else endで記述するのでしょうか?

宜しくご指導ください!
11190 Re:メッセージボックスの戻り値の処理方法 ごりら 2001/05/15-18:19
記事番号11189へのコメント
やまぐっちゃんさん、●○です。
ケースをつかったらどうですか?
桐の一括処理サンプルを参考にされたらどうでしょうか?

今日は、暑いでんな!
生ビールのんでまっか?
11191 Re:メッセージボックスの戻り値の処理方法 bonito 2001/05/15-20:40
記事番号11189へのコメント
給与作成中...疲れたのでちょっと休憩 (^^;

一番簡単なのは
>手続き定義開始 送状印刷 ()
>メッセージボックス ”送状印刷”,”FUJITSUプリンタに送状をセットしてくだ
>さい!” ,アイコン=!,ボタン指定=2,制御文字展開=しない,&戻値
 ********
>レポート印刷 ・・・・・・・
>手続き定義終了

*******部分に
条件(&戻値=2) 手続き終了
とすればOK...。
疑り深い私は
条件(&戻値≠1) 手続き終了
とするかも...。

>if else endで記述するのでしょうか?
汎用性ならやっぱこっちかなぁ〜。

11192 Re:メッセージボックスの戻り値の処理方法 悲しげ 2001/05/15-21:44
記事番号11191へのコメント
bonitoさんが

>疑り深い私は
>条件(&戻値≠1) 手続き終了
>とするかも...。

と書かれたことを、これだけでは判りにくいかもしれないので、少し補足します。
例えば、牡丹指定が2であった場合、表示される牡丹はOKとキャンセルですが、
実はその他にもうひとつあります。
それは右上の[×]牡丹です。
牡丹指定=2の場合ですと、比較的話は簡単でして、返り値はOK=1、キャルセル=2、×=2です。
ところが、例えば牡丹指定=5で、はい・いいえを選ばせる場合だと、はい=6、いいえ=7、もうひとつありまして、×=2です。
ですから、この場合、「いいえ」のつもりで7だけを考えていたら、×=2を押されてしまった場合に対応できないことになります。
この場合は、条件としては「6か6以外か」として考える必要がある訳であります。

その線で話を本件例に戻すと、記述は次のようにしたらいいだろうと云うのが、
bonitoさんが行間に包含(^^;)していたことだと思います。
-------------------------------------------------
手続き定義開始 送状印刷 ()
 メッセージボックス ”送状印刷”\
 ,”FUJITSUプリンタに送状をセットしてください!”\
 ,アイコン=!,ボタン指定=2,制御文字展開=しない,&戻値
 条件(&戻り値<>1) 手続き終了
 レポート印刷 ・・・・・・・
手続き定義終了
-------------------------------------------------
または
-------------------------------------------------
手続き定義開始 送状印刷 ()
 メッセージボックス ”送状印刷”\
 ,”FUJITSUプリンタに送状をセットしてください!”\
 ,アイコン=!,ボタン指定=2,制御文字展開=しない,&戻値
 if(&戻り値=1)
  レポート印刷 ・・・・・・・
 end
手続き定義終了
-------------------------------------------------

ちなみに、ケースとif〜endは同じです(switchも同じ)。
が、「ケース中止」的な処理が可能なのは「ケース」だけですから、相対的にはこちらの方が汎用的かもしれません。
breakが、繰り返し中止を意味することになったため、if〜endで使えなくなったからかと想像しています。
でも、違うかも〜?
11193 Re:メッセージボックスの戻り値の処理方法 佐田 守弘 2001/05/15-22:35
記事番号11192へのコメント
やまぐっちゃん さん
悲しげさんが書かれている後半の方法が良いかと思います。

私の場合(葉書の宛て名印刷の実例)を紹介しますと、次の通りです。
=========================================
手続き定義開始 はがき印刷()
 メッセージボックス "はがき印刷" \
          ,"印刷を実行します" \
          ,アイコン=?,ボタン指定=5 \
          ,制御文字展開=しない \
          ,&印刷確認
 条件 (&印刷確認=6) レポート印刷 葉書宛名
手続き定義終了
=========================================
メッセージボックスコマンドの戻り値(&印刷確認)の値が6の時には印刷を行い、それ以外は何もしない内容です。
条件が成立したときの実行コマンドは、レポート印刷コマンド1つだけなので、ケースコマンドを使わずに条件コマンドを使った方が簡単です。

もしケースコマンドで記述するなら、条件コマンドの部分が次の様になります。
=========================================
 ケース開始
  ケース (&印刷確認=6)
    レポート印刷 葉書宛名
 ケース終了
=========================================

なお、
>>条件(&印刷確認<>6) 手続き終了
は入れる必要がありません。

これは私の趣味ですが、条件によってループ(この場合には手続き定義開始〜終了)を抜け出すのがどうも好きではありません。
プログラムとしては間違いではないでしょうが、見る人間の方がまぎらわしいので行わない様にしています。


11194 ありがとうございました。 やまぐっちゃん 2001/05/15-23:05
記事番号11192へのコメント
ごりらさん、bonitoさん、悲しげさん、ありがとうございました。

暫く、桐から離れて「ACCESS」、「MRDB」に手を出して「VB」、「VBA」に染まってしまっていました。
「ケース」はV5の時に一括処理で使用していましたが、今ではすっかり忘れてしまっていました。
「条件」は考えついたのですが式のあとの記述方法が思いつかずこのBBSに投稿した次第です。

これを機会にもっと桐(イベント)を勉強していきたいと思いますので
これからもご指導のほど宜しくお願いいたします。

11197 「手続き終了」コマンドの効用 悲しげ 2001/05/16-00:56
記事番号11193へのコメント
「ケース」類で囲うか、「手続き終了」で抜けるかは、確かに好みの問題もあります。
が、私はV8でイベントを使うようになってから「手続き終了」returnを使う機会が激増しました。
V8になって「手続き終了」の位置付けが少し変わったとも云えます。
そのことを少し書いておきます。
ちなみにこの件は、以前(2000年3月末頃)【多遊】さんのbbsでbonitoさんから教えていただいたことであります。

以下のようなkevの記述があったとします。
TTTTTTTTTTTTTTT(1)TTTTTTTTTTTTTTTTTTTTTTTTTTTT
手続き定義開始 某イベント(・・・・)
 処理A色々・・・・
 確認 "処理Aだけで終了しますか?",&確認
 条件(&確認=1) メソッド呼出し @閉じる牡丹.実行() ……(a)
 処理B色々・・・・
手続き定義終了
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
この場合、(a)で閉じてしまおうと思っても、実は「処理B」まで実行された後でフォームが閉じられます。
一見不思議ではありますが、どうやらイベント系の手続き定義内の処理は、
必ずしも上から順番に実行されるものではなく、
各処理が一連のものとして(同期して)実行されるキライがあると云えるようです。

これは、次のように書き換えることもできます。
TTTTTTTTTTTTTTTT(2)TTTTTTTTTTTTTTTTTTTTTTTTTTT
手続き定義開始 某イベント(・・・・)
 処理A色々・・・・
 確認 "処理Aだけで終了しますか?",&確認
 if(&確認=1)
  メソッド呼出し @閉じる牡丹.実行()
 else
  処理B色々・・・・
 end
手続き定義終了
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
このようにすれば、多分、期待どおりの挙動を示すと思います。とてもオーソドックスな書き方でしょうね。
ただし、「処理B」以降がかなり複雑になるような場合の簡素化にはどうも貢献できない。

ところがある時、次のような記述を使えることがわかりました。
TTTTTTTTTTTTTTTT(3)TTTTTTTTTTTTTTTTTTTTTTTTTTT
手続き定義開始 某イベント(・・・・)
 処理A色々・・・・
 確認 "処理Aだけで終了しますか?",&確認
 if(&確認=1)
  メソッド呼出し @閉じる牡丹.実行()
  手続き終了
 end
 処理B色々・・・・
手続き定義終了
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
「手続き終了」の1行を挿入する訳です。こうすると、それ以降の処理は実行しない。
これを使えば「処理B」以降を、かなり簡素な記述にすることも可能でした。(^^)v
ここで思ったのは、DOS桐の手続き範囲と、Win桐の手続き(定義)範囲、及びその結果としての「手続き終了」の挙動の違いについてです。
DOS桐の場合の手続き範囲は終わりがありませんでした。
ですから、私は時々、ある名札範囲を(条件により)手続き終了させないで、
続いて記述してある名札にそのまま突入してしまうような処理も書いたりしました。
ところが、Win桐の場合は手続き(定義)範囲と云うのは厳密です。
曰く「ひとまとまり」、曰く「開けたドアは必ず閉める」。
「手続き定義」の終了が(DOS的な意味での)手続き終了と手続き定義範囲の終わりのふたつの意味があるようです。
その結果として、Win桐における「手続き終了」とは、そこで処理を切り上げるだけではなく、「手続き定義終了」の位置を前の方に持って来るものである。
云い換えれば、「ひとまとまり」として同期して実行される手続き定義内の各処理を、この「手続き終了」によって中断させることできる。

そんな訳で、(それだけが理由じゃないけど)その後の私の記述はreturn(手続き終了)だらけとなっています。(^^;)
11199 Re:「手続き終了」コマンドの効用 やまぐっちゃん 2001/05/16-10:42
記事番号11197へのコメント
悲しげさん、いつも痒いところに手が届く回答をありがとうございます。

イベントの”手続き定義”の記述方法を理解できていないわたしが疑問に思っていたのは
「手続き終了」の構文を「手続き定義開始〜手続き定義終了」の中に記述できるのかということでした。
悲しげさんの説明で大変よく理解できました。

蛇足になりますが、「桐V5ディレクトリまるごとバックアップ一括処理」を作ったとき
バッチファイルへの書き出しで以下のような構文がありました。

代入 &BATFILE="PACALL"+".BAT"
印字開始 &BATFILE
 印字 "ECHO OFF"
 印字 "BATKEY 1 バックアップしますか? [Y / N]"
 印字 "IF ERRORLEVEL 255 GOTO END"   ・・・・・(1)
 印字 "IF ERRORLEVEL 0 GOTO 圧縮"   ・・・・・(2)  
 印字 "GOTO END"
 印字 ":圧縮"
 印字 "PACALL ",&MOTO," ",&DRIVE,"\",&D,"\"
 印字 "ECHO 圧縮ファイル名を",&T,"に書き換えます"
 印字 "RENAME ",&DRIVE,"\",&D,"\",&DIR名,".LZH ",&T,".LZH"
 印字 ":END"

当たり前のことですが(1)と(2)のところを(2)(1)の順で記述すると
Nのキーを押しても圧縮を開始してしまったことがあり、
このことも要因の一つ
としてあり、説明不足の質問ではありましたが皆様にお聞きした次第です。

本当に皆様ありがとうございました。

戻る