[ 新規に投稿する ]

メニューマクロ経由の挿入マクロの不具合No.08522
でがらし さん 17/06/29 23:53 [ コメントを投稿する ]
   下記のようなメニュー型の挿入マクロを使っています。Aを押すとファイルが挿入されますが、BとCを押しても、ファイルが挿入されません。どこか、悪いところがあるでしょうか?

 BとCを単独のマクロにすると、ちゃんとファイルが挿入されます。

 秀丸は8.71です。Windows8.1です。

---------------------------------------
menu
"&A 2",
"&B 3",
"&C 4";

 if      (result ==0) endmacro;
 else if (result ==1)
insertfile "c:\\frame.002";
gofiletop;
//A
 else if (result ==2)
insertfile "c:\\frame.003";
gofiletop;
//B
 else if (result ==3)
insertfile "c:\\frame.004";
gofiletop;
//C
endmacro;
---------------------------------------
[ ]
RE:08522 メニューマクロ経由の挿入マクロの不具合No.08523
Iranoan さん 17/06/30 00:53 [ コメントを投稿する ]
  でがらしさん今日は、Iranoan です
>  下記のようなメニュー型の挿入マクロを使っています。Aを押すとファイルが挿入
> されますが、BとCを押しても、ファイルが挿入されません。どこか、悪いところがあ
> るでしょうか?
<snip>
> menu
> "&A 2",
> "&B 3",
> "&C 4";
で B, C を選択すると、result は 2, 3 のどちらかになりますが、
>  if      (result ==0) endmacro;
>  else if (result ==1)
の判定後、その判定とは無関係に
> gofiletop;
が実行されます。そして通常これは失敗しないので、result は 1 に書き換わります。
その為、
>  else if (result ==2)
は不成立になりますから
> insertfile "c:\\frame.003";
は実行されません。

理由は if など条件判定をした時に実行したい内容は、ブロックにする、{}
で挟んでやる必要が有ります。
>  if      (result ==0) endmacro;
のようなケースは、実行したい内容が 1 つなので、ブロックにしてやる必要がありませ
んが、これは例外です。
2 つ以上なら、、
else if (result ==1){
  insertfile "c:\\frame.002";
  gofiletop;
}
といった要領です。

今回のマクロは、条件によって変わるのは、挿入するファイルだけのようなので、次の
ようにすれば、スッキリすると思います。
----------------------------------------------------------------------
menu
"&A 2",
"&B 3",
"&C 4";

if      (result ==0) endmacro;
else if (result ==1) insertfile "c:\\frame.002";
else if (result ==2) insertfile "c:\\frame.003";
else if (result ==3) insertfile "c:\\frame.004";
gofiletop;
endmacro;
[ ]
RE:08523 メニューマクロ経由の挿入マクロの不具合No.08524
でがらし さん 17/06/30 21:11 [ コメントを投稿する ]
  Iranoanさん

 これは大事なご教示、ありがとうございます。いろいろな方のマクロを参考に自作したマクロがありますが、その中に、else if の後に、{}を入れたものと入れていないものがありました。

 どなたかの作であれ、自作であれ、{}が入っているマクロを見て、なんのためにそれが入っているのか、考えることがありましたが、入れていないマクロも不都合を感じなかったので、そのまま、放置していました。ようやく、{}の理由がわかりました。

 他のマクロでときどき起こるトラブルも、これに起因するものがあるかもしれません。折を見て、見直してみます。お礼まで申し上げます。
[ ]
RE:08523 メニューマクロ経由の挿入マクロの不具合No.08525
colder さん 17/07/01 02:45 [ コメントを投稿する ]
  colderです。
Iranoanこんにちは。補足です。
>> menu
>> "&A 2",
>> "&B 3",
>> "&C 4";
>で B, C を選択すると、result は 2, 3 のどちらかになりますが、
>>  if      (result ==0) endmacro;
>>  else if (result ==1)
>の判定後、その判定とは無関係に
>> gofiletop;
>が実行されます。そして通常これは失敗しないので、result は 1 に書き換わります。
>その為、
>>  else if (result ==2)
>は不成立になりますから
>> insertfile "c:\\frame.003";
>は実行されません。

resultが1に書き換わるかどうかは実はあまり関係ないです。
ifとelseの間にブロックじゃない文が複数合った場合、そのelseは前のifとは全く無関係と見なしてマクロは実行されます。
そしてifと無関係のelseが現れた場合、その部分は単に無視されます。
http://hidemaruo.dip.jp:81/turukame/turukame_3/x0903079.html#3079

その結果、else if (result ==2) は判定さえも行われません。
[ ]
RE:08525 メニューマクロ経由の挿入マクロの不具合No.08526
Iranoan さん 17/07/01 11:11 [ コメントを投稿する ]
  colderさん今日は、Iranoan です
> そしてifと無関係のelseが現れた場合、その部分は単に無視されます。
> http://hidemaruo.dip.jp:81/turukame/turukame_3/x0903079.html#3079
そっちか(^_^;;
[ ]
RE:08525 メニューマクロ経由の挿入マクロの不具合No.08527
でがらし さん 17/07/11 21:54 [ コメントを投稿する ]
   colderさん、こんばんわ。
 今日になってコメントをちょうだいしていることに気付きました。勉強になりました。ありがとうございました。
[ ]

[ 新規に投稿する ]