menu-switch resultについてNo.00126
となりのニャンコ さん 98/11/09 16:24
 
よこしまさん かずやさん こんにちは となりのニャンコです
以前に質問したいと言いましたが質問内容を考えているうちに出来てしまいました。
お聞きしたかったことは、getline コマンドについてでした。どうしても動かなかっ
たので質問したかったわけですが、動いたので別の質問をしたいと思います。

「電報」という機能をご存じでしょうか
TALK と入力すると、現在通話中の会員さんのID一覧が表示されます。
ID           NAME  
aaa00000     となりのニャンコ
bbb11111     うちの三毛
******

次に相手のIDを入力して
1行だけメッセージを送るというものです。
できあがったスクリプトは以下のとうりです。

Talk:
chat off
chat on
send "TALK" + "^M"
wait "ID"
timeout 1
##dc = 0

beginloop
getline #talk[##dc]
if(timeout)goto Denmenu
##dc = ##dc + 1
endloop

Denmenu:
##sa=1
beginloop
##sa=##sa+1
if(part(#talk[##sa],0,6)=="******")##mc=##sa
if(##sa >= ##dc)breakloop
endloop

Dencount:
#talk[##mc]=""
##mc=##mc+1
if(##mc==21)goto Denmenugo
goto Dencount

Denmenugo:
menu"全員に送る","確定(このメニューを終了)","キャンセル",\
#talk[1],#talk[2],#talk[3],#talk[4],#talk[5]
timeout 0
##me=1
switch result
case 0
     send "all" + "^M"
     goto Dennuuryoku
case 1
     getchat #chat
     send #chat + "^M"
     goto Dennuuryoku
case 2
     chat off
     chat on
     send "^M"
     goto Dennuuryoku
case 3
     getchat #chat
     setchat #chat + part(#talk[1],0,9)
case 4
     getchat #chat
     setchat #chat + part(#talk[2],0,9)
case 5
     getchat #chat
     setchat #chat + part(#talk[3],0,9)
case 6
     getchat #chat
     setchat #chat + part(#talk[4],0,9)
case 7
     getchat #chat
     setchat #chat + part(#talk[5],0,9)
case -1
     goto Dennuuryoku
endswitch
goto Denmenugo
Dennuuryoku:

     wait "メッセージを入力して下さい:"
    chat off
    chat on
    ime on

     wait "よろしいですか[Y/n]"
     send "Y" + "^M"

     ime off
     exit

ここでは5人しか対応していませんが
実際のものは、かなりの余裕をつけて30人としてあります。
case 3  から case 7
の部分ですがこれだと5人だからたいしたことないのですが
30人だとどうなるかわかるでしょ
どうにかなりますか。

あっそうそう、getline  コマンドのタイムアウト時間の目安も教えて下さい。

[ ]
RE:00126 menu-switch resultについてNo.00127
よこしま さん 98/11/09 23:52
 
こんにちは、となりのニャンコさん。

>menu"全員に送る","確定(このメニューを終了)","キャンセル",\
>#talk[1],#talk[2],#talk[3],#talk[4],#talk[5]
>timeout 0
>##me=1
>switch result
>case 0
>     send "all" + "^M"
>     goto Dennuuryoku
>case 1
>     getchat #chat
>     send #chat + "^M"
>     goto Dennuuryoku
>case 2
>     chat off
>     chat on
>     send "^M"
>     goto Dennuuryoku
>case 3
>     getchat #chat
>     setchat #chat + part(#talk[1],0,9)
>case 4
>     getchat #chat
>     setchat #chat + part(#talk[2],0,9)
>case 5
>     getchat #chat
>     setchat #chat + part(#talk[3],0,9)
>case 6
>     getchat #chat
>     setchat #chat + part(#talk[4],0,9)
>case 7
>     getchat #chat
>     setchat #chat + part(#talk[5],0,9)
>case -1
>     goto Dennuuryoku
>endswitch
>goto Denmenugo
>Dennuuryoku:

>ここでは5人しか対応していませんが
>実際のものは、かなりの余裕をつけて30人としてあります。
>case 3  から case 7
>の部分ですがこれだと5人だからたいしたことないのですが
>30人だとどうなるかわかるでしょ
>どうにかなりますか。

メニューの項目の個数が事前に決まっていない場合は

menu ではなく, addmenu - showmenu
を使います.

また case は default というのを使います.



--------

##x = result + 1

switch ##x

        case 0
                exit
        case 1
                処理
        case 2
                処理
        case defalt
                message #talk[##x+1]
endswitch

----------

みたいな感じです.


>あっそうそう、getline  コマンドのタイムアウト時間の目安も教えて下さい。

getline は以外と処理が難しいのでなるべく使わない方が
無難です.

readbuffer を使いのがいいでしょう.

よこしま

Send 98/11/09


[ ]
RE:00126 menu-switch resultについてNo.00131
かずや さん 98/11/10 08:46
 
>以前に質問したいと言いましたが質問内容を考えているうちに出来てしまいました。
良かったよかった(*^-^*)

>「電報」という機能をご存じでしょうか
>TALK と入力すると、現在通話中の会員さんのID一覧が表示されます。
ニフティのサービスでしょうか?
σ(^-^)はBIGLOBE(PC−VAN)しか
使っていないのでその他のことを聞かれてもわかりません(^-^;

>30人だとどうなるかわかるでしょ
>どうにかなりますか。
まあ、方法はいろいろありますね
て言うか、σ(^-^)が紹介するのは2パターンだけ(^-^;(笑)

▼IF文
switch文もif文も同じ条件分岐だから
そのままそっくり if文に書き換えればいいんじゃないですか?
ちなみに menu文はaddmenu文を使えばloop系と併用できます
例:
addmenu "メニュー0"
addmenu 0
##a = 0
beginloop
  ##a = ##a+1
  addmenu "メニュー"+##a
  if(##a > 30) breakloop
endlop
addmenu 0
addmenu "キャンセル"
shoemenu
if(result == -1)
  message "メニュー以外"
elseif(result == 0)
  message "メニュー0を選択"
elseif(result == 31)
  message "キャンセルしました"
else
  message "メニュー"+result+"を選択"
endif

▼SWITCH文
実はswitch文でも、不定条件を扱えます。ただし、裏技的(^-^;
menu文は↑と同じく addmenu文を使うとして・・・
こちらは裏技的なので、十分テストしてください(^-^;
例:
switch result
case -1
  message "メニュー以外"
case 0
  message "メニュー0を選択"
case 31
  message "キャンセルしました"
case result > 0 and result <= 30
  message "メニュー"+result+"を選択"
endswitch

こっちを使うなら、よこしまさんが紹介したやり方の方がいいかも(^-^;
判定対象も1個だけだし(^-^;

>あっそうそう、getline  コマンドのタイムアウト時間の目安も教えて下さい。
σ(^-^)も wait文かreadbuffer文をおすすめします
getline文については他の人に任せます(^-^;

[ ]
RE:00131 menu-switch resultについてNo.00132
となりのニャンコ さん 98/11/13 23:39
 
よこしまさん かずやさん
readbufferコマンドを教えていただきありがとうございました。
このコマンドすごいですね。
126番の電報スクリプトは、readbufferコマンドに書き換えました。
getlineのタイムアウト時間が1秒だったのでメニューが1秒早く現れるように
なりました。これだけだとたいしたことないんですけど、
 readbufferコマンドを使うと、ログカッターまで出来ちゃうんですもんね。
おかげさまで大幅なバージョンアップになりました。

>>「電報」という機能をご存じでしょうか
>>TALK と入力すると、現在通話中の会員さんのID一覧が表示されます。
>ニフティのサービスでしょうか?
>σ(^-^)はBIGLOBE(PC−VAN)しか
>使っていないのでその他のことを聞かれてもわかりません(^-^;
ニャンコはフェリシモオンラインです。

結局質問したmenu-switch resultの方は理解しきれずに再配布を迎えてしまい
ました。次回の更新の時までによく読んでおきますね。
 readbufferコマンドに、はまってしまってレスを書くのも遅れてしまいました。
ログカッターといっても、オンラインで動いて、会議室ごとのテキストファイルを
作成、上書き(というか後ろ書き)していくものですけど、オンラインで動くから
接続時間の無駄といわれてしまえば返す言葉もありませんけどね。まあ2〜3秒、
うーん3日もあいちゃうと20秒ぐらいかな
 出来たとたんに、ホストの変更があって、menu-switch resultまでは手が回らな
かったわけです。
 ついでにこれでやっとddewaitadviceともお別れです。
101番のchdir - restoredirコマンドもこの際と思って使いました。今後のため
には早いうちに更新しておいた方が、とまどう人が少ないですからね。

[ ]
RE:00132 menu-switch resultについてNo.00133
かずや さん 98/11/14 05:05
 
>ニャンコはフェリシモオンラインです。
・・・?(^-^;

>今後のためには早いうちに更新しておいた方が、とまどう人が少ないですからね。
そういうことですね(*^-^*)
ヴァージョンアップして困るなんて言う人はないと思いますから(笑)
今後のことも考えるなら、機能の追加&修正をしやすい形に
作っていくのが良いと思います。

[ ]