スクリプトファイル毎にオプションを指定します。
- 構文
- OPTION 項目
- EXPLICIT
- 変数宣言の強制(すべての変数でDIM、もしくはPUBLIC宣言が必要)
- SAMESTR
- 文字比較、置換、サーチにて大文字、小文字を区別する
- OPTPUBLIC
- PUBLIC変数の重複定義を禁止する
- OPTFINALLY
- TRY-FINALLY間で強制終了が発生した時にも必ずFINALLY部を実行する
- SPECIALCHAR
- 実行時に特殊文字(<#CR>, <#DBL>, <#TAB>)の変換をしない
- SHORTCIRCUIT
- 論理演算(IF, IFB, WHILE, REPEAT)にて短絡評価をする(但しカッコ内は無効)。詳細は短絡評価を参照。
- NOSTOPHOTKEY
- 停止ホットキーは無効にする
- TOPSTOPFORM
- STOPボタンウィンドウを最前面固定する
- FIXBALLOON
- 吹き出しを仮想デスクトップの全画面に出す
- DEFAULTFONT = フォント名
- フォント, サイズを変更する(BALLOON, MSGBOX等)
- POSITION = X, Y
- 位置を変更する
- LOGPATH = ログパス名
- ログファイルのパス、ファイル名を変更する
- LOGLINES = ログ行数
- ログ最大行数を変更する
- LOGFILE = ログ出力モード
- ログファイルの出力 = 1:出力しない、2:日付を付けない、3:秒もつける、4:以前のログは削除
- DLGTITLE = タイトル
- INPUT, MSGBOX, SLCTBOXでのタイトルを変更する
- 引数
- 戻り値
スクリプトの先頭で宣言、各種設定の変更(,カンマにて項目の複数指定可)
使い方
変数宣言の強制(EXPLICIT)
変数の宣言を強制します。すべての変数でDIMまたはPUBLICでの宣言が必要になります。
UWSCでは変数の宣言を省略して変数に直接代入することができます。
- 結果
OPTION EXPLICITを宣言すると、定義されていない変数を最初に使用した箇所でエラーが発生します。以下では変数: A が定義されていませんとエラーが発生します。
大文字・小文字を区別(SAMESTR)
文字比較、置換、サーチの際に、大文字・小文字の区別をします。
大文字と小文字の区別を行わないので、Aとaは同じ文字として扱われTrueを返します。
- 結果
OPTION SAMESTRを宣言すると大文字と小文字の区別を行うので、Aとaは別の文字として扱われFalseを返します。
- 結果
以下はabcdの中からCが最初に見つかった位置を返します。大文字と小文字の区別を行わないので、最初のcの位置である3を返します。
- 結果
以下の場合は大文字と小文字の区別をするので、Cは見つからず0を返します。
- 結果
OPTION SAMESTRを使用しているときにスクリプトの一部にのみ大文字・小文字の区別をしたくない場合、比較対象の文字列をSTRCONV関数で大文字(SC_UPPERCASE)もしくは小文字(SC_LOWERCASE)のどちらかに統一させます。
以下はAとaの比較を行うプログラムで、OPTION SAMESTRの宣言で大文字・小文字を区別していますがSTRCONV関数で大文字に変換しAとAの比較になるので、Trueを返します。
- 結果
PUBLICの重複定義の禁止(OPTPUBLIC)
PUBLIC変数の重複定義を禁止します。
FINALLY部を実行(OPTFINALLY)
TRY-FINALLY間で強制終了が発生した時にも必ずFINALLY部を実行します。
通常例外処理ではTRY節を実行した後、FINALLY節が実行されます。
- 結果
TRY節に<ruby>EXITEXIT文<rt></rt></ruby>が書かれていると、FINALLY節は実行されずに終了します。
- 結果
OPTION OPTFINALLYが宣言されていると<ruby>EXITEXIT文<rt></rt></ruby>が書かれていてもFINALLY節が実行されます。
- 結果
OPTION OPTFINALLYを宣言したらFINALLY節は実行されますが、TRY節のEXITEXIT以降は実行されません。
以下の場合、TRY節2は出力されません。
- 結果
特殊文字の変換をしない(SPECIALCHAR)
実行時に特殊文字の変換を行わずに、そのまま文字列として出力します。
短絡評価をする(SHORTCIRCUIT)
論理演算で短絡評価をします。宣言を行わなかったときは完全評価をします。詳細は短絡評価を参照。
停止ホットキーを無効(NOSTOPHOTKEY)
停止ホットキーを無効にします。現在割り当てられている停止ホットキーはUWSCの設定画面、または以下のプログラムで取得できます。UWSC.INIのSETセクション-StopHotKeyの値がホットキーを表す数値です。UWSC.INIの見方はUWSC.INIを参照。
- 結果
STOPボタンウィンドウを最前面固定(TOPSTOPFORM)
STOPボタンウィンドウを最前面固定にします。
吹き出しを仮想デスクトップの全画面(FIXBALLOON)
吹き出しを仮想デスクトップの全画面に出します。
フォント, サイズを変更(DEFAULTFONT)
BALLOON関数 (スクリプト関数)、FUKIDASI関数、MSGBOX関数 (スクリプト関数)等でのフォントの設定を変更します。
位置を変更(POSITION)
ログファイルのパスを変更(LOGPATH)
<ruby>PRINT文<rt></rt></ruby>実行時に出力するログのファイルのパスを指定します。
指定したパスにファイルがなければ自動的に生成されます。
LOGPATHに指定できるのは文字列のみで、以下のようにLOGPATHに変数を使用することはできません。
ログを出力するパスに変数を使用できるよう作成した関数です。stringに出力するログ、logpathにログを出力するパス、logfileにログの出力モード、loglinesに残すログの最大行数を指定します。
以下はPRINT関数の解説です。
以前のログを削除するためのグローバル変数。メインルーチンから初めてPRINT関数が呼び出されたときのみ実行するための変数です。ログが削除されたらFALSEが代入されます。
ログを出力された日時をdatetimeに代入します。logfileの値によって日時の形式が変わります。logfileが0のときはyy/mm/dd hh:nn、1または2のときは値なし、3のときはyy/mm/dd hh:nn:ssの形式で現在の時刻を代入します。
logfileの値の第2ビット(数値を2進数にして右から3桁目の値)が1、かつ、LogDeleteFlgがTRUE(以前のログの削除をまだ行っていない)の場合、logpath内のテキストをすべて削除します。
以下はlogfileの値と4との論理演算を行ったときの例。論理演算の結果が4になるとき以前のログを削除する処理を行っています。
- 結果
datetime(日時)とstring(ログの内容)を結合した文字列をlogpathに書き込みます。書き込む内容をPRINT文で記述するとログとして書き込まれてしまうのでFUKIDASI関数でログを表示しています。
loglinesに指定された行数分のログを残す処理を行っています。現在のログの行数を取得し、まず後ろから何行分取得すれば良いかを求めます。改行を含むログが出力される可能性もあるため、単純に後ろからloglinesの値だけ取得するということはできません。
ログは行頭に日時が必ず来るため、正規表現で行頭に日時が来る行をカウントしていきcntに代入します。cntがloglinesの値と一致したとき、ループを抜けます。このときのrowの値がちょうどloglinesに一致するログの開始行となります。この行以降を取得すればloglinesに一致する分のログが取得できることになります。ループでstrにログを代入していき、最後にstrで全文書き換えを行いログを書き換えます。
loglinesに指定された数のログを取得し、strに代入していきます。
LogDeleteFlgは以前のログを削除するためのグローバル変数です。
以下はデスクトップ\UWSC.LOGにテキストと出力します。logfileが3(以前のログを残し、yy/mm/dd hh:nn:ss <ログの内容>の形式で出力)、loglinesが10(残すログの行数が10行)です。
ログの最大行数を変更(LOGLINES)
ログファイルの最大行数を変更します。デフォルトは2,000行です。
ログ出力モード(LOGFILE)
ログの出力モードを指定します。
OPTION指定の書き方は以下のとおりです。
| 数値 | 以前のログ 削除フラグ |
形式 |
|---|---|---|
| 0(デフォルト) | ○残す | yy/mm/dd hh:nn <ログの内容> |
| 1 | ○残す | (ログを出力しない) |
| 2 | ○残す | <ログの内容> |
| 3 | ○残す | yy/mm/dd hh:nn:ss <ログの内容> |
| 4 | ×削除 | yy/mm/dd hh:nn <ログの内容> |
| 5 | ×削除 | (ログを出力しない) |
| 6 | ×削除 | <ログの内容> |
| 7 | ×削除 | yy/mm/dd hh:nn:ss <ログの内容> |
| 8 | ○残す | yy/mm/dd hh:nn <ログの内容> |
| 9 | ○残す | (ログを出力しない) |
| 10 | ○残す | <ログの内容> |
| 11 | ○残す | yy/mm/dd hh:nn:ss <ログの内容> |
| 12 | ×削除 | yy/mm/dd hh:nn <ログの内容> |
| 13 | ×削除 | (ログを出力しない) |
| 14 | ×削除 | <ログの内容> |
| 15 | ×削除 | yy/mm/dd hh:nn:ss <ログの内容> |
| 16 | ○残す | yy/mm/dd hh:nn <ログの内容> |
| 17 | ○残す | (ログを出力しない) |
| 18 | ○残す | <ログの内容> |
| 19 | ○残す | yy/mm/dd hh:nn:ss <ログの内容> |
| 20 | ×削除 | yy/mm/dd hh:nn <ログの内容> |
表に示した結果から以下のような法則が成り立ちます。
数値を2進数にしたときの下位2ビットの値もしくは数値を4で割った余りでログの形式が決まります。
- 00(余り0)
- yy/mm/dd hh:nn <ログの内容>
- 01(余り1)
- ログを出力しない
- 10(余り2)
- <ログの内容>
- 11(余り3)
- yy/mm/dd hh:nn:ss <ログの内容>
下位3ビット目が1なら以前のログを削除、0なら削除しない。
以前のログはスクリプトで最初のPRINT文を実行し、 ログを出力したタイミングで削除されます。5,13は×削除ですが、ログが出力されないので以前のログは残ります。
ダイアログのタイトル変更(DLGTITLE)
ダイアログのタイトル変更
短絡評価
短絡評価とは、ANDやORといった論理演算子において左辺を評価した時点で全体の真偽値が確定し右辺を評価する必要がない場合、右辺の評価をしないのが短絡評価です。一方で左辺・右辺ともに評価を行うのは完全評価といいます。
例えば、論理積(AND)の左辺を評価した結果がFALSEの場合、全体の評価はFALSEになるし、論理和(OR)の左辺を評価した結果がTRUEの場合、全体の評価はTRUEになります。
まず論理積(AND)の場合、左辺の評価がTRUEのときは右辺の評価もしなければならないが、左辺の評価がFALSEのときは右辺の評価に関わらず結果は必ずFALSEとなります。そのため左辺がFALSEの時点で右辺の評価はスキップします。
- TRUE AND TRUE → TRUE
- TRUE AND FALSE → FALSE
- FALSE AND TRUE → FALSE
- FALSE AND FALSE → FALSE
このような場合、右辺の結果は問わないので評価をスキップします。赤字の式は評価されずスキップします。
次に論理和(OR)の場合、左辺の評価がFALSEの場合右辺の評価しなければならないが、左辺の評価がTRUEのときは右辺の評価に関わらず結果は必ずTRUEになります。そのため左辺がTRUEの時点で右辺の評価はスキップします。
- TRUE OR TRUE → TRUE
- TRUE OR FALSE → TRUE
- FALSE OR TRUE → TRUE
- FALSE OR FALSE → FALSE
論理積のときと同様に赤字の処理はスキップされます。
そのため軽い処理を左辺、重い処理を右辺に持ってくると右辺が省略されるときは無駄な処理をせずに済みます。
左辺は必ず実行されるので、省略されては困る式を左辺に持ってくる書き方もありです。
以下の例ではOPTION SHORTCIRCUITの記述があるとORの左辺がTRUEなので右辺の処理を実行せずFalseを返し、記述がないと右辺も実行するのでTrueを返します。
- 結果
- 結果
論理積・論理和を使った擬似的なIF文
論理積
論理積の場合左辺がTRUEでないと右辺は実行されないので、
と等価とみなすことができます。左辺が条件式、右辺が真のときの処理となる。
論理和
論理和の場合左辺がFALSEでないと右辺は実行されないので、
と等価とみなすことができます。左辺の条件式が偽のとき右辺の処理が実行されます。
論理演算子が複数あるとき
論理演算子が複数あるときも1つのときと同様に左から順に評価していきます。
論理積(AND)の場合、初めてFALSEを返した次以降の処理をスキップします。赤字がスキップされる処理です。
- FALSE AND FALSE AND FALSE → FALSE
- FALSE AND FALSE AND TRUE → FALSE
- FALSE AND TRUE AND FALSE → FALSE
- FALSE AND TRUE AND TRUE → FALSE
- TRUE AND FALSE AND FALSE → FALSE
- TRUE AND FALSE AND TRUE → FALSE
- TRUE AND TRUE AND FALSE → FALSE
- TRUE AND TRUE AND TRUE → TRUE
論理和(OR)の場合、初めてTRUEを返した次以降の処理をスキップします。赤字がスキップされる処理です。
- FALSE OR FALSE OR FALSE→FALSE
- FALSE OR FALSE OR TRUE→TRUE
- FALSE OR TRUE OR FALSE→TRUE
- FALSE OR TRUE OR TRUE→TRUE
- TRUE OR FALSE OR FALSE→TRUE
- TRUE OR FALSE OR TRUE→TRUE
- TRUE OR TRUE OR FALSE→TRUE
- TRUE OR TRUE OR TRUE→TRUE
注意点
短絡評価は場合によって右辺の式スキップされるため、その式に関係する処理を行う場合注意が必要です。
短絡評価の例
以下は完全評価のため、fa、fbともに呼び出されます。
- 結果
以下は短絡評価で、まずfaを実行しTRUEを返したため、fbも実行されます。
- 結果
まずfaが実行されFALSEを返しこの時点でこの論理積の評価がFALSEと確定したので、fbは実行されません。
- 結果
以下は完全評価で、fa、fbともに呼び出されます。
- 結果
以下は短絡評価で、まずfaが実行されTRUEを返しこの時点でこの論理和の評価がTRUEと確定したので、fbは実行されません。
- 結果
以下は短絡評価で、まずfaを実行しFALSEを返したため、fbも実行されます。
- 結果
