MortScript icon

MortScript まとめ&マニュアル要訳

by MortScriptスレの1

11/14/09 更新  2スレ目のdatをUPしました。

業務連絡はこちらへ。
スクリプティングに関する個別の質問などには対応出来ませんので、MortScriptスレへどうぞ。

リンク集




マニュアル v4.2 要訳 もくじ



マニュアル v4.2 要訳

MortScript v4.2 (Release) Manual
© 2007 Mirko Schenk Germany
mort@sto-helit.de
http://www.sto-helit.de

Translated by a discussion-forum-handle 'Takahara'

「※」は訳注です。旧シンタックスや旧拡張子に関する記述は割愛してあります。
訳者の環境は、W-ZERO3 WS003SH / Windows Mobile 5 です。



1 MortScriptとは?/ライセンス


・MortScriptはスクリプトのインタープリタなので、mortscript.exeを起動しても、それ自体が何かを行ったり、目に見えるウィンドウなどが立ち上がるわけではありません (.mscr拡張子の関連付けは行いますが、cabインストーラを使用すれば、それも必要ありません。 - 「3 インストール」を参照)。
・MortScriptは、システムや他のプログラムを一括コントロールすることに焦点を置いたスクリプト言語なので、基本的なダイアログのみ利用可能です。
・既成の.mscrファイルをダウンロードするか、テキストエディタで自分で書いて使用して下さい(「4.1 スクリプトを作って実行する」を参照)。(※日本語文字列も使用可能です。)
・他のアプリ同様、.mscrファイルをファイルエクスプローラで開くか、ショートカットを作成して起動して下さい。
・このプログラムを使用したことによって生ずるいかなる損害をも、作者は補償いたしません。
・MortScriptはフリーウェアですが、小額の(もしくは多額の^^)寄付を歓迎いたします。(「11 寄付」参照)
・MortScript.exe のソースコードはご希望により配付可能(サブバージョン保管庫より)(※こちらの "Betas, Sources, Nominations (08/08/2007, 11:34 AM)"を参照)ですが、GPL等とは異なり、ユーザが改変して自分版を作成することは許可しておりません。「このスクリプトにはどこどこのなんとかScriptインタープリタが必要です」的混乱を避けるためです。

・MortScriptを利用者独自のスクリプトと共に再配布しても構いませんし、スクリプトを商業利用しても構いません(スクリプトのソースコードも公開されることになりますが)が、MortScriptは第三者が権利を持つ旨を明記してください。「MortScriptはフリーウェアです。www.sto-helit.de 」など。

2 できること


・アプリケーションの起動、終了、前面に出す、隠す
・あるウィンドウがアクティブになるまで待機する
・キーストロークやマウスクリックをウィンドウに送る
・ファイルのコピー、消去、ファイル名の変更、ショートカットの作成
・ディレクトリの作成、消去
・ZIPファイルの取り扱い(中身の上書きはできません!)
・テキストファイルの読み込み、書き込み
・レジストリの読み込み、変更
・インターネット上のテキストファイルの読み込み、インターネットからのダウンロード、インターネット接続、切断
・"If"条件指定、"Choice"選択、"For" "ForEach" "While" "Repeat"ループ
・いくつかのシステム制御(画面の回転、ボリュームやバックライトのコントロール、ソフトリセットなど)
・サブルーチン関数、ローカル変数、マルチレベル配列など…


3 インストール


3.1 プラットフォーム別MortScript

・MortScriptは、PC、Pocket PC、WM搭載のスマートフォン、PNAで利用可能です。デバイスによって使用可能な機能が異なります。機能使用の可能不可能については、当マニュアル上に明記しておきます。

・ダウンロード用.zipファイルには全ての版が含まれていますので、ご使用のシステム用のものを選んで、以下のいずれかの方法でインストールして下さい。使用中のMortScriptの版をチェックすることも出来ます(「9.28.2 MortScript の"版"を取得する(MortScriptType)」を参照)。略称は、以下のとおり。

PC = Windows XP/Vista PC
PPC = Pocket PC
SP = スマートフォン
PNA = ナビゲーション機器

3.2 PC用セットアップ実行ファイル

・exeフォルダの中の MortScript-4.2-システム名.exe を起動し、指示に従って下さい。

3.3 CABファイル

・このインストール形式は Windows Mobile のみ利用可能なので、PC版にCABファイルはありません。
・cabフォルダの中の MortScript-4.2-システム名.cab をモバイルデバイスにコピーし、起動して下さい。

3.4 バイナリファイル

・binフォルダの中のシステム名フォルダを、デバイス上の任意のディレクトリ(¥Program Files¥MortScriptなど)にコピーして下さい。MortScript.exeを起動すると、.mscr拡張子のMortScript.exe関連付けを行います。


4 基本的な使い方


4.1 スクリプトを作って実行する

・MortScriptは拡張子 ".mscr"のファイルを実行します。

・.mscrファイルは、テキストエディタで記述してください。エディタが複数のフォーマットをサポートしている場合は、"ANSI"を使用して下さい。v4.1以降、適当な識別コード付きの Unicode ファイルも利用可能(「9.13.1 テキストファイルを読み込む(ReadFile)」を参照)ですが、下位互換性の為にはANSIを推奨します。

・"¥Windows¥スタート メニュー"や"¥Windows¥スタートアップ"などのディレクトリにショートカットを作成して使用できます。


4.2 MortScript.exeのパラメータ(引数)

・MortScript.exeの取る引数は、スクリプトファイルのフルパスです。パス上にスペースが含まれている場合は、パスをダブルクウォートで囲んで下さい。(例:"¥full path¥to¥myscript.mscr")

・PPC版は、オプション引数 /wait=秒数 を取ります。この引数を指定すると、MortScriptは与えられた秒数だけ、スクリプトファイルの存在確認を待機します。このオプションが有効なのは、(※スクリプトファイルがストレージカードに保存されている場合、)スタンバイから起きてからストレージカードを認識するまでに時間がかかるからです。たとえば、(※ストレージカード上の)スクリプトをボタンに割り当て、そのボタンを押してスタンバイ状態から起きるような場合、スクリプトファイルを開く事ができない不具合が起こり得ます。デフォルトの待機時間は、5秒。
※W-ZERO3 WS003SHで実験してみると、/wait オプションをどのように設定してもしなくても、ストレージカード上のスクリプトは、スタンバイから起きて約10秒後に実行されるようです。

・"変数名=" の形式で引数を設定すれば、スクリプト内の変数として渡されます。

例: 引数:test="This is a test"
  スクリプト:Message( test )
 →「This is a test」というダイアログを表示。

※複数の変数が渡せるようです。例:x=1 y=2

※すべての引数は、スクリプトファイルにではなく、MortScript.exeに対して渡します。ショートカットの記述としては…
 × "¥Program Files¥MortScript¥myscript.mscr" name=value
 ○ "¥Program Files¥MortScript¥MortScript.exe" "¥Program Files¥MortScript¥myscript.mscr" name=value

・引数で渡される変数はグローバルなので、ローカル変数を使用中の場合は、Global( ... ) コマンドを使って除外する必要があるかも知れません。「7.5.2 変数のスコープ」を参照。


4.3 多重起動とスクリプトの中止

・MortScriptは複数のスクリプトを走らせることができますが、ひとつのスクリプトについては一度のみ可能です。もし a.mscr が走っている最中にもう一度 a.mscr を走らせようとすると、 a.mscr のオープン・ダイアログ(Choice, Message など)がアクティブになります。もしそのスクリプトがウィンドウを開いていなければ、何も起こりません。

・走っている最中のスクリプトを強制停止させたい場合、ScriptProcExists と KillScript が使用可能。詳しくは 「9.22.7 起動中のスクリプトの停止(KillScript)」を参照。


5 追加ツール


5.1 ストレージカードが抜き差しされたときにスクリプトを実行

AutoRun.exe を使用して、WMのautorun機能を利用できます。

・ストレージカードが抜き差しされたとき、Windowsは(※ストレージカードのルートディレクトリにある)"2577"フォルダ(ARMプロセッサ用のCEコード)、あるいは"0"フォルダの中にある"autorun.exe"を実行します。
例: ¥miniSD Card¥2577¥autorun.exe

・この機能は全てのデバイスでサポートしているわけではありません。たとえば、HP iPAQ2210ではこの機能の対応を停止した模様。また、PNAやPCでは動きませんので、これらの機器ではAutoRun.exeは、下記の「ダミー実行ファイル」としてのみ役立ちます。

・AutoRun.exe, MortScript.exe をAutoRun.mscr と AutoExit.mscrの両方/どちらかとともに上記のフォルダにコピーしておけば、ストレージカードが挿入された時にAutoRun.mscrが、取り外された時にAutoExit.mscrが、実行されます。


5.2 「ダミー実行ファイル」

・AutoRun.exe の名前を変更すると、同じ名前の.mscrファイルを実行します。
例:AutoRun.exeのファイル名をmyscript.exeに変更して起動
 →myscript.mscrを実行
myscript.exeとmyscript.mscrは同じディレクトリになければなりません。

・この機能は、.mscrファイルを直接実行できない環境(PhoneEditionデバイス用 phone profile tool など)において便利です。

※しかしmyscript.exeにも直接引数は渡せないようです。

・もしMortScript.exeも同じディレクトリにあった場合はそのMortScript.exeが起動され、同じディレクトリに無い場合は当初インストールされたMortScript.exeが起動します。


5.3 CABインストール時のスクリプト実行 (setup.dll)

・setup.dll はPocket PCのみで利用可能です。これは、CABファイルを使ったインストールの直後とプログラム削除の直前に、自動的にスクリプトを実行するためのものです。開発者が独自のsetup DLLファイルを制作する手間を省きます。CABファイルに関してちんぷんかんぷんな方は、この章を読み飛ばして下さい。^^

・setup.dllをアクティブにするには、CABファイル用setup DLLとしてこれを設定する必要があります。MicrosoftのCABウィザードを使う場合は.iniファイルに CESetupDLL = "setup.dll" と記述します。他のツールを使用する場合は、メニューエントリーやオプションが利用できるはずです。

・CABインストールの際のデフォルトディレクトリに、MortScript.exeと、−もしZIPアーカイヴを使用するなら− mortzip.dll を置く必要があります。インストール直後に実行される install.mscr と、プログラム削除直前に実行される uninstall.mscr についても同様です。両.mscr は省略可能ですが、どちらか一方でも無ければ、setup.dll は何も行わないことになります。


6 重要な全般的事項


6.1 用語

・定数(値) Constant :固定された値。「100」のような数値、あるいは「Test」のような文字列

・変数 Variable :値の代入される指定文字列
   例…"x = 5" ("5" が変数"x"に代入される)
   "Message( x )" (変数 "x" に代入された値「5」が表示される)

・式 Expression :変数、定数、関数、演算子の組合わさったもの。単一の値を返す。

・代入 Assignment :「変数名=」の形で、値を変数にセットすること。

・引数 Parameter :コマンドや関数に渡される式の戻り値

・コマンド Command :値を返さない命令。MouseClick()、Message()など。

・関数 Function :値を返す命令。SubStr()など。式の右辺のみに使用可能。

・制御構造 Control structure :スクリプトの過程を変更する為の命令。If()、Choice()など。


6.2 当マニュアルでの文法スタイル

一応(E)BNFに則っています。

太字:固定された値、コマンド名、関数名など。

斜体:変数、式など

・[…]:省略可能なオプション(省略時には通常、デフォルト値が使用される)

・{…}:繰り返し、あるいは省略可能

・x|y|z:「x あるいは y あるいは z」

・(…):グループ化("|"オプションを明確にするためなどに使用)

・太字で書かれた文字は、そのとおりに記述されなければならないことを示します。

・一般的は、下記のように記述します。

コマンド [ ( {, } ) ]

  あるいは

変数 = 関数( [ {, } ] )

 関数呼出しだけの記述も、式の一種と言えます。式についての詳細は、「7 使用可能な引数と代入」を参照。

・引数を取らないいくつかのコマンドは、()を省略可能です。
 ○ RedrawToday   ○ RedrawToday()
 ですが、関数呼出しの場合は、そうは行きません!式の中において、()はその直前にある文字列が関数名であることを明示しており、()が無ければ変数名であると判断するからです。


6.3 スペース、タブ、改行

・スペースとタブは、各要素(コマンド/関数名、括弧、値、演算子など)の前、途中、後などいかなる場所にも使用可能です。クォートされた文字列中のスペースやタブは、その文字列の一部と判断され、クォートされていない場合は無視されます。

・ある命令行中の改行は、行の最後に"¥"を付けることによって可能。下の行は上の行に連結、継続されます。"¥" による連結は同一行の中でも可能。"¥"の前後にあるスペース、タブ、そして改行コードそのものも、単一のスペースに置き換えられます。

例:

Message( "This is ¥
     a test" )


→「This is a test」というメッセージを表示します。

文字列中の改行は「^NL^」として記述しなければなりません。「7.3 固定文字列」を参照。

6.4 大文字小文字の区別

・コマンドとファイル名は大文字小文字を区別しませんが、ウィンドウ名は区別します。大文字小文字が正しく記述されている場合は、ウィンドウ名の一部を記述するだけで、マッチするウィンドウを指定できます。
例:× Show( "WORD" )
  ○ Show( "Word" ) → "Pocket Word"、あるいは"Word"をタイトルの一部に持つ最初のウィンドウがアクティブになります。


6.5 ディレクトリとファイル

・ディレクトリ(フォルダ)とファイル名は、常にフルパスで指定します(例: "¥path¥to¥file.ext" あるいは "some¥directory" など)。Windows Mobileには「現在のディレクトリ」という概念が無く、デスクトップ機でパスを省略すると期待どおりの動作を行なわないからです。

・パスが省略された場合、MortScriptは現在走行中のスクリプトが存在するディレクトリパスを追加して理解します。が、これはMortScriptがファイル内容にアクセスする場合のみで、システムオペレーションを行なう場合には無効です。
例えば… ReadFile, WriteFile, ReadIni, WriteIni, ForEach IniSections/IniKeys, CallScript(Function) は相対パス指定でも機能しますが、Copy, Move, Rename, 全てのZIP操作などでは機能しません。
要するに、スクリプトのディレクトリにあるファイルを読んだり書いたりする場合以外は、常にフルパスを指定する必要がある、ということです。

・Windows Mobileはパス中の「.」「..」といった記述をサポートしていませんので、これらの方法で上位ディレクトリにアクセスすることは出来ません。スクリプトディレクトリパスの補完結果や「SystemPath」の利用などで得られたパスが「¥some¥path¥..¥file.txt」のような形であった場合も同様です。


6.6 コメント

・各行の頭に"#"を挿入することにより、コメントアウトが可能です。"#"の前にスペースがあっても構いません。
・INIファイルでは、各行の頭に";"を挿入することにより、コメントアウトが可能です(通常のINIファイルと同様)。



7 パラメータ(引数)と代入


7.1 式

・全ての関数、コマンドとその引数、制御構造の条件、等号によって代入された値は、「式」です。式は下記のような部分から成り立ちます。

固定文字列:"Text" など

固定数値:42 など

変数:x など

関数: SubStr( 引数 ) など

演算子: +, -, & など。定数、変数の値、関数の戻り値などの結合方法を定義するもの。

・こう書くと難解めいてしまいますが、実際はもっと簡単です。以下の例を見ればわかりやすいでしょう。

Message( "Hallo" ) ※原文ママ。ドイツの人はこう綴るらしいです。
→"Message"コマンドが固定文字列"Hallo!"を引数として呼び出されます。

Sleep( 500 )
→"Sleep"コマンドが固定数値"500"を引数として呼び出されます。

Sleep( pause * 100 )
→この場合、変数"pause"の値が固定数値"100"と、演算子"*"(乗算)によって結合されます。

Message( "Battery level: " & BatteryPercentage() & "%" )
→ふたつの固定文字列が関数"BatteryPercentage()"の戻り値を挟んで連結され、"Message"の引数として渡されます。

message = "Battery level: " & BatteryPercentage() & "%"
→前の式に似ていますが、戻り値はコマンドの引数ではなく、変数"message"に代入されます。

If ( BatteryPercentage() > 20 )
    # 命令文
EndIf

→条件文としての式。

・定数と変数の記述の仕方と、使用可能な演算子についての詳細は、以下の章を参照。使用可能な関数については、「9 コマンドと関数」を参照。


7.2 データ型

・MortScriptには「型の宣言」は無いので、たとえば変数「x」に数値のみを格納するように指示したり、変数「str」に文字列のみを格納するように指示したりすることは出来ません。数値と文字列は区別されますが、必要に応じて相互に自動的に変換されます。
・比較演算子の使用時など、限られた場合のみ、データ型が考慮されます。
・ある値が数と判断されるか文字列と判断されるかは、文脈によります。

・数の演算式においては、値は数として認識されます。つまり、「"5" + "10"」は「15」を返します。もし文字列が有効な数字を持たない場合は、「0」を返します。

・いっぽう、テキスト演算子(文字列連結を行う"&"など)が使われる文脈では、数字は文字列として扱われます。つまり、「5 & 10」は「510」を返します。

・これは引数においても同様です。通常は、引数の意味はそれが数として使われるか文字列として使われるかによって判断されます。例えば、テキストアウトプットは文字列であり、タイムスパンは数です。

・条件文と「オン/オフ」引数には、次のようなルールがあります:
その値が「0」以外の有効な値を取る場合は、「条件は満たされた/オン」となり、そうでなければ「条件は満たされなかった/オフ」ということになります。
例:5、"10"、1=1 → 「真/オン」 0、"x"、2=1 → 「偽/オフ」

・文字列が小数点を含む場合は、小数値に変換され、さらに整数が求められる文脈では、小数値は四捨五入されます。例えば、「SleepMessage( "4.5", "Waiting...", "Wait")」は、5秒待機します。

・小数値が文字列に変換される場合(Message()コマンドなど)には、デフォルトで6桁に整形されます。このデフォルト値を修正したい場合は、Format()関数を使用して下さい。


7.3 固定文字列

・固定文字列はダブルクォート(")で囲まれていなければなりません。

・クォートされた文字列の中でクォート記号を使うには、二重("")にします。

Message( "He said: ""This is a test""" )
→「He said: "This is a test"」というメッセージを表示します。

・以下の文字列は、特殊文字に置き換えられます。

^CR^ → キャリッジ・リターン (※Macの改行コード)
^LF^ → ライン・フィード (※Unixの改行コード)
^NL^ → ニュー・ライン Windows/DOSの改行コード。CR+LF
^TAB^ → タブ

・Windowsでの改行コードは^NL^ (= ^CR^^LF^) ですが、Unixのコード ^LF^ が使われている例もあります。


7.4 固定数

・数は単に、x = 5.4321 、 Sleep( 20 ) のように記述します。浮動小数値の演算を行ないたい場合は、小数点を使用しなければなりません(「1」ではなく「1.」など)。


7.5 変数

・変数は、代入された値を格納します。

・式の全体のなかで、定数(123、"string"など)でも演算子(+、-、&など)でも関数(括弧付きのもの)でもないものは、全て変数名として認識されます。

・変数名として使える文字は、アルファベット(ウムラウトやアクセント等の付かないもの!)、数字、アンダーバー(_)です。変数名には大文字小文字の区別はありません。MYVARIABLE と myvariable は区別されません。

・変数名の先頭の文字は、数字であってはいけません。数字は、式の中で固定数として認識されるからです。「9mod2」は、演算式「9 mod 2」として認識され、変数名としては認識されません。

・変数への代入は、「=」によって行います。
myvar = 5 * x + y

・コマンドと制御構造の中には、変数に値の代入を行うものがあります。GetTime 、ForEach など。

・変数を式の中で使用するには、単に変数名を上の例のように記述します。


7.5.1 定義済み変数

・読み易い命令文のため、いくつかの変数はあらかじめ定義されています。他のスクリプト言語(※の特殊変数)と異なり、これらの変数の値を変更することは可能ですが、やらないほうが良いでしょう。

TRUE, ON, YES : "1" で初期化されています。
FALSE, OFF, NO : "0" で初期化されています。
CANCEL : "2" で初期化されています。
PI : "3.1415926535897932384626433832795" (π)で初期化されています。
SQRT2 : "1.4142135623730950488016887242097" (√2)で初期化されています。
PHI : "1.6180339887498948482045868343656" (φ)で初期化されています。
EULER : "2.7182818284590452353602874713527"(e) で初期化されています。


7.5.2 変数のスコープ

・通常は、全ての変数はグローバルであり、一度定義したら、その変数は全ての Sub ブロック(「8.9 サブルーチン (Sub, Call/CallFunction)」を参照)や CallScript() で呼び出される他のスクリプト(「8.10 他のスクリプトをサブルーチンとして呼び出す (CallScript/CallScriptFunction)」を参照)内で要求したり変更したり出来ます。

・ローカル変数を使用したい場合は、Local(), Global() コマンドを使用します。

・引数無しの Local() コマンドを呼び出した場合、それ以降から Sub ブロック/スクリプトの最後まで、全ての変数はローカル変数として扱われます。メイン部(=最初の Sub 以前までのコード)においても同様です。

・Local() コマンドに変数のリストを渡すことも可能です。この場合、渡された変数のみがローカル変数として扱われ、それ以外は全てグローバルのまま扱われます。

・Global() コマンドは逆の働きをします。このコマンドに渡されたリスト内の変数はグローバルのまま扱われ、それ以外は全てローカルとして扱われます。Global() コマンドはいわば、Local() の例外指定のようなものです。

例:
Local()
x = "Test"
Call( "Sub1" )
Call( "Sub2" )
Message( x )
 …「Test」を表示。ローカル変数「x」はサブルーチン内で変更されないので。
Message( y ) …空文字列を表示。「y」というローカル変数は無いので(グローバル変数のみ。下記を見よ)

Sub Sub1
    x = 5
 …グローバル変数「x」を定義
    Local( x )
    y = "Hi!"
 …グローバル変数!(「x」のみがローカル)
    Message( x )
 …空文字列を表示(ローカル変数「x」は未定義なので)
EndSub

Sub Sub2
    Global( x )
    Message( x )
 …グローバル値「5」を表示。
    Message( y )
 …空文字列を表示。「y」というローカル変数は無いので。
EndSub

※「9.2.5 変数スコープ(Local, Global)」を参照。

7.5.3 配列(リスト)

・配列は特殊なタイプの変数です。配列は、複数の変数のひとまとまりから成り、個々の変数は「要素」と呼ばれます。

・個々の要素は、配列名+[インデックス]で指定されます。つまり、array[1] は配列「array」の1番目の要素を指します。

・文字列をインデックスとして使用することも可能です。例:colors[ "blue" ]
 変数名と同様に、大文字小文字の区別はありません。例:COLORS[ "BLUE" ]は colors[ "blue" ] と同じ要素を指します。

※この機能は、連想配列(Perl等におけるハッシュ)のように使えます。 例:
ForEach key, value in iniKeys ( iniFile, section )
    array[key] = value
EndForEach

・代入においても、また式の内部においても、式をインデックスとして使用することができます。
※例:
array[ 3 ] = "c"
Message( array[ 1 + 2 ] )

→「c」を表示

・カウンター変数などのように、変数をインデックスとして使えるところが、配列の主な強みです。

・Choice や Split などの命令文では、配列を引数として取ることができますが、これらは配列の要素のうち、インデックス1からアクセスを開始し、インデックスとして定義されていない最初の数字までで止めます。0以下のインデックスや、インデックス数字が飛んでいる場合や、文字列インデックスを持つ要素は、無視されます。

・[]を追加することにより、配列にレベルを加えることが出来ます。例:「colors[x][y]」

※例:
day[1][1] = "Mon"
day[1][2] = "Tue"
day[1][3] = "Wed"

day[2][1] = "Thu"
day[2][2] = "Fri"
day[2][3] = "Sat"

x = Choice( "Selection", "Choose something", 0, 0, day[2] )

 →Choice ダイアログに"Thu" "Fri" "Sat" が表示される。

day[2007][1][1] = "Mon"
day[2007][1][2] = "Tue"
day[2007][1][3] = "Wed"

day[2008][2][1] = "Fri"
day[2008][2][2] = "Sat"
day[2008][2][3] = "Sun"

x = Choice( "Selection", "Choose something", 0, 0, day[2008][2] )

 →Choice ダイアログに"Fri" "Sat" "Sun" が表示される。

・例:

array[ "1" & 1 ] = "eleven"
Message( array[ (2-1) & "1" ] )
list[1] = "a"
list[2] = "b"
list[5] = "f"
list["a"] = "A"
idx = Choice( "Selection", "Choose something", 0, 0, list )
 →「a」と「b」だけが Choice ダイアログに表示される。

※「9.5 配列」を参照。


7.5.4 変数へのリファレンス([変数名])

・リファレンスは、式によって変数(あるいは配列の一要素)にアクセスする機能です。いわば、名前の無い配列要素としての変数と、Eval()(「9.2.2 文字列を式として扱う(Eval)」を参照)のミックスのようなものです。

・変数へのリファレンスを行なうには、有効な変数名(または配列要素)を返す式を[]括弧で囲みます。

・例えば、「["array[1]"]」は、配列 array の1番目の要素へのリファレンスです。もちろん、このような使用では意味が薄く、「array[1]」と記述したほうが速いです。しかし、「[ arrayName & "[" & elem & "]" ]」などとしたい場合には、利点があります。

・例:
[targetVar] = [sourceVar] * 10

Choice( "Selection", "Select:", [choiceArrayName] )

GetTime( [varHour], [varMinute], [varSecond] )

※Eval() は代入演算子の左辺には来られないので、次のような場合にはリファレンスが便利です。
i = 1
month_en = "January"
month_jp = "1月"
lang = "en"
["month_" & i] = ["month_" & lang]
Message( month_1)
 →「January」を表示
lang = "jp"
["month_" & i] = ["month_" & lang]
Message( month_1)
 →「1月」を表示


7.6 演算子

7.6.1 使用可能な演算子一覧

優先順位が高い順
( ) : 括弧
NOT : 否定
^ : 累乗(x^y = xy
* / MOD : 乗算、除算、除算の余り
+ - : 加算、減算
& ¥ : 文字列の連結
> >= < <= = <> : 数の比較
gt ge lt le eq ne : 文字列の比較
条件文 ? 真の場合の値 : 偽の場合の値
     : 条件文 が満たされれば真の場合の値 を、そうでなければ偽の場合の値 を返します

※例
# x の値を自由に設定してみてください
x = -2

y = ( x > 0 ? x : x*-1 )
Message( y )

→x の絶対値が表示されます。

※これはあくまでも演算子なので、真/偽の場合の値 に命令文(コマンド)を設定することは出来ません。

AND && : 論理積「and」
OR || : 論理和「or」


7.6.2 論理/バイナリ演算子

・論理演算子には(true、false、&&、||、NOT)、次のようなルールがあります:
その値が「0」以外の有効な値を取る場合は、「条件は満たされた/オン」となり、そうでなければ「条件は満たされなかった/オフ」ということになります。
例:5、"10"、1=1 → 「真/オン」 0、"x"、2=1 → 「偽/オフ」

・「NOT 5」は「0」を返し(「0でない何か」= true なので、その否定は「false = 0」ということになります)、「NOT (2-2)」は「1」を返します(「2 - 2 = 0 = false」の否定は「true = 1」ということになります)

ANDと&&、ORと||の違いについて。

・まず、&&と||においては、0でない値は全て1として扱われます(2 は 1 と同様に「true」だから)。ANDもORも、比較やチェック関数の戻り値の結合に使われる限りでは、1(true)か0(false)しか返さないので、違いはありません。

・バイナリ演算子のANDとORは、ビット演算上のチェックに役立ちます。たとえば、「( x AND 4 ) = 4 」は、x の(※2進数)値の3bit目が(※1か)どうかをチェックします(4は2進数の100なので)。

・論理演算子 && と || は当初、Cプログラマーのためのものと思われていました。(※ビット演算上の積)1 AND 2 (2進数の 01 AND 10)は「0」であるにもかかわらず、論理演算上の 1 && 2 は 1 = true だからです。


7.6.3 比較

・数と文字列の比較は、優先順位は同等ですが、上記のリストでは見やすさを考慮して一応分けてあります。

・MortScriptには「型の宣言」が無いので、比較演算子によって、数の比較なのか文字列の比較なのかが判断されます。つまり、「"123" < "20"」 は「偽」(20という数は123より小さいので)であり、「123 lt 20」 は「真」(文字「a」が「b」より小さいのと同様に、「1」は「2」よりも小さいので)

・文字列比較演算子の覚え方… gt: "greater than", ge: "greater/equal", lt: "less than", eq: "equals", ne: "not equals" などの省略型として覚えましょう。


7.6.4 文字列とパスの連結

・「¥」はファイルパスを連結するための演算子です。連結するポイントに「¥」を置くと、(※前後にある、ディレクトリを表す「¥」の有無にかかわらず)ひとつの「¥」によって連結されます。

例:
"¥My Documents¥" ¥ "¥file.txt"
"¥My Documents" ¥ "file.txt"
"¥My Documents¥" ¥ "file.txt"

→どれも "¥My Documents¥file.txt" を正しく返します。

・いっぽう、「&」は文字列を単に連結するので、誤ったパスを返す可能性があります。

例:
"¥My Documents¥" & "¥file.txt"
→ "¥My Documents¥¥file.txt"
"¥My Documents" & "file.txt"
→ "¥My Documentsfile.txt"
"¥My Documents¥" & "file.txt"
→ "¥My Documents¥file.txt" - これだけが有効なファイルパスです!



8 制御構造


8.1 条件文

・()で括られた式が条件として適用されます。戻り値が(数に変換された場合) 0 (ゼロ。変数「FALSE」と「NO」に定義済み)でなければ、条件は満たされたことになります。使用可能な関数は、「9 コマンドと関数」の該当箇所で一覧できます。第7章、特に「7.2 データ型」も、併せて参照のこと。

例:
If ( wndExists( "Word" ) )
EndIf

While ( x <> 5 )
EndWhile



8.2 単純分岐(If)

If ( )
    { 命令文 }
{ ElseIf( )
    { 命令文 } }
[ Else
    { 命令文 } ]
EndIf


・もし条件が満たされたならば、「If」と「Else」あるいは「EndIf」で挟まれた行を実行し、条件が満たされなければ、「Else」と「EndIf」に挟まれた行を実行します(もし「Else」が存在すれば)。

・「ElseIf」が使用された場合は、(最初の「If」を含む)条件のうち、最初に「真」を返す行と次に来る「ElseIf」「Else」あるいは「EndIf」に挟まれた命令文だけを実行します。どの条件も満たされなかった場合に、「Else」ブロックが実行されます。

・「If」、「Else」、「ElseIf」、「EndIf」は、異なる行になければなりません。


8.3 値による分岐(Switch)

Switch ( )
Case ( {, } )
    { 命令文 }
{ Case ( {, } )
    { 命令文 } }
EndSwitch


・式の戻り値によって、「Case」行にある値に該当するブロックが実行されます。

・同じ値が複数の「Case」ブロックに登場する場合、マッチするブロックが上から順に実行されます。

・C言語における "Slipping through" や "break" のようなことはできませんが、複数の「Case」に同じ値を置くことにより、同様の事をより明解に行うことができます。

※このSwitch()は少々分かりにくいかもしれません。つまり、こういうことです。

#月を自由に設定してみて下さい
m = 3

Switch( m )
Case( 3, 4, 5 )
    Season = "春"
Case( 6, 7, 8 )
    Season = "夏"
Case( 9, 10, 11)
    Season = "秋"
Case( 12, 1, 2 )
    Season = "冬"
Case( 1, 3, 5, 7, 8, 10, 12 )
    MonthL = "大の月"
Case( 2, 4, 6, 9, 11 )
    MonthL = "小の月"
EndSwitch

Message( Season & ", " & MonthL )

→「春, 大の月」と表示されます。

※「Case()」に式を設定することもできます。

#月を自由に設定してみて下さい
m = 3

Switch( 1 )
Case( m < 4 )
    fYear = "旧年度"
Case( m >= 4 )
    fYear = "新年度"
EndSwitch

Message( fYear )

→「旧年度」と表示されます。


(※数値や文字列などの)異なるデータ型を「値」として使用することができ、式の戻り値の型はそれに応じて変換されます。

・しかしながら、浮動小数値を使用する場合は、以下の2つの点で注意が必要です:

1. 桁の丸め方次第では、一見同じに見える数値でも、小数点以下15桁以降が異なっているかも知れません。
2. 「Case( 2 )」などと記述した場合、式の戻り値は丸められ整数に変換されるので、値が「1.5」でも「2.4」でも真となります。浮動小数値の比較には、「Case( 2. )」などと記述する必要があります。


8.4 選択ダイアログによる分岐(Choice, ChoiceDefault)

( Choice( タイトル, プロンプト, , {, } )
| Choice( タイトル, プロンプト, 配列 )
| ChoiceDefault( タイトル, プロンプト, デフォルト, タイムアウト, , {, } )
| ChoiceDefault( タイトル, プロンプト, デフォルト, タイムアウト, 配列 )
)
Case( {, } )
    { 命令文 }
{ Case( {, } )
    { 命令文 } }
EndChoice


・設定した値での選択肢を表示します。「Case」の値には、1から始まる数を指定して下さい。キャンセルボタンが押された場合や、何も選択されなかった場合には、「0」を返します。

・上記以外に関しては、Switch()と同じです。

・理屈としては、Switch( Choice(…) )とすることも可能(関数としてのChoice()については、「9.20.6 リストからの選択(Choice)」を参照)ですが、Choice を制御構造として使う方がすっきりします。

・ChoceDefault はデフォルト選択肢とタイムアウトを設けたものです。タイムアウト時間を経過すると、それまでに選択された選択肢が入力されます。ユーザが他の選択肢をクリックすると、カウントダウンは再スタートします。

・「デフォルト」には選択肢インデックスを指定して下さい(2番目の選択肢なら「2」)。「デフォルト」を「0」に設定すると、デフォルト無しになります(ユーザが何も選択しなければ、キャンセルされます)。

・「タイムアウト」は秒数で指定して下さい。「0」に設定すると、タイムアウト無しになります。

例:
Choice( "Test", "Select a number", "One", "Two", "Three" )
Case( 1 )
    Message( "One" )
Case( 2, 3 )
    Message( "Two of three" )
Case( 3 )
    Message( "Three" )
Case( 0 )
    Message( "Cancel" )
    Exit
EndChoice


・「9.20.8 ファイルを選択する(SelectFile)」も参照。


8.5 条件つきループ(While)

While( 条件 )
    { 命令文 }
EndWhile


・条件が満たされている間、「While」と「EndWhile」に挟まれた行を実行します。「While」と「EndWhile」は、異なる行になければなりません。


8.6 複数の値によるイテレーション(ForEach)

ForEach 変数 {, 変数 } in タイプ ( 引数 {, 引数 } )
    { 命令文 }
EndForEach


・これはかなり強力なツールです。設定された変数には、「タイプ」と引数で定義された値が、それぞれ代入されます。単なる値のリスト(「values」タイプ)から、INIファイルのセクション中のキーと値の組み合わせ(「iniKeys」タイプ)まであります。

・注意:イテレーターの変数としてひとつの配列要素が設定された場合、配列要素のインデックスは、ループに入った時点のものだけが解釈されます。つまり、もし ForEach ループに入った時点で「i」が1ならば、ループブロック中で「i」に異なる値が代入されたとしても(※インクリメントされたとしても)、「array[i]」には繰り返し中毎回「array[1]」が代入されてしまいます。引数に関しても同様に、ループに入った時点で評価されます。

※つまり、こういうことです。

#配列「array」に3つの要素を代入しようとして
i = 1
ForEach array[i] in values ( "one", "two", "three" )
    i = i + 1
EndForEach
#↑こうしても、
Message( array[1] & ", " & array[2] & ", " & array[3] )
#→「three, , 」としか表示されません。

#↓こうすれば大丈夫
i = 1
ForEach var in values ( "one", "two", "three" )
array[i] = var
    i = i + 1
EndForEach

Message( array[1] & ", " & array[2] & ", " & array[3] )
#→「one, two, three」と期待通りに表示されます。

・特に記さない限り、他のほとんどのコマンドと同様に、式を引数として使用することができます。

・現時点で利用できるバリエーションは、以下のとおり。

8.6.1 データ値(式のリスト/配列/分割された文字列/文字列中の各文字)でループ

ForEach 変数 in values ( {, } )
与えられた複数の値が、各繰り返し毎に変数に代入されます。

ForEach 変数 in array ( 配列 )
与えられた配列の各要素の値が、各繰り返し毎に変数に代入されます。配列の要素のうち、インデックス1からアクセスを開始し、インデックスとして定義されていない最初の数字までで止めます。0以下のインデックスや、インデックス数字が飛んでいる場合や、文字列インデックスを持つ要素は、無視されます。(※「7.6 配列(リスト)」参照)

ForEach key, value in array ( 配列 )
各配列要素のインデックスが変数「key」に、値が変数「value」に、それぞれ代入されます。

ForEach 変数 in split ( , デリミタ, トリム? )
Split()関数(「9.5.5 文字列を複数の変数/配列要素に分割する(Split)」参照)と同様ですが、各部分がひとつずつ変数に代入されます。

ForEach 変数 in charsOf ( 文字列 )
文字列中の一文字一文字が、各繰り返し毎に変数に代入されます。MortScriptはデータ型を自動的に変換するので、数字にも使えます。例:「42」の場合は「4」と「2」を次々代入します。
※日本語文字列も2バイト1文字として扱ってくれます。

8.6.2 INIファイル(セクション/或るセクション中の値)でループ

ForEach 変数 in iniSections ( INIファイル )
INIファイルのセクション名(「[Section]」の括弧無し)がひとつひとつ、各繰り返し毎に変数に代入されます。

ForEach key, value in iniKeys ( INIファイル , セクション )
INIファイルのセクションの内容が、各繰り返し毎に変数に代入されます。「key」は「=」の前に記述されるエントリ名を受け取る変数であり、「value」は「=」の後に記述されている値を受け取る変数です。

8.6.3 レジストリ(サブキー/値)でループ

ForEach 変数 in regSubkeys ( ルート, キー )
指定のレジストリキー以下の全てのサブキーが、各繰り返し毎に変数に代入されます。引数については、「9.19.1 レジストリの値を読み取る(RegRead)」を参照。

ForEach value, data in regValues ( ルート, キー )
指定のレジストリキーの値が、各繰り返し毎に指定の変数に代入されます。「value」は値名を受け取る変数であり、「data」はデータを受け取る変数です。詳しくは「9.19.1 レジストリの値を読み取る(RegRead)」を参照。
このルプは、デフォルト値は返しません(レジストリエディタで通常「<Default>」「@」などと表示されるもの)。

8.6.4 ファイル/ディレクトリでループ

ForEach 変数 in files ( 検索式 )
ForEach 変数 in directories ( 検索式 )
検索に一致したファイルパス/ディレクトリパスが、変数に代入されます。
検索式は、ワイルドカード付きのファイル名/ディレクトリ名とパスで設定します。
例: "¥Program Files¥Mort*" または "¥Program Files¥Test¥*.exe"


8.7 固定数による繰り返し(Repeat)

Repeat( カウント数 )
    { 命令文 }
EndRepeat


・「Repeat」と「EndRepeat」で挟まれた命令を、「カウント数」回繰り返して実行します。「カウント数」は1以上でなければなりません。

※注意!「Repeat( 0 ) 」では無制限にループします。


8.8 単純イテレーション(For)

For 変数 = start to end [ step step ]
    { 命令文 }
Next


・最初のイテレーションで「start」の値が「変数」に設定され、以後繰り返しごとに「step」の値ずつ増加 (「step」が負の値ならば減少)し、「変数」が「end」の値を超えるまで(「step」が正の値なら「変数」>「end」、負の値なら「変数」<「end」となるまで)繰り返します。

・「step」が省略された場合、「end」が「変数」の初期値より大きければ「1」が、小さければ「-1」が、「step」に適用されます。

・整数と浮動小数値が使用出来ます。浮動小数値を使用する場合は、小数点以下6桁の値が「end」値との比較に使用されます(「9.4.8 浮動小数値を比較する」も参照)。

・注意:全ての式(startendstep)は、最初のイテレーションでのみ評価されます。例えば、「end」や「step」に変数を使用して(「For i = 1 to end step x」など)、それらの変数の値を以後の繰り返し中に変更したとしても、変数「i」は最初の指定通り増加しつづけ、For ループに入る前に設定された変数の値に対して評価されます。

※例えば、Perlにおける次のような For ループは…

For( $i = 1; $i <= 10; $i++ ){
    #命令文
}

…下のように書き換えられます。

For i = 1 to 10 step 1
    #命令文
Next


8.9 サブルーチン(Sub, Call/CallFunction)

Sub サブルーチン名
    { 命令文 }
EndSub


Call( サブルーチン名 {, 引数 } )
CallFunction( サブルーチン名, 変数 {, 引数 } )


・「Call」によって、スクリプトは、同じ引数(※=サブルーチン名)の「Sub」以降の行を実行し、サブルーチンの終わり(「EndSub」)まで到達すると、「Call」以降の行に戻ります。

・他のコマンドとは異なり、サブルーチン名は「Sub」の隣に()無しで記述します。式は使えません!

・「Call/CallFunction」に関して、「サブルーチン名」は他の引数と同様、式なので、必ず「""」で囲んで下さい。場合によっては「Call( "mySubroutine" が代入された変数 )」つまり(BASICコマンドを憶えている人にとっては)「On...gosub」のように使われるかも知れませんが、これは良いプログラミングのスタイルとは言えないし、有効なサブルーチン名を忘れてうっかりトラブルを起こしかねません。

・「引数」を渡すと、サブルーチンは以下の2つの定義済みローカル変数を保持します:
  argc:渡された引数の数を格納した変数
  argv:渡された引数全てを格納した配列
2つの引数が渡された場合は、argc の値は 2。argv[1] の値は最初の引数、argv[2] の値は2番目の引数です。

・CallFunction を使用した場合、(※サブルーチン内で)Return( )によって設定された値が、「変数」に設定されます。他の言語と異なり、Return() によってサブルーチンを抜け出すことはありません!ただ戻り値を設定するだけです。もし Return() が記述されていなければ、「変数」は未定義となります(「9.2.4 変数が代入済みかどうかチェックする(IsEmpty)」を参照)。

・サブルーチンはメイン・プログラムの後に記述します。MortScriptは、最初の「Sub」に行き当たった時点でメイン部を終了します。


8.10 他のスクリプトのサブルーチンをインクルードする(Include)

Include( MortScriptファイル )

・指定されたファイルのすべてのサブルーチンを、現在のスクリプト中に定義されているサブルーチンであるかのように読み込みます。

・Include で読み込まれたファイル中に、また別の Include コマンドが含まれている可能性はありますが、サブブロックの外に記述されたコマンドは一切読み込まれません(単に無視されます)。

・Include コマンドはスクリプトの最初に記述してください。このコマンドは、本スクリプトが実行される前に処理されます。そうでなければ、Call コマンドによって要求されるサブルーチンを探し出せなくなるからです。

・たくさんのファイルを Include すればするほど、うっかり名前のダブったサブルーチンを複数読み込んでしまう危険も高まることに留意してください。この場合、MortScript は、本スクリプトを実行する前にエラーメッセージを表示して終了します。

MortScriptファイル には本スクリプトと同じディレクトリにあるスクリプトファイル名のみ指定できるようです。フルパスを指定するとエラーを吐きます。


8.11 他のスクリプトをサブルーチンとして呼び出す(CallScript/CallScriptFunction)

CallScript( MortScriptファイル {, 引数 } )
CallScriptFunction( MortScriptファイル, 変数 {, 引数 } )


・与えられたスクリプトファイルを、サブルーチンであるかのように実行します。

・これはスクリプト中の変数にも影響します。呼び出されたスクリプトは、親スクリプトの変数を変更してしまうかもしれません!従って、呼び出されるスクリプト中で Local()、Global() を記述しておく必要があります。

・引数(argc と argv)と戻り値(Return())は、サブルーチンと同様に使用可能です。詳しくは8.9 サブルーチン(Sub, Call/CallFunction)を参照。

(※スクリプトのパスの指定については)6.5 ディレクトリとファイル」も参照のこと。

例:
CallScript( "subscript.mscr" )

・他のアプリケーションや「独立した」スクリプトを実行するには、別のコマンドがあります。「9.5 アプリケーションを実行する/ファイルを開く」を参照のこと。


8.12 戻り値を設定する(Return)

Return( )

・CallFunction 及び CallScriptFunction で呼び出された場合の戻り値を設定します。

・他の言語と異なり、Return() によってサブルーチン及び呼び出されたスクリプトを抜け出すことはありません!ただ戻り値を設定するだけです。

・配列を設定することも可能です。

・「8.9 サブルーチン(Sub, Call/CallFunction)」と「8.11 他のスクリプトをサブルーチンとして呼び出す(CallScript/CallScriptFunction)」も参照のこと。


8.13 スクリプトを中止する(Exit)

Exit

・スクリプトの実行を中止します。



9 コマンドと関数


・関数は「type = Function( ... )」の形で表現されます。

type は戻り値の型であり、string(文字列)、bool(ブール値)、 int(整数)、 float(浮動小数値) のどれかです。intboolはともに整数(小数点無し)ですが、bool 関数はTRUE(1)とFALSE(0)のどちらかのみを返します。

・これら以外の型が返される場合、それは単に、value(値)です。詳細については各々の関数の説明文を参照のこと。

・もちろん、もっと複雑な式の中でも使用可能です(「7 パラメータ(引数)と代入」を参照) 。


9.1 エラー処理(ErrorLevel )

ErrorLevel( エラーレベル )

・どの程度のエラーでエラーメッセージを出すかを設定します。

・「エラーレベル」は文字列です。
 ○ ErrorLevel( "syntax" )
 × ErrorLevel( syntax )
「syntax」が文字列"syntax"を格納した変数である場合は、後者でもOK。

・デフォルトは "error" です。

・エラーレベル一覧:(※簡単にエラーを吐かない順)

off :エラーメッセージ無し…メッセージを全く出さずにスクリプトを中止します。
critical :重大なエラー…将来のバージョンアップで導入予定。現時点では有りません。
syntax :文法エラー…誤った引数や無効なコマンド/関数名など。
error :エラー一般…ウィンドウが存在しない場合、レジストリ/ファイルの書き込み/消去に問題が生じた場合、新しいドキュメント/ディレクトリが作成できなかった場合など。
warn :警告…ファイル/ディレクトリが削除できなかった場合、copy/move/rename に問題が生じた場合など。

・リストの下のレベルは、上のレベルをすべて含みます。"error" のレベルは、"syntax" や "critical" のメッセージも表示します。

・この機能によって、プログラムフローは変わります。もしエラーレベルが "warn" か "error"に設定されていると、エラーイヴェントが発生した場合、スクリプトは中止されます。もしエラーレベルが "off" から "syntax" までの間なら、たとえば「ウィンドウが存在しない」などのエラーイヴェントは無視されるので、「If( WndExists( ... ))」でチェックすることが可能になります。


9.2 変数

9.2.1 変数の代入("=" と Set)

変数 =
変数 +=
変数 -=
変数 *=
変数 /=
変数 &=
変数 \=
Set( 変数, )

・式の戻り値を、変数に代入します。

・代入演算子が組み合わさった形(「+=」など)は、変数 = 変数 演算子 の簡易な記述法です。例:i += 1 は i = i +1 と同じ。

・Set() は旧シンタックスなので、この書き方ではなく 変数 = の形での使用を推奨いたします。

・ですが、Set() にはひとつだけ特色があります。もし「変数」が %...% で囲まれていると、その変数の値が変数名となります。つまり、変数「varRef」の値が文字列 "var" であった場合、「変数」に「%varRef%」と記述すると、「式」の戻り値は、変数「varRef」にではなく、変数「var」に代入されます。

※つまり、こういうことです。

GrandMother = "Mother"
Set( %GrandMother%, "Daughter")

Message( Mother )

→「Daughter」を表示します。

・もし変数「varRef」の値が、%...%で囲まれた文字列である場合は、さらにその中の文字列を変数名として解釈して、%...%で囲まれていない文字列を見つけるまで、再帰的に繰り返します(あるいは無限ループしてシステムがクラッシュするまで)。

※訳者の環境では、再帰的には繰り返しませんでした。

GrandMother = "%Mother%"
Mother = "Daughter"
Set( %GrandMother%, "GrandDaughter")

Message( Daughter )

→空文字列を表示します。

・この書式は紛らわしく、得てしてエラーを引き起こしやすい旧式のものなので、可能な限りリファレンス(「7.5.4 変数へのリファレンス([変数名])を参照)を使用して下さい。


9.2.2 文字列を式として扱う(Eval)

value = Eval( 文字列 )
・文字列に含まれている式を評価して、その戻り値を返します。

例:
x = Eval( "1+5*x" )
→元のxが5の場合、x=26 を返します。


9.2.3 変数や配列を取り除く(Clear)

Clear( 変数 )

・変数や配列要素を未定義化します。空文字列を代入するのとは異なり、Clear された変数や配列要素は、IsEmpty() が TRUE を返し(次項を参照)、配列要素は ForEach、Choice 等の中に 現れません。


9.2.4 変数が代入済みかどうかチェックする(IsEmpty)

bool = IsEmpty( 変数 )

・変数(及び配列要素)が未定義か、Clear() で取り除かれていれば TRUE を返し、既に代入済み(それが空文字列であっても)であれば FALSE を返します。


9.2.5 変数スコープ(Local, Global)

Local( [ 変数 {, 変数 } ] )
Global( 変数 {, 変数 } )


・Local() を使用すると、現在のブロック(サブルーチンやメイン部)中の指定の(変数が省略された場合は、全ての)変数が、ローカル変数として扱われます。

・Global() はその逆です:現在のブロック中の指定の変数はグローバル変数として扱われ、それ以外はローカルとして扱われます。

・詳細は「7.5.2 変数のスコープ」を参照のこと。


9.3 文字列の操作

9.3.1 文字列の長さを取得する(Length)

int = Length( 文字列 )

・文字列の中の文字数を返します(※2バイト文字も1文字として換算します)

・例:
x = Length( "This is a test" )
→ x = 14


9.3.2 文字列から或る範囲の文字列を抽出する(SubStr)

string = SubStr( 文字列 , 開始インデックス [, 長さ ] )

・文字列の「開始インデックス」から「長さ」個の文字を返します(※2バイト文字も1文字として換算します)

・「長さ」が省略された場合、あるいは「長さ」が「開始インデックス」以降の文字数より長い場合は、「開始インデックス」以降の全ての文字列を返します。

・「文字列」が「開始インデックス」よりも短い場合は、空文字列を返します。

・開始インデックスに負の数を指定することも可能。「-1」では最後の文字を、「-2」ならば最後から2番目の文字以降を返します。「-n」のnが全文字列長より大きければ、最初の文字から開始します。

・例:
x = SubStr( "abcder", 2, 3 )
→ x = "bcd"

x = SubStr( "asdf", -3 )
→ x = "sdf"


9.3.3 文字列中の指定位置の一文字を返す(CharAt)

string = CharAt( 文字列, 位置 )

・文字列中の指定の位置の1文字を返します。文字列の文字数が位置 よりも少ない場合は、空文字列を返します(「9.2.4 変数が代入済みかどうかチェックする(IsEmpty)」も参照のこと)。

※次のPart() と同様、位置 に負の値を指定することも可能です。

位置 に「0」を指定すると、1文字目を返すようです。


9.3.4 文字列を分割してひとつの部分を返す(Part)

string = Part( 文字列 , デリミタ, インデックス [, トリム? ] )

・文字列を、デリミタ(※2文字以上も可能になりました。2バイト文字でも可)が現れる毎に分割し、インデックスで指定された分割パート(インデックスが「2」ならば2番目のパート)を返します。

・インデックスに負の数を指定することも可能。「-1」では最後のパートを、「-2」ならば最後から2番目のパートを返します。

・「トリム?」が1であるか、省略されていれば、分割パートを囲むスペースが取り除かれます。

・「9.5.5 文字列を複数の変数/配列要素に分割する(Split)」も参照のこと。

・例:
x = Part( "a | b | c", "|", 2 )
→ x = "b" (2番目のパート、スペース削除)

x = Part( "a¥ b ¥ c.def", "¥", -1, 0 )
→ x = " c.def" (最後のパート、スペースはそのまま)

x = Part( "eins, zwei, drei", ",", 4 )
→ x = "" (存在しないパートなので空文字列)


9.3.5 文字列の中の或る文字列を検索する(Find)

int = Find( 検索対象文字列 , 検索文字列 [, 検索開始インデックス ])

・検索対象文字列における、検索文字列が最初に見つかった位置を返します。

検索開始インデックス が指定されていれば、その文字インデックス以降を検索します。

・もし検索文字列がひとつも見つからなければ、「0」を返します。これは、SubStrの開始インデックスを0に設定してしまう、というような無効な関数を避ける為に必要なチェックでしょう。

・例:
x = Find( "abcdefcd", "cd", 5 )
→ x = 7

x = Find( "abcdef", "CD" )
→ x = 0 (大文字小文字を区別します!)


9.3.6 文字を後ろから検索する(ReverseFind)

int = ReverseFind( 検索対象文字列 , 検索文字 )

・検索対象文字列の中で、検索文字が最後に見つかった位置を返します。Find と異なり、検索文字は1文字のみです。もし検索文字が見つからなければ、「0」を返します。

・例: x = ReverseFind( "abcba", "b" )
→ x = 4


9.3.7 文字列を置換する(Replace)

string = Replace( 対象文字列, 検索文字列, 置換文字列 )

対象文字列 の中の全ての検索文字列置換文字列 に置換します。

・例: x = Replace( "My old string", "old", "new" )
→ x = "My new string"

※大文字小文字は区別されます。


9.3.8 大文字/小文字に変換する(ToUpper/ToLower)

string = ToUpper( 文字列 )
string = ToLower( 文字列 )


・与えられた文字列を大文字/小文字に変換したものを返します。

・変数が引数として与えられた場合、その値は変換されません。

※と書いてはありますが、そうでもないようです。
例:

x = "abc"
Message( ToUpper( x ))

→正しく「ABC」と表示されます。

・システムのローカライゼイションに依存する特殊な文字、たとえば「ä」や「è」などは変換されません!

・例:
x = ToUpper( "Abcba" )
→ x = "ABCBA"

x = ToLower( "AbcBA" )
→ x = "abcba"


9.3.9 文字とユニコード値を相互に変換する(UcChar, UcValue)

string = UcChar( )
int = UcValue( 文字 )


・UcChar は指定のUnicode値(※10進数値)の文字を、UcValue は指定の文字のUnicode値を、それぞれ返します(文字 には1文字を指定します。複数文字の場合は最初の1文字だけが処理されます!)。

例:
x = UcValue( "A" )
→x = 65

c = UcChar( x + 1 )
→c = "B"

※全角文字を指定することも可能です。


9.3.10 ファイルパス中の部分を返す(FilePath, FileBase, FileExt)

string = FilePath( ファイルパス )
string = FileBase( ファイルパス )
string = FileExt( ファイルパス )


・パス付きのファイル名を、各部分に分割します。

・FilePath は、ファイル名無しのパス部分を返します(「My Documents¥test.txt」から「My Documents」を)。

・FileBase は、パス部分と拡張子無しのファイル名を返します(「My Documents¥test.txt」から「test」を)。

・FileExt は、拡張子を返します(「My Documents¥test.txt」から「txt」を)。

・「9.18.4 システムパスを取得する(SystemPath)」と一緒に使うと便利でしょう。


9.4 数学関数

9.4.1 フォーマットして出力する(Format)

string = Format( , 小数桁 )
・指定の小数桁を有する文字列としての値を返します。値は必要に応じて四捨五入されます。

例:
x = Format( 123.456789, 2 )
→x = "123.46"

x = Format( 12, 2 )
→x = "12.00"


9.4.2 16進数と10進数を相互に変換する(NumberToHex, HexToNumber)

string = NumberToHex( 整数 )
int = HexToNumber( 文字列 )


・NumberToHex は、整数値(浮動小数値が渡された場合、小数点以下は切り捨てられます)を16進数の文字列に変換します。文字列は、偶数桁のフルバイトに整形されます(「256」は「0100」に、「11」は「0a」に)。

・HexToNumber は逆に、16進数の文字列を整数の値に変換します。文字列に不適当な文字が含まれている場合、その直前までを変換します。例えば、HexToNumber( "axe" ) は「10」を返します(「a」までが有効な16進数文字列なので)。大文字の16進数文字列も利用可能です。

・注意:これらの両関数は、0 から 2,147,483,647 (7fffffff) までの値でのみ、正確に上記の変換を行ないます。2,147,483,648 (80000000) から 4,294,967,295 (ffffffff) の値に関して、10進数から16進数への変換は正しく行ないますが、16進数から10進数への変換を行なうと、負の値を返します。また、-1 から -2,147,483,647 を16進数に変換すると、ffffffff (-1) から 80000001 (-2,147,483,647) の8バイト値を返します。これは、値が負であることが内部的に格納される(最初のビットが負フラグ)からです。

・この数域を超えた値は、エラーを引き起こすか、妙な値を返します。


9.4.3 小数値を丸める(Round, Floor, Ceil)

int/float = Round( [, ] )
int/float = Floor( [, ] )
int/float = Ceil( [, ] )


・これらの関数は、 が「0」もしくは省略された場合、小数値を整数に丸めた値を返します。

・Floor は小数点以下切り捨て(2.9 → 2)、Ceil は小数点以下切り上げ(2.1 → 3)、Round は小数点以下四捨五入(2.49 → 2、2.5 → 3)します。

が指定された場合、指定の小数点以下桁数に丸めた値を返します。
例:Round( 2.56, 1 ) →「2.6」を返す

※実際には「2.600000」という、小数点以下6桁の値が返されます。数値としてはたしかに丸まっているのですが…。


9.4.4 乱数を生成する(Rand)

int = Rand( max )
float = Rand( )


・引数 max が指定された場合、「0」から「max - 1」までの間のランダムな整数を返します。

・引数 max が省略された場合、「0」から「0.999...」までのランダムな浮動小数値を返します。

max が省略され、且つひとつのスクリプト中で1回だけ実行された場合、どうもランダムではなく時刻とともに徐々に増えて行くような値が返されるようです。
スクリプト中2度目以降には、まずランダムな値を返すようです。


9.4.5 三角関数(Sin, Cos, Tan)

float = Sin( ラジアン値 )
float = Cos( ラジアン値 )
float = Tan( ラジアン値 )


・注意!これらの関数は、ラジアン値を引数として取ります。角度(「45°」など)を使用したい場合は、「角度 * PI / 180」という式で変換して下さい。


9.4.6 対数(Log, Log10)

float = log( )
float = log10( )


・Log() は e (MortScriptの予約済み変数 EULER)を底とした対数を、Log10() は10を底とした対数を返します。


9.4.7 2乗根(Sqrt)

float = Sqrt( )


・指定の値の2乗根を返します。√2 の値は、予約済み変数 SQRT2 でも利用可能です。


9.4.8 浮動小数値を比較する(CompareFloat)

int = CompareFloat( 値1, 値2, 小数桁 )


・浮動小数値の比較は、丸め方によるエラーが絡むので少々やっかいです。例えば、ゼロは“本当の”0 であるとは限らず、1*10-20のような値かも知れないからです。

・この関数は、上記の問題を解決します。指定のふたつの値は、それぞれ小数桁で四捨五入された後、比較されます。

値1 < 値2 であれば「-1」を、値1 > 値2 であれば「1」を、値1 = 値2 であれば「0」を返します。


9.4.9 最大/最小値を取得する

value = Min( , {, } )
value = Max( , {, } )


・複数の引数 のうち、Max は最大値を、Minは最小値を、それぞれ返します。

・値は数値的に比較されますが、戻り値は該当引数の値と同じ形式で返されます。
例えば…Max( 1, 2.5, "3.33" )は、「"3.33"」を返します。

※残念ながら配列を引数として渡すことは出来ないようです。


9.5 配列

9.5.1 最大インデックスを取得する(MaxIndex)

int = MaxIndex( 配列 )

・配列中、1から途切れなく並んでいる最大のインデックスの値を返します。

・例:
array[1]="a"
array["2"]="b"
array[3]="c"
array[5]="e"
array["x"]="X"
max = MaxIndex( array )


→「3」を返します。

・MortScriptは、数字をその内容とする文字列インデックスも、数値インデックスのように扱う(正確に言えば逆で、そもそも数値インデックスが文字列として格納されている)ので、「"2"」は無視されません。「"x"」は無視されますが。

・インデックス「4」が無いので、「5」は無視されます。「4」が一旦定義された後で Clear() によって削除された場合も、同様です。


9.5.2 配列要素の数を取得する(ElementCount)

int = ElementCount( 配列 )

・MaxIndex() とは異なり、指定の配列中でこれまで定義された全ての要素の数を返します。その数には、既にClear() で削除された要素も含まれます。Clear()は配列要素そのものを削除するのではなく、未定義化するだけだからです。

・MaxIndex() の項の例で言えば、ElementCount( array ) は「5」を返します


9.5.3 変数のリストから配列を生成する(Array)

配列 = Array( {, } )

・指定の複数の をインデックス1から順に持つ配列を生成します。

・注意:(※配列を定義しつつ、その要素[1]にアクセスしようとして)「Array( "a", "b", "c")[1]」のように記述することは出来ません。一旦配列に値をを代入した後、その配列要素にアクセスして下さい。

・例:
days = Array( "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" )
day = days[ FormatTime("w")+1 ]

※→今日の曜日アルファベット3文字が、変数「day」に代入されます。

9.5.4 文字列インデックス付きの配列を生成する(Map)

配列 = Map( インデックス, {, インデックス, } )

・指定の複数のインデックスキーと値を持つ配列を生成します。

・必ず偶数個の引数を指定して下さい。それぞれのペアの内、最初の引数がインデックス、2番目が値として渡されます。

・注意:(※配列を定義しつつ、その要素[1]にアクセスしようとして)「Map( 1, "a", 2, "b" )[1]」のように記述することは出来ません。一旦配列に値をを代入した後、その配列要素にアクセスして下さい。

・例:
months = Map( "01", "Jan", "02", "Feb", "03", "Mar", etc. )
month = months[ FormatTime("m") ]

※→今月のアルファベット3文字が、変数「month」に代入されます。

9.5.5 文字列を複数の変数/配列要素に分割する(Split)

Split( 文字列 , デリミタ, トリム?, 変数{, 変数 })
配列 = Split( 文字列, デリミタ [, トリム? ] )


・文字列を、デリミタ※2バイト文字でも可)が現れる毎に分割します。デリミタ に複数の文字を指定した場合、分割される文字列中に、デリミタ は同様の並びで存在している必要があります。

・複数の変数を引数として持つコマンド版を使用した場合、それぞれの分割パートは与えられた変数に代入されます。もし変数の数が分割パート数よりも多ければ、残りの変数は未定義のままとされ、もし分割パート数が変数よりも多ければ、残りの分割パートは無視されます。

・与えられた変数がひとつの場合、及び関数版を使用した場合、指定の変数名は配列名と解釈され、n個の分割パート各々は配列要素 変数[1] から 変数[n] に代入されます。

・「トリム?」が1であれば(あるいは関数版で省略されていれば)、分割パートを囲むスペースが取り除かれます。

・例:
Split( "a | b | c", "|", 1, a, b, c, d )
→ a="a", b="b", c="c" d=""

Split( "a¥ b ¥c.def", "¥", 0, a, b )
→ a="a", b=" b "

Split( "one, two, three", ",", 1, list )
→ list[1]="one", list[2]="two", list[3]="three"

list = Split( "one, two, three", "," )
→ list[1]="one", list[2]="two", list[3]="three"


9.6 アプリケーションを実行する/文書を開く

9.6.1 アプリケーション/文書を開いてスクリプトを継続する(Run)

Run( アプリケーション[, 引数 ] )

・アプリケーションを実行します。アプリケーションがロードされ実行されている間もスクリプトは継続します。

・ショートカットや文書から実行することも可能。引数の設定も可能です。

・フルパスで指定して下さい。

例:
Run( "¥Windows¥スタート メニュー¥Messages.lnk" )
Run( "¥Windows¥PWord.exe", "¥My Documents¥doc.psw" )


9.6.2 アプリケーション/文書を開いて実行終了まで待機する(RunWait)

RunWait( アプリケーション[, 引数 ] )

・Run() と同様ですが、アプリケーションが終了するまで待ちます。

・ショートカットは指定できません。

・注意:アプリケーションが既に実行中である場合は、アプリケーションが二重起動されます。これはWindowsの「reactivation」仕様によるものです。二重に起動されたプログラムは既に存在するインスタンスを探し、もし見つかればそれをアクティブにして、自身は終了します。というわけで、スクリプトは2番目のインスタンスの終了後に継続しますが、最初のインスタンスは終了しません。


9.6.3 他のスクリプトをサブルーチンとして呼び出す(CallScript, CallScriptFunction)

CallScript( MortScriptファイル {, 引数 })
CallScriptFunction( MortScriptファイル {, 引数 })


・与えられたスクリプトファイルを、サブルーチンであるかのように実行します。

・「8.10 他のスクリプトをサブルーチンとして呼び出す(CallScript)」を参照。


9.6.4 新規文書/要素を作成する(New)

New( メニューエントリー )

・「予定」などの新規文書を作成します。

・メニューエントリー名はToday画面の「新規」メニューに表示されるものと全く同じでなければなりません。

・悲しいことに、この便利な機能は、Windows Mobile 5 からは使いにくくなりました。WM5の場合は、いろいろ試してみるか、以下のレジストリを調べてみて下さい。
HKEY_LOCAL_MACHINE¥Software¥Microsoft¥Shell¥NewMenu

※W-ZERO3 WS003SH では、以下のレジストリ。
HKEY_LOCAL_MACHINE¥Software¥Microsoft¥Shell¥Extensions¥NewMenu
"メモ", "電子メール", "仕事", "連絡先", "予定", "Word 文書", "Excel ブック" が有効です。

★ PC では使えません。

例:
New( "予定" )


9.6.5 アプリケーションを指定の時刻に実行する(RunAt)

RunAt( Unix タイムスタンプ, アプリケーション[, 引数] )
RunAt( , , , , , アプリケーション[, 引数] )

・指定の時刻にアプリケーションを実行します。いわゆる"Notification Queue"にプログラムを加えます。PPC はスタンバイ状態から復帰します。

・「Unix タイムスタンプ」は、1970年1月1日から経過した秒数です。(※現在のUnix タイムスタンプを返す)TimeStamp()と組み合わせると、面白いことができます。たとえば、TimeStamp()+86400 を指定すると、24時間後に実行します(24時間×60分×60秒=86400)。

・スクリプトを直接実行できないデバイスの場合は、MortScript.exe を呼び出し、スクリプトファイルを引数として指定して下さい。
例: RunAt( starttime, SystemPath( "ScriptExe" ) ¥ "MortScript.exe", ¥
   """" & SystemPath( "ScriptPath" ) ¥ "notify.mscr" & """" )


・WM5を載せたPPCの多くで、デバイスは起きてプログラムは走るが、ディスプレイがオフのままで、プログラムが起動された直後にスタンバイ状態に戻る、という問題があります。時刻指定スクリプトの最初で、ToggleDisplay(ON) を呼び出すようにしておくと、解決できる場合が多いようです。それでもダメなら、システムアップデートか、レジストリをいじるぐらいしか方法はありません。

★ PC では使えません。


9.6.6 パワーオン時にアプリケーションを実行する(RunOnPowerOn)

RunOnPowerOn( アプリケーション[, 引数] )

・電源オンされる度にアプリケーションを実行します。いわゆる"Notification Queue"にプログラムを加えます。

・指定のプログラムが消去/移動されていたりすると、エラーメッセージが何度も出る場合がありますので、このコマンドを使用するときは、よく確認してください。

・WM5機器で使用する時は、RunAt() の注意書きに留意して下さい。

★ PC では使えません。


9.6.7 「Notification Queue」からアプリケーションを取り除く(RemoveNotifications)

RemoveNotifications( アプリケーション[, 引数] )

・"Notification Queue"に加えられたアプリケーションを取り除きます。時刻指定(RunAt)のプログラムやイベント(RunOnPowerOn)は、実行されなくなります。同じアプリケーションの複数のエントリーがある場合は、全てが取り除かれます。

・引数が与えられた場合は、その引数によるエントリーだけが取り除かれます。引数を指定しなければ、そのプログラムのエントリーは引数付きであっても全て取り除かれます。引数の無いエントリーだけを取り除きたい場合は、""(空文字列)を引数として指定して下さい。

★ PC では使えません。


9.7 アプリケーション・ウィンドウ

9.7.1 ウィンドウタイトルの指定とMortScriptの挙動

・このセクションのコマンドと関数のほとんどには、ウィンドウ名を渡す必要があります。

・MortScriptは、指定の文字列をウィンドウ名に持つウィンドウを探します。大文字/小文字は区別されます。「Word」を指定した場合、ウィンドウ名「WORD」には合致しません。

・複数のウィンドウ名に合致した場合、MortScriptは以下の優先順位で、最適と思われるウィンドウを選択します。

●メインウィンドウ(親ウィンドウを持たないか、親ウィンドウがデスクトップ)かどうか
●指定の文字列が、ウィンドウ名の冒頭にマッチするかどうか
●そのウィンドウが見えている(「バックグラウンドにある」というよりも「タスクリストに回っていない」)かどうか


9.7.2 ウィンドウをアクティブにして前面に出す(Show)

Show( ウィンドウタイトル )

・指定のタイトルのウィンドウをアクティブにします。


9.7.3 ウィンドウを最小化する/隠す(Minimize)

Minimize( ウィンドウタイトル )

・指定のタイトルのウィンドウを最小化(Windowsモバイルにおいては、隠)します。


9.7.4 ウィンドウを閉じる/アプリケーションを終了する(Close)

Close( ウィンドウタイトル )

・指定のタイトルのウィンドウを閉じます。メインウィンドウである場合、通常はアプリケーションを終了します。が、終了しないアプリケーションもあります。


9.7.5 現在アクティブなウィンドウタイトルを取得する(ActiveWindow)

string = ActiveWindow()

・現在アクティブなウィンドウのタイトルを返します。


9.7.6 ウィンドウがアクティブかどうかチェックする(WndActive)

bool = WndActive( ウィンドウタイトル )

・指定のウィンドウがアクティブなら「TRUE」を、そうでなければ「FALSE」を返します。

・与えられた文字列をウィンドウタイトルが含んでいればOKですが、大文字小文字は区別されます。たとえば、Today画面(タイトルは「Desktop」)がアクティブな時、WndActive( "top" )は「TRUE」を返しますが、「Top program」というタイトルのウィンドウがアクティブな時、WndActive( "top" )は「FALSE」を返します。


9.7.7 ウィンドウが存在するかどうかチェックする(WndExists)

bool = WndExists( ウィンドウタイトル )

・WndActive()と同様ですが、指定のウィンドウがバックグラウンドにでも存在するなら「TRUE」を返します。


9.7.8 ウィンドウが存在するまで待機する(WaitFor)

WaitFor( ウィンドウタイトル, )

・与えられた秒数を上限として、指定のウィンドウが存在するまで待機します。


9.7.9 ウィンドウがアクティブになるまで待機する(WaitForActive)

WaitForActive( ウィンドウタイトル, )

・与えられた秒数を上限として、指定のウィンドウがアクティブになるまで待機します。


9.7.10 ウィンドウのタイトル/要素の内容を取得する(WindowText)

string = WindowText( x, y )

・指定の座標にあるウィンドウ要素のテキストを取得します。通常のウィンドウでは、ラベル名、ボタン名、エディットボックスの内容などが取得できます。アプリケーションが描いた要素(ゲームなどによくある)やリストボックスなどには上手く働かず、多くの場合、空文字列かアプリケーションのタイトルを返します。


9.7.11 ウィンドウの位置を取得する(GetWindowPos, WndLeft, -Right, -Top, -Bottom)

GetWindowPos( ウィンドウタイトル, left, top, right, bottom )
int = WndLeft( ウィンドウタイトル )
int = WndRight( ウィンドウタイトル )
int = WndTop( ウィンドウタイトル )
int = WndBottom( ウィンドウタイトル )


・指定のウィンドウの位置を返します。

・GetWindowPos は、変数left, top, right, bottom にそれぞれの座標を代入します。

・関数 Wnd... は、それぞれ単一の座標を返します。


9.7.12 ウィンドウに特定のコマンドを送る(SendOK, SendCancel, SendYes, SendNo)

SendOK [ ( ウィンドウタイトル ) ]
SendCancel [ ( ウィンドウタイトル ) ]
SendYes [ ( ウィンドウタイトル ) ]
SendNo [ ( ウィンドウタイトル ) ]

・それぞれのボタンを押した状態がエミュレートされます。ウィンドウタイトルが省略されていれば、現在アクティブなウィンドウに対して送られます。

・ソフトウェア開発者がデフォルトシグナルを使うとは限らないので、全てのプログラムで動く保証はありません。


9.7.13 さらに高度なコマンド/メッセージを送る(SendCommand, SendMessage, PostMessage)

SendCommand( [ ウィンドウタイトル, ] コマンドID )
PostMessage( [ ウィンドウタイトル, ] メッセージID, wParam, lParam )
SendMessage( [ ウィンドウタイトル, ] メッセージID, wParam, lParam )
int = SendMessage( [ ウィンドウタイトル, ] メッセージID, wParam, lParam )

・SendCommand は、どんなIDコマンドでも(通常は全てのボタンやメニュー入力)送ることが出来ますが、アプリのプログラマーからの情報が必要です。コマンドIDはアプリによって異なるし、同じアプリでもバージョンが異なればコマンドIDも変わっている可能性があるからです。

・SendMessage と PostMessage は、アプリ間での一般性はもう少しあるにせよ、やはり同様で、プログラマーからの情報が必要です。予期せぬデータが送られた場合、プログラムのクラッシュなどの大きな問題を引き起こす可能性があります。

・SendMessage は、メッセージを即座に送るので、戻り値を得ることが出来ます。

・PostMessage は、メッセージをmessage queueに登録し、スクリプトを続行します。メッセージはのちに取り扱われます。

・数値パラメータのみ利用可能です。


9.8 キーストローク

9.8.1 文字列を送る(SendKeys)

SendKeys( [ ウィンドウタイトル, ] 文字列 )
・文字列をキーストロークとして、指定の(タイトル指定が無ければ現在アクティブな)ウィンドウに送ります。

例:
SendKeys( "My window", "Hi, how are you?" )
SendKeys( "Some text" )


※日本語文字列を送ることもできます。


9.8.2 特殊なキーストロークを送る(方向キーなど)(Send...)

SendSpecial( キー名 [ , 状態 ] )

・指定のキーストロークをエミュレートします。

・現在のところ、利用可能なキー名は、以下のとおり:
Alt, Ctrl, Shift, CR, Win, Context, Tab, ESC, Space, Up, Down, Left, Right,
Home, End, PageUp, PageDown, Delete, Backspace, Insert, Snapshot,
F1 - F12, LeftSoft, RightSoft

キー名 は文字列として渡す必要があります。大文字小文字は区別されません(例:「Esc」と「ESC」は同じ)。

・全てのキーが全てのシステムで動くとは限りません。例:「ソフトキー」はデスクトップPCには無い

・スキャンコードを渡すことも可能ですが、これは機種依存度が高く(特に、システムの言語設定)、より“高度な弄り屋さん”向けです。

※スキャンコードは10進数で渡します。
例:W-ZERO3 WS003SH のIEボタン(キーコード D:0x5B, D:0xC1, U:0xC1, U:0x5B)をストロークしたい場合


SendSpecial( 91, "down" )
SendSpecial( 193, "down" )
SendSpecial( 193, "up" )
SendSpecial( 91, "up" )

状態 が省略された場合、キーは短く押された後、放されます。状態 に「down」「up」を指定すれば、しばらく押し続けた後に放す、といった動作が可能(Alt, Ctrl, Shift, Winキーの同時押しに便利)。

・この場合、「up」の記述をお忘れ無く。さもないと、後々混乱を招くことになるでしょう…。


SendSpecial [ ( ウィンドウタイトル [, Ctrl?, Shift? [, Alt? ]] ) ]

・指定のウィンドウをアクティブにし、特殊なキーストロークを(タイトル指定が無ければ現在アクティブな)ウィンドウに送ります。

Ctrl?Shift?Alt? は、それぞれのキーを同時に押すかどうかを指定します。これらの引数に「TRUE」を設定すると、特殊キーと同時にそれぞれのキーが押されている状態をエミュレートします。

・以下が特殊キーの一覧です。
CR :リターンキー
Tab :タブキー
Esc :エスケイプキー
Space :スペースキー
Backspace :バックスペースキー(「←」)
Delete :デリートキー
Insert :「Ins.」キー(通常は上書きモードとインサートモードを切り替えるキー)
Up/Down/Left/Right :各方向キー
Home :カーソルを行や文書の先頭に移動
End :カーソルを行や文書の末尾に移動
PageUp/PageDown :ページUp/Down
LeftSoft/RightSoft :WM5 スマートフォン/PPCの左右ソフトキー
Win :Windowsキー
Context :WM5 スマートフォン/PPCの「コンテクストメニュー」

例:
SendCR( "ERROR" )
SendDown
SendHome( "", O, 1 )
(←行の先頭までをハイライトします。)

9.8.3 スクリーンの内容をクリップボードにコピーする(Snapshot)

Snapshot [ ( ウィンドウタイトル ) ]

・指定のウィンドウをアクティブにし、(タイトル指定が無ければ現在アクティブな)ウィンドウの内容をクリップボードにコピーします(システムの「Print screen」機能。全てのプログラムで働くとは限りません)。

9.8.4 Ctrl+キーを送る(SendCtrlKey)

SendCtrlKey( [ ウィンドウタイトル, ] キー )

・Ctrl+キー を指定の、あるいは現在アクティブなウィンドウに送ります。たとえば、 SendCtrlKey( "v" ) は、Ctrl+V(クリップボードからペースト)を現在のウィンドウを送ります。

・キーの大文字小文字の区別はありません。「v」と「V」は同じです。

・キーは1文字でなければなりません。もちろん、式(変数など)の戻り値でも構いません。


9.9 マウスクリック/タッピング

9.9.1 シングルクリック(MouseClick)

MouseClick( [ ウィンドウタイトル, ] x, y )
RightMouseClick( [ ウィンドウタイトル, ] x, y )
MiddleMouseClick( [ ウィンドウタイトル, ] x, y )


・指定の座標でのマウスクリックをエミュレートします。

・ウィンドウタイトルの指定がある場合、座標はそのウィンドウの左上からの相対的値です。ウィンドウにボーダーがある場合(ダイアログなど)、それを含みます。

・ウィンドウの指定が無い場合、ディスプレイの左上の座標は 0, 0 です。

・「Right...」「Middle...」は、右クリック、真ん中クリックをエミュレートします。PC版のみで利用可能です。


9.9.2 ダブルクリック(MouseDblClick)

MouseDblClick( [ ウィンドウタイトル, ] x, y )
RightMouseDblClick( [ ウィンドウタイトル, ] x, y )
MiddleMouseDblClick( [ ウィンドウタイトル, ] x, y )


・MouseClickと同様ですが、ダブルクリックを送ります。

・「Right...」「Middle...」は、右ダブルクリック、真ん中ダブルクリックをエミュレートします。PC版のみで利用可能です。


9.9.3 マウスボタンを押す/放す(MouseDown/MouseUp)

MouseDown( [ ウィンドウタイトル, ] x, y )
MouseUp( [ ウィンドウタイトル, ] x, y )
RightMouseDown( [ ウィンドウタイトル, ] x, y )
RightMouseUp( [ ウィンドウタイトル, ] x, y )
MiddleMouseDown( [ ウィンドウタイトル, ] x, y )
MiddleMouseUp( [ ウィンドウタイトル, ] x, y )


・「マウスボタンを押す/放す」をエミュレートします。引数に関してはMouseClickと同様です。

・「...Down」と「...Up」はペアで使用して下さい。「タップ&ホールド」(両コマンドの間に Sleep() を挟む)や「ドラッグ&ドロップ」(「...Down」と別の座標で「...Up」する)などをエミュレートできます。

・「Right...」「Middle...」は、右ボタン、真ん中ボタンでエミュレートします。PC版のみで利用可能です。


9.10 待機

9.10.1 一定ミリ秒待機する(Sleep)

Sleep( ミリ秒 )

・指定の時間だけ待機します。


9.10.2 カウントダウン/条件付きの待機メッセージ(SleepMessage)

SleepMessage( , メッセージ [ , タイトル [ , OK許可? [ , 条件 ] ] ] )

・カウントダウン付きのメッセージを表示します。

OK許可? を「TRUE」に設定すると、ダイアログはカウントダウンを中止して閉じます。そうでない場合は、中止しません。

・条件を設定すると、その条件が毎秒チェックされ、満たされた時点でダイアログを閉じます。

例:
SleepMessage( 10, "Waiting for PocketWord", "Wait...", 0, ¥
wndExists( "Word" ))


・「9.20.10 BigMessage 等のフォントを指定する(SetMessageFont)」も参照のこと。


9.10.3 ウィンドウを待機(WaitFor/WaitForActive)

・「9.7.8 ウィンドウが存在するまで待機する(WaitFor)」と「9.7.9 ウィンドウがアクティブになるまで待機する(WaitForActive)」を参照。


9.11 時間

9.11.1 Unix タイムスタンプ(TimeStamp, MakeTimeStamp)

int = TimeStamp()
int = MakeTimeStamp( ,, [, [, [, ]]] )


・1970年1月1日から現在までの秒数(いわゆる Epoch)を返します。

・TimeStamp() は現在のシステム時刻を返し、MakeTimeStamp(...) は指定の日/時の値を返します。時 分 秒 が省略された場合は「0」が指定されたとみなされます。つまり、3つとも省略すれば、深夜0時ちょうどの値が返されます。


9.11.2 フォーマットして出力(FormatTime)

string = FormatTime( フォーマット [, タイムスタンプ ] )

・指定のタイムスタンプ、もしくは指定が無ければ現在の時刻を、フォーマット文字列に従って時分秒などの形式で返します。

・フォーマット文字列は以下のとおり。対応する値に置き換えられます。
H :時(00-23)
h :時(01-12)
a :am/pm
A :AM/PM
i :分(00-59)
s :秒(00-59)
d :日(01-31)
m :月(01-12)
Y :年(4桁)
y :年(2桁)
w :曜日(0=日曜 … 6=土曜)
u :Unix タイムスタンプ
{MM} :月名(「January」など) ※ローカライズされます。訳者の環境では「1月」。以下同様
{M} :月名省略型(「Jan」など) ※「1」
{WW} :曜日名(「Monday」など) ※「月曜日」
{W} :曜日名省略型(「Mon」など) ※「月」

・これら以外の文字列は置き換えられずに表示されます。

・注意:全ての戻り値は文字列です。2月は「02」など、1桁数をゼロ付きにしたためです。ファイル名などに使用する上で便利ですが、配列に使用する場合は問題が生じる場合もあるので、あらかじめ文字列インデックスの配列(Month["01"] = "First" など)を用意しておくか、文字列を数値に変換(FormatTime("m") * 1 など)して利用して下さい。

例:
x = FormatTime( "h:i:s a" )
x = FormatTime( "m/d/Y", TimeStamp() + 86400 )



9.11.3 現在の時刻を複数の変数にセットする(GetTime)

GetTime( 変数, 変数, 変数 )

・現在の時刻の時、分、秒を3つの変数に代入します。

GetTime( 変数, 変数, 変数, 変数, 変数, 変数 )

・上記と同様ですが、日、月、年(4桁)が追加されます。

・注意:全ての戻り値は文字列です。2月は「02」など、ファイル名などに使用する上で便利なよう、1桁数をゼロ付きにしたためです。


9.11.4 現在の日時を設定する(SetTime, SetDate)

SetTime(, , , [, , ] )
SetDate( , , )


・システム時刻を、指定の日時にセットします。SetDate() では、時刻は変更されません。

注意! このコマンドを、ソフトウェアのお試し期間を伸ばすために使用しないでください。正直にお金を払って使うか、他のフリーウェアを探しましょう。


9.12 ファイルの複製、名前の変更、移動、削除

9.12.1 ひとつのファイルを複製する(Copy)

Copy( 元ファイル, 先ファイル [, 上書き?])

・ファイルを複製します。

・複製先ファイルは、パスだけでなく、ファイル名まで指定して下さい。

・「上書き?」が FALSE もしくは省略されると、既存のファイルは上書きされません。

・例:
Copy( "¥My Documents¥test.txt", "¥Storage Card¥text.txt" )


9.12.2 複数のファイルを複製する(XCopy)

XCopy( 元ファイル, 先ディレクトリ [, 上書き? [, サブディレクトリ?] ] )

・複数のファイルを複製先ディレクトリに複製します。

・複製元ファイル名はワイルドカード(* と ?)を使用することができます。
○ "¥My Documents¥*.psw"
× "¥My *¥*.psw"

・複製先ディレクトリは実在するものでなければなりません。
・「上書き?」がFALSEもしくは省略されると、既存のファイルは上書きされません。

・「サブディレクトリ?」が TRUEの場合、サブディレクトリ内の、元ファイル の条件に合致する全てのファイルも複製されます。複製先のサブディレクトリは、必要に応じて作成されます。

・例:
XCopy( "¥My Documents¥*.txt", "¥Storage Card" )

XCopy( "¥My Documents¥*.txt", "¥Storage Card", TRUE, TRUE )
→「My documents¥texts¥x.txt」 も 「Storage¥texts¥x.txt」として複製されます。


9.12.3 ひとつのファイルの名前を変更する/移動する(Rename)

Rename( 元ファイル, 先ファイル [, 上書き?] )

・ファイルの名前を変更/移動します。

・複製先ファイルは、パスも指定して下さい

・「上書き?」がFALSEもしくは省略されると、既存のファイルは上書きされません。


9.12.4 複数のファイルを移動する(Move)

Move( 元ファイル, 先ディレクトリ [, 上書き? [, サブディレクトリ?] ] )

・複数のファイルを複製先ディレクトリに移動します。

・移動元ファイル名はワイルドカード(* と ?)を使用することができます。
○ "¥My Documents¥*.psw"
× "¥My *¥*.psw"

・移動先ディレクトリは実在するものでなければなりません。

・「上書き?」がFALSEもしくは省略されると、既存のファイルは上書きされません。

・「サブディレクトリ?」が TRUEの場合、サブディレクトリ内の、元ファイル の条件に合致する全てのファイルも移動されます。移動先のサブディレクトリは、必要に応じて作成されます。移動の結果、移動元のディレクトリが空になっても、ディレクトリは削除されません。


9.12.5 複数のファイルを消去する(Delete)

Delete( ファイル )

・複数のファイルを消去します。

・ファイル名はワイルドカード(* と ?)を使用することができます。
○ "¥My Documents¥*.psw"
× "¥My *¥*.psw"


9.12.6 サブディレクトリ以下のものを含む複数のファイルを消去する(DelTree)

DelTree( ファイル )

・複数のファイルを、サブディレクトリ以下のものを含めて消去します。

・その結果サブディレクトリが空になった場合、サブディレクトリも消去されます。

・ファイル名はワイルドカード(* と ?)を使用することができます。
○ "¥My Documents¥*.psw"
× "¥My *¥*.psw"

・ファイルフィルターが指定されなかった場合(「DelTree( "¥Temp" )」など)、指定のパスが存在すれば「*.*」が適用されます。

注意して使って下さい!


9.12.7 ショートカットを作成する(CreateShortcut)

CreateShortcut( ショートカットファイル, ショートカット先ファイル [, 上書き? ])

ショートカット先ファイル へのショートカットファイルを作成します。

・「上書き?」がFALSEもしくは省略されると、既存のファイルは上書きされません。

・以下の例は、スタートメニューにショートカットを作成します。

・例:
CreateShortcut( "¥Windows¥スタート メニュー¥Test.link", "¥Storage Card¥text.exe" )

※パラメータ(引数)を指定したショートカットを作成することも可能です。パスにスペースを含む場合は""で囲みます。
CreateShortcut( "¥Windows¥スタート メニュー¥Test.link", ¥
"""¥Program Files¥MortScript¥MortScript.exe"" ""¥Program Files¥MortScript¥Test.mscr""" )


9.13 テキストファイルの読み書き

9.13.1 テキストファイルを読み込む(ReadFile)

string = ReadFile( ファイル [, バイト数 [, 文字コード ] ] )
string = ReadLine( ファイル [, 文字コード ] )


・ReadFile は、ファイルの全ての内容を、変数に読み込みます。ファイルサイズの上限は、バイト数、1MB、使用可能メモリのいずれかもっとも低い値です。バイト数 が0もしくは省略された場合は、デフォルト最大値(1MB)が適用されます。

・ReadLine は、指定のテキストファイルの1行を読み込みます。ReadLine が再び呼出されると、次の1行を読み込みます。こうして最終行に達し、これ以上行が無い場合は、空の値を返します(「9.2.4 変数が代入済みかどうかチェックする(IsEmpty)」も参照のこと)。

・ReadFile と異なり、ReadLine は“本物の”ファイルのみ読み込めます。シリアルポート(「9.13.5 シリアルポートにアクセスする(SetComInfo)」も参照のこと)やインターネットアクセスには使用できません。

文字コード として利用可能な値は、「1252」(西欧)、「437」(米DOS)といったコードページ番号(もし知っているなら)…あるいは、以下の文字列です:

"latin1" (西欧)
"jis" (日本語)※7bit JIS ではなく、 Shift_JIS です。
"wansung" (韓国語)
"johab" (韓国語)
"chinesesimp" (簡体中国語)
"chinesetrad" (繁体中国語)
"hebrew"
"arabic"
"greek"
"turkish"
"baltic"
"latin2" (主に東欧)
"cyrillic"
"thai"
"utf8" (非ASCII文字用特種エンコーディング)※いわゆる「UTF-8N」
"unicode" (2バイト文字。より正確に言えば、※バイトオーダーマーク(以後、BOM)無しUTF-16 リトルエンディアン)
"utf8-prefix" (16進数値 EF BB BF のBOM付きUTF-8)※いわゆる「UTF-8」
"unicode-prefix" (16進数値 FF FE のBOM付きUnicode)※いわゆる「Unicode」

・デフォルトは、Windows Mobile ローカライゼイションに依存するシステムのデフォルトです。UTF-8 と Unicode の文書は、BOM付きのもの(上記「...-prefix」文字コードを参照)であれば自動認識されます。

・ファイルの内容を、「ForEach line in split ( contents, "^LF^", TRUE )」などで分解することも可能です。INIファイルの読み込みには、ForEach の各機能や IniRead/IniWrite を参照のこと!

ReadLine の例

StatusType( ST_LIST, TRUE, FALSE )
StatusHistorySize( 500 )

line =ReadLine( "test.txt" )
While(NOT IsEmpty( line ))
     StatusMessage( line )
     line =ReadLine( "test.txt" )
EndWhile



9.13.2 テキストファイルに書き込む(WriteFile)

WriteFile( ファイル, 内容[, 追記?[, 文字コード ] ] )

内容 をファイルに書き込みます。

追記? がFALSEもしくは省略されていれば、既存のファイルは上書きされ、そうでなければ内容 は既存のファイルの末尾に追記されます。

文字コード として利用可能な値は、上記の ReadFile を参照。「...-prefix」の文字コードは、追記? がFALSEの場合のみ適用されます!

※【注意!】文字コード に「utf8」および「utf8-prefix」を指定して書き込みしようとすると、ファイルシステムに原因不明の重大な問題を引き起こす可能性があります。訳者の環境では、0バイトのファイルが生成され、にも関わらずそのファイルがデータ記憶用空きメモリの全てを食い尽くします!


9.13.3 INIファイルの値を読み込む(IniRead)

string = IniRead( INIファイル, セクション, エントリ )

・INIファイルからひとつのエントリを読み込みます。セクション名は[]なしで記述します。

・例:
x = IniRead( "¥My Documents¥test.ini", "Settings", "Test" )


9.13.4 INIファイルに値を書き込む(IniWrite)

IniWrite( INIファイル, セクション, エントリ, )

・INIファイルにひとつのエントリを書き込みます。セクション名は[]なしで記述します。

・このコマンドは、ファイル全体を読み込んでパースして書き換えるものであることを理解しておいて下さい。いくつものエントリを書き換えたい場合は、(ReadFile, ForEach with split, WriteFile を使って)自力で行なった方が効率的かも知れません。

・例:
IniWrite( "¥My Documents¥test.ini", "Settings", "Test", "x" )


9.13.5 シリアルポートにアクセスする(SetComInfo)

SetComInfo( ポート, タイムアウト [, ボーレート [, パリティ [, ビット [, ストップビット [, コントロール ]]]]])

・COMポートにどのようにアクセスするか定義します。このコマンドを呼び出し、さらにファイルネームを「COM1」などCOMポート名をファイル名としてReadFile/WriteFileを行うと、アクセスは指定の値で初期化されます。

・読み込み最大バイト数を指定した上で、ReadFile を行なって下さい。さもないと、タイムアウトに達するまで、膨大な時間を要することになります。
例:data = ReadFile( "COM1:", 100 )

・引数の詳細は以下のとおり。
ポート:DOSファイル名としてのポート。「COM1:」など。大文字+コロンで表記してください!
タイムアウト:ミリ秒表記。このタイムスパン経過後、システムはアクセスを中止します。
ボーレート:通信スピード。通常は9600、14400、56700。引数が省略された場合、デフォルト値9600が指定されます。
パリティ:チェックビットパリティ。可能な値は "none", "even", "odd", "mark", "space" 。通常は "none" (デフォルト値)。まれに "even", "odd" が使用されます。
ビット:転送されるバイト当たりのビット数。今日ではほとんどの場合「8」(デフォルト値)。ごく稀に「7」。それ未満の値が使用されることはまずありません。
ストップビット:ストップビット数(各バイト間の間隔)。可能な値は 1 (デフォルト値)、"1.5" (クォート文字列として設定)、2 。
コントロール:フロー制御の形式。可能な値は "None", "RTS/CTS" (デフォルト値)"XON/XOFF" 。

・システム、ドライバー、デバイスによって、全ての引数が常に正しく使用されるとは限りません。特に「タイムアウト」値はその通りに扱われない、または完全に無視される場合が少なくないようです。

※訳者の環境では、ボーレートまで省略不可のようです。


9.14 ファイルシステム情報

9.14.1 ファイル/ディレクトリが存在するかチェック(FileExists/DirExists)

bool = FileExists( ファイル )
bool = DirExists( ディレクトリ )


・指定のファイル/ディレクトリが存在すれば TRUE を、無ければ FALSE を返します。

・File...にディレクトリ名を与えたり、Dir...にファイル名を与えても、FALSE を返します。
例:FileExists( "¥Windows" ) : FALSE。"¥Windows"はファイルではないので。


9.14.2 ディスクの空き容量をチェックする(FreeDiskSpace)

int = FreeDiskSpace( ディレクトリ[, 単位 ] )

・指定のディレクトリが存在するストレージデバイスの空き容量を返します。単位 の指定が無ければバイトで、単位 を BYTES, KB, MB, GB (定数。「""」で囲まないこと)で指定すれば、その単位で返します。

・扱える戻り値の最大は、バイトでは 2147483147 ≒ 2GB、KBでは2TB、等々です。

・Windows Mobile デバイスではディレクトリ名を("¥miniSDカード" など)、PCではドライヴ名を("D:¥..." など)指定します。


9.14.3 ディスクサイズをチェックする(TotalDiskSpace)

int = TotalDiskSpace( ディレクトリ[, 単位 ] )

・指定のディレクトリが存在するストレージデバイスの総容量を返します。単位 の指定が無ければバイトで、単位 を BYTES, KB, MB, GB (定数。「""」で囲まないこと)で指定すれば、その単位で返します。

・扱える戻り値の最大は、バイトでは 2147483147 ≒ 2GB、KBでは2TB、等々です。

・Windows Mobile デバイスではディレクトリ名を("¥miniSDカード" など)、PCではドライヴ名を("D:¥..." など)指定します。

(※バイト単位における)2GBなどたいした容量ではないことはわかっているのですが、この数値は32ビットシステムがエラー回避策無しに扱える最大値なので、これを超えると面倒臭いことになるのです…(4GBも可能でしょうけれど、MortScriptは負の数(※の符号なし整数変換)を全くサポートしていませんので)。


9.14.4 ファイルサイズを取得する(FileSize)

int = FileSize( ファイル[, 単位 ] )

・ファイルサイズをバイトで返します。単位 の指定が無ければバイトで、単位 を BYTES, KB, MB, GB (定数。「""」で囲まないこと)で指定すれば、その単位で返します。

・扱える戻り値の最大は、バイトでは 2147483147 ≒ 2GB、KBでは2TB、等々です。


9.14.5 ファイル作成日時を取得する(FileCreateTime)

int = FileCreateTime( ファイル )

・ファイル作成日時を Unix タイムスタンプ形式で返します。ファイルが存在しなければ0を返します。

・日時の比較やフォーマット化については「9.11 時間」を参照のこと。


9.14.6 ファイル更新日時を取得する(FileModifyTime)

int = FileModifyTime( ファイル )

・ファイル更新日時を Unix タイムスタンプ形式で返します。ファイルが存在しなければ0を返します。

・日時の比較やフォーマット化については「9.11 時間」を参照のこと。


※ちなみに、ファイル作成/更新日時は、標準時(GMT)で格納されています。


9.14.7 ファイル属性を取得する(FileAttribute)

bool = FileAttribute( ファイル, 属性 )

・指定のファイル属性が真であれば TRUE を、そうでなければ FALSE を返します。

・使用可能な属性 は、以下の通り。
directory :指定のファイル名がディレクトリかどうか
hidden :隠しファイルかどうか
readonly :読み取り専用かどうか
system :システムファイルかどうか
archive :アーカイブかどうか

属性 は文字列として指定します("" で囲むか、文字列をその値とする変数/式など)。


9.14.8 ファイル属性を設定する(SetFileAttribute, SetFileAttribs)

SetFileAttribute( ファイル, 属性, セット? )

セット?を TRUE とすればファイル属性を設定、FALSE とすれば解除します。他の属性は変更されません。

・使用可能な属性 は、以下の通り。
directory :指定のファイル名がディレクトリかどうか
hidden :隠しファイルかどうか
readonly :読み取り専用かどうか
system :システムファイルかどうか
archive :アーカイブかどうか

属性 は文字列として指定します("" で囲むか、文字列をその値とする変数/式など)。

例:
SetFileAttribute( "¥Test.txt", "hidden", TRUE )
→ファイルを隠しファイルにします。
SetFileAttribute( "¥Test.txt", "readonly", FALSE )
→読み取り専用を解除します。


SetFileAttribs( ファイル, 読み取り専用? [, 隠しファイル? [, アーカイブ? ]] )

・指定のファイルの複数の属性を設定します。「TRUE」(あるいは0/FALSE以外の数)で指定の属性を設定、「FALSE」で解除します。空文字列("")を与えると、属性は変更されません。

例:
SetFileAttribs( "¥Test.txt", "", TRUE )
→隠しファイルに設定します。読み取り専用(とその他の属性)は変更されません。
SetFileAttribute( "¥Test.txt", FALSE )
→読み取り専用を解除し、他の属性は変更されません。


9.14.9 ファイルのバージョン番号を取得する(FileVersion/GetVersion)

string = FileVersion( ファイル )
GetVersion( ファイル, 変数, 変数, 変数, 変数 )


・指定のファイルのバージョン番号を、前者は文字列として("a.b.c.d")、後者は各変数にひとつずつ(整数値を)返します。

・各情報は全てのファイルに格納されているとは限らず、また正確とは限りません。もし情報があれば、バージョン番号は通常、4つのレベル:メジャー、マイナー、パッチ、ビルドに分かれています。

・関数 FileVersion() を使用すると、各バージョン番号は "." で連結されて返され、コマンド GetVersion() は、それぞれの値を各々の変数に代入します。


9.14.10 ディレクトリ中のファイル/ディレクトリ名を取得する(DirContents)

array = DirContents( ファイル, タイプ )


・指定のディレクトリ内にあるファイルおよび/もしくはディレクトリ一覧を、配列として返します。配列要素はパス無しのファイル/ディレクトリ名です(「C:\Directory\x.txt」ではなく「x.txt」)。

・引数 ファイル は、「\Windows\*.exe"」のようにパスとファイルフィルターで記述します。

・引数 タイプ は、DC_FILES, DC_DIRS, もしくは DC_ALL と記述します(定数。「""」で囲まないこと)。DC_FILES ではファイル名のみが、DC_DIRS ではディレクトリ名のみが、DC_ALL ではその両方が返されます。


9.15 ZIPアーカイブ

9.15.1 重要事項

・作者の環境では、ZIPアーカイブに格納されているファイルの上書きはできません。ZIPアーカイブの中に既にあるファイルが再度加えられた場合、ひとつのアーカイブの中に同じファイルがふたつ存在することになり、解凍時に不具合を生じるケースがありますので、ご注意下さい。

・ZIPアーカイブの中のファイル名について。エンコーディングに標準仕様といったものは無く、Unicodeは使用できません。MortScriptは、他の多くのWindows/DOSプログラムと同様、DOSコード ページ437を使用します。ファイル名に特殊文字や外国語文字(ロシア文字やギリシャ文字)(※日本語もしかり)を使用している場合は、文字化けを起こす可能性があります。加えて、JavaのZIP機能ではUTF8が使用されます。


9.15.2 単一のファイルを圧縮する(ZipFile)

ZipFile( 元ファイル, ZIPファイル, アーカイブ内のファイル名 [, 圧縮レート ] )

・指定のファイルをZIPアーカイブに追加します(※無ければZIPアーカイブを作ります)元ファイルZIPファイル は、フルパスで指定します。が、アーカイブ内のファイル名 は相対パスで指定します。

・圧縮レートは、1(=圧縮無し)から9(最高圧縮率)を指定します。省略された場合は、デフォルト値 8が使用されます。

例:
ZipFile( "¥Storage Card¥Test¥manual.psw", "¥Storage Card¥Test¥mans.zip", ¥
"test¥testman.psw" )



9.15.3 複数のファイルを圧縮する(ZipFiles)

ZipFiles( 元ファイル(複数), ZIPファイル [, サブディレクトリ? [, アーカイブ内のパス [, 圧縮レート ] ] ] )

・指定の複数のファイルをZIPアーカイブに追加します(※無ければZIPアーカイブを作ります)元ファイルは、XCopy や Move と同様に固定パス&ワイルドカード使用のファイル名(「"¥My Document¥*.psw"」など)で指定します。

サブディレクトリ? に「TRUE」を指定すると、ファイル名フィルタはサブディレクトリ内のファイルにも適用されます。たとえば、「"¥My Document¥*.psw"」は、「"¥My Document¥Word¥x.psw"」も含みます。

アーカイブ内のパス が省略された場合、アーカイブ中では元ファイル からの相対パスでディレクトリが作成され、アーカイブ内のパス の指定がある場合は、そのパス以下に、元ファイル からの相対パスでディレクトリが作成されます。たとえば、もしアーカイブ内のパスの指定が無ければ、「"¥My Document¥x.psw"」はアーカイブ内で「"x.psw"」として作成され、「"¥My Document¥Word¥x.psw"」はアーカイブ内で「"Word¥x.psw"」として作成されます。もしアーカイブ内のパスの指定が「"docs"」であれば、「"¥My Document¥x.psw"」はアーカイブ内で「"docs¥x.psw"」として作成され、「"¥My Document¥Word¥x.psw"」はアーカイブ内で「"docs¥Word¥x.psw"」として作成されます。

例:
ZipFiles( "¥Storage Card¥Test¥*.psw", "¥Storage Card¥mans.zip", TRUE, "test" )
→「¥Storage Card¥Test」以下のサブディレクトリ内を含む全ての「.psw」ファイルを、アーカイブ「"¥Storage Card¥mans.zip"」内の「test」ディレクトリ以下に圧縮します。

ZipFiles( "¥Storage Card¥Test¥*.jpg, "¥Storage Card¥jpgs.zip" )
→「¥Storage Card¥Test」直下の全ての「.jpg」ファイルを、アーカイブ「"¥Storage Card¥jpgs.zip"」に圧縮します。サブディレクトリは無視されます。


9.15.4 単一のファイルを解凍する(UnzipFile)

UnzipFile( ZIPファイル, アーカイブ内のファイル名, 解凍先ファイル )

・ZIPアーカイブ内の指定のファイルを解凍します。解凍先ファイルは、フルパスで指定します。解凍先として圧縮ファイルを指定した場合は、無視されます。

例:
UnzipFile( "¥Storage Card¥mans.zip", "test¥test.psw", ¥
"¥Storage Card¥test.psw" )
→「¥Storage Card¥mans.zip」の中の「test¥test.psw」を「¥Storage Card¥test.psw」として解凍します。


9.15.5 アーカイブ全体を解凍する(UnzipAll)

UnzipAll( ZIPファイル, 解凍先ディレクトリ )

・ZIPアーカイブ内の全てのファイルを、指定のディレクトリに解凍します。アーカイヴ内のパスは解凍先に反映され、もし無ければサブディレクトリを作成します。


9.15.6 アーカイブ内のパスを解凍する(UnzipPath)

UnzipPath( ZIPファイル, アーカイブ内のパス, 解凍先ディレクトリ )

・ZIPアーカイブ内の指定のディレクトリパス以下のファイルを全て解凍します。パス以下のサブディレクトリも解凍されます。アーカイブ内の指定のディレクトリは解凍先ディレクトリには作成されませんが、サブディレクトリは作成されます。解凍先ディレクトリは存在していなければなりません。

例:
UnzipPath( "¥Storage Card¥mans.zip", "test", ¥
"¥Storage Card¥test-unzip" )
→「¥Storage Card¥mans.zip」の中のディレクトリ「test」以下のサブディレクトリを含む全てのファイルを、ディレクトリ「¥Storage Card¥test-unzip」以下に解凍します。たとえば、「test¥sub¥x.psw」は「¥Storage Card¥test-unzip¥sub¥x.psw」として解凍されます。


9.16 接続

9.16.1 接続を確立する(Connect)

Connect
Connect( 接続名 )
Connect( タイトル, メッセージ )


・インターネットに接続します。

・引数を省略すると、デフォルトの接続を試みますが、いくつかのPPCでは上手く働きません。

・接続名を指定すると、その接続を使用します。接続名は、OSがシステムに設定しているものです。通常は「インターネット接続」など。

・タイトルとメッセージを引数として指定すると、利用可能な全ての接続名が(Choice のように)一覧表示され、選択された接続が使用されます。

★PC, PNAでは使えません。


9.16.2 切断する(CloseConnection/Disconnect)

CloseConnection
Disconnect


・CloseConnection は、Connect によって確立された接続を解放します。このコマンドは、システムに「MortScript はもうこのコネクションを使用しません」というシグナルを送るだけなので、接続がその後どうなるかはシステムに依存します。接続が持続される可能性もあります。

・いっぽう、Disconnect はアクティブ・シンクも含めた全ての接続を切断します。悲しいことに、WM5 AKU3以降では、この機能はもはや働きません。現在、プログラムから接続を切断する方法は無いようです。

★PC, PNAでは使えません。


9.16.3 接続をチェックする(Connected/InternetConnected)

bool = Connected()
bool = InternetConnected( [ URL ] )


・Connected() はRAS接続(リモートアクセス)が存在するかどうかチェックします。アクティブ・シンクはこれに該当し、ほとんどのデバイスの他の接続も、全てではないものの、該当します。接続が存在すれば「TRUE」を、無ければ「FALSE」を返します。

・InternetConnected() は、インターネットへの接続が存在するかどうかチェックします。悲しいことに、ほとんどのデバイスは、引数を与えない純粋なチェックには全て「TRUE」を返し、特定のサーバーにアクセスした時のみ、接続チェックを行います。このため、接続テストには、引数として何らかのURL("http://www.google.com" など)を渡すと良いでしょう。

★PC, PNAでは使えません。


9.17 インターネットアクセス

9.17.1 プロクシを設定する(SetProxy)

SetProxy( プロクシサーバー )

・httpアクセスのプロクシを設定します。Windows Mobile を使っていると、システム設定でプロクシを使用するのはそれほど簡単ではありませんので…。

プロクシサーバー は「proxy.foo.bar:8080」のように設定します。

★PC, PNAでは使えません。


9.17.2 ダウンロード(Download)

Download( URL, 先ファイル )

・Copy() と同様ですが、元ファイルとしてURL("http://..."、"ftp://..." など)を使用します。少し時間がかかるので、プログレスバーを表示します。

例:
Download( "http://www.sto-helit.de/test.txt", ¥
"¥Storage Card¥test.txt" )


★スマートフォン、PNAでは使えません。


9.17.3 他の可能性

・単一のファイルを読み込むファイル操作コマンドは全て、元ファイルとしてURLを指定することが可能です(Copy, ReadFile, IniRead と、いくつかのForEach... など)。


9.18 ディレクトリ

9.18.1 ディレクトリを作成する(MkDir)

MkDir( ディレクトリ )

・ディレクトリを作成します。

・複数の階層に渡るディレクトリを一度に作成することはできません!
たとえば、「MkDir( "¥My Documents¥Some¥Path" ) は、サブディレクトリ「Some」が既に存在しないと、失敗します。


9.18.2 ディレクトリを消去する(RmDir)

RmDir( ディレクトリ )

・空のディレクトリを消去します。

・フォルダ内にファイルやサブディレクトリがあってはなりません。


9.18.3 ディレクトリを移動する(ChDir)

ChDir( ディレクトリ )

・指定のディレクトリを「現在のディレクトリ」にします。

★PC版のみで使用可能。Windows Mobile には「現在のディレクトリ」という概念がありません。


9.18.4 システムパスを取得する(SystemPath)

string = SystemPath( タイプ )

・いくつかのシステムパスの、各言語でのディレクトリパスを返します。

タイプ は文字列として渡します("StartMenu" など)。

・使用可能なタイプ は、以下のとおり:
ProgramsMenu :スタートメニューの「プログラム」
StartMenu :「スタート メニュー」。スマートフォンでは利用できません。
Startup :「スタートアップ」
Documents :「My Documents」。PPC2002機では働きません。
ProgramFiles :「Program Files」。PPC2002機では働きません。
AppData :「Application Data」
ScriptExe :「MortScript.exe」へのディレクトリパス。ファイル名は含みません。スマートフォンでは働きません。
ScriptPath :現在のスクリプトへのディレクトリパス。ファイル名は含みません。
ScriptName :現在のスクリプト名。パスと拡張子は含みません。
ScriptExt :現在のスクリプトの拡張子(".mscr")。

例:
Run( SystemPath( "ScriptExe" ) ¥ "MortScript.exe", ¥
SystemPath( "ScriptPath" ) ¥ SystemPath( "ScriptName" ) & ¥
SystemPath( "ScriptExt" ))

→現在のスクリプトが実行されます。


9.19 レジストリ

9.19.1 レジストリの値を読み取る(RegRead)

value = RegRead( ルートキー, サブキー, 値名 )

・指定のレジストリの値を読み取ります。

・使用可能なルートキー は、以下のとおり:
HKCU :HKEY_CURRENT_USER
HKLM :HKEY_LOCAL_MACHINE
HKCR :HKEY_CLASSES_ROOT
HKUS :HKEY_USERS
4文字の省略型のみ使用可能です!v4.11 以来、定数としても定義しておいたので、""で囲む必要はありません。

値名 として空文字列を指定すると、デフォルト値が返されます(レジストリエディタで通常「<Default>」「@」などと表示されるもの)。

・値のデータ型は、自動的に認識されます。DWords は整数値として返され、文字列値は文字列、バイナリデータは16進数ダンプから成る文字列("010ACF" など)、複数行文字列値は単文字列を要素として持つ配列として返されます。


9.19.2 レジストリに書き込む(RegWriteString/RegWriteDWord/RegWriteBinary)

RegWriteString( ルートキー, サブキー, 値名, )
RegWriteDWord( ルートキー, サブキー, 値名, )
RegWriteBinary( ルートキー, サブキー, 値名, )
RegWriteMultiString( ルートキー, サブキー, 値名, 配列 )


・レジストリに値を書き込みます(※サブキー/値名が存在しない場合は、作成します)

・使用可能なルートキー名は「9.19.1 レジストリの値を読み取る(RegRead)」のとおり。

値名 として空文字列を指定すると、デフォルト値名が使用されます。

・RegWriteString は、文字列値を書き込みます(数値は自動的に変換されます)。

・RegWriteDWord は、数値を書き込みます(文字列は自動的に変換され、無効な文字列は"0"に変換されます)。

・RegWriteBinary は、バイナリデータを書き込みます。指定の値は、16進数ダンプから成る文字列("010ACF" など)でなければなりません。空白などは使用できません!

・RegWriteMultiString は、文字列値のリストを書き込みます。値は、配列として渡さなければなりません。インデックス1から始まる一連のインデックスを持つ要素のみが扱われます。値は必要に応じて文字列値に変換されます。

・例:
RegWriteDWord( "HKCU", "Software¥Microsoft¥Inbox¥Settings", "SMSDeliveryNotify", 1 )
→電話デバイスのSMS着信通知を生成
RegWriteString( "HKCU", "Software¥Mort¥MortPlayer¥Skins", "Skin", "Night" )
RegWriteBinary( "HKCU", "Software¥Mort¥Dummy", "", "C000" )
RegWriteMultiString( "HKCU", "Software¥Mort¥Dummy", "Days", Array( "Mon", "Tue", "Wed" ) )


9.19.3 値の存在をチェックする(RegValueExists)

bool = RegValueExists( ルートキー, サブキー, 値名 )

・指定の値が存在すれば TRUE を返し、無ければ FALSE を返します。

・使用可能なルートキー名は RegRead と同じ。


9.19.4 サブキー(レジストリパス)の存在をチェックする(RegKeyExists)

bool = RegKeyExists( ルートキー, サブキー )

・指定のサブキー(いわばレジストリの「サブディレクトリ」)が存在すれば TRUE を返し、無ければ FALSE を返します。

・使用可能なルートキー名は RegRead と同じ。


9.19.5 レジストリの値を削除する(RegDelete)

RegDelete( ルートキー, サブキー, 値名)

・指定のレジストリの値を削除します。

・使用可能なルートキー名は RegRead と同じ。


9.19.6 レジストリのサブキーを削除する(RegDeleteKey)

RegDeleteKey( ルートキー, サブキー, 値?, サブキー? )

・指定のサブキーをまるまる削除します。

値? を TRUE とすると、格納された値も全て削除されます。

サブキー を TRUE とした場合、値? の設定は、指定のキー以下のサブキーに対しても有効です。たとえば、「RegDeleteKey( "HKCU", "¥Software¥Something", FALSE, TRUE )」は、サブキー"Something" 以下の空のサブキーのみを削除します(値を持つサブキーは削除できないので)。

・キーが削除できなかった場合、ErrorLevel( "warn" ) 以下のエラーレベルにおいて、エラーメッセージを表示します。

・レジストリセクションの誤削除を避けるため、レジストリパスは(変数名の誤表記などによる)空文字列であってはならない仕様にしてあります。それでもこのコマンドは、注意して使用して下さい(特に変数や式でパスを指定する場合)。

・使用可能なルートキー名は RegRead と同じ。


9.20 ダイアログ

9.20.1 自由に文を入力する(Input)

string = Input( メッセージ [, タイトル [, 数値? [, 複数行? [, デフォルト ]]]] )

・自由に文を入力するシンプルなダイアログを表示し、入力された文を返します。

数値? を TRUE とすると、数字のみ入力可能です("-", "." も入力できません!)。

複数行? を TRUE とすると、複数行のテキストボックスが表示されます。このオプションを使用すると、ほとんどのデバイスで数値?オプションが無視されます。

デフォルト 文字列を指定すると、テキストボックスの中に表示されます。

数値? を TRUE としても、戻り値の型は文字列です。

・「9.20.10 BigMessage 等のフォントを指定する(SetMessageFont)」も参照のこと。


9.20.2 メッセージ(Message)

Message( テキスト [, タイトル ] )

・与えられたテキストを、メッセージウィンドウに表示します。


9.20.3 スクロールバー付きの大きなメッセージ(BigMessage)

BigMessage( テキスト [, タイトル ] )

・Message と同様ですが、システムのメッセージボックス機能(テキストの量でリサイズされる。スマートフォンを除く)を使用せず、スクロールバー付きの内蔵固定サイズダイアログボックスにテキストを表示します。

・「9.20.10 BigMessage 等のフォントを指定する(SetMessageFont)」も参照のこと。


9.20.4 カウントダウン/条件付きのメッセージ(SleepMessage)

SleepMessage( , メッセージ [ , タイトル [ , OK許可? [ , 条件 ] ] ] )

・「9.10.2 カウントダウン/条件付きの待機メッセージ(SleepMessage)」と「9.20.10 BigMessage 等のフォントを指定する(SetMessageFont)」を参照。


9.20.5 シンプルな質問(Question)

int = Question( 質問 [, タイトル [, タイプ ] ] )

・シンプルな質問を表示します。システムのデフォルトダイアログを使用していますので、ボタンのラベルはWindowsの各言語版に依存します。

・利用可能なタイプ は、以下のとおり:
YesNo :「はい」と「いいえ」(デフォルト)を表示
YesNoCancel :「はい」「いいえ」「キャンセル」を表示
OkCancel :「OK」と「キャンセル」を表示
RetryCancel :「再試行」と「キャンセル」を表示

タイプ は""で囲まれた文字列("YesNo")か、それを格納した変数で指定して下さい。

・各戻り値は、以下のとおり:
「はい」「OK」「再試行」:1(定義済み変数 "YES")
「いいえ」:0(定義済み変数 "NO")
「キャンセル」:2(定義済み変数 "CANCEL")

・注意:条件文の中での「キャンセル」は、条件が満たされたことになる(※「0」ではない値を返すので)ので、正しく分岐するためには「If( Question( ...., "OkCancel" ) = CANCEL ) 」あるいは「Switch( Question( .... ))」などと記述してください。


9.20.6 リストからの選択肢(Choice)

int = Choice( タイトル, プロンプト, デフォルト, タイムアウト, , {, } )
int = Choice( タイトル, プロンプト, デフォルト, タイムアウト, 配列 )


・「8.4 ChoiceDefault」と同様ですが、制御構造を開始するのではなく、選択されたエントリを返します。
「Switch( Choice( ... )) と ChoiceDefault( ... ) は同じ働きをします。
戻り値を後で、あるいは他の場所で使用する場合は、関数の Choice が便利でしょう。

・「9.20.9 Choice ダイアログの選択肢欄のサイズとフォントを設定する(SetChoiceEntryFormat)」も参照のこと。


9.20.7 ディレクトリを選択する(SelectDirectory)

string = SelectDirectory( タイトル, メッセージ [, デフォルト] )

・既存のディレクトリを選択するダイアログを表示します。デフォルト が指定されていて、かつそのディレクトリが存在する場合、そのディレクトリが選択された状態で表示します。


9.20.8 ファイルを選択する(SelectFile)

string = SelectFile( タイトル, 保存?, [フィルター [, メッセージ [, デフォルト]]] )

・ファイルを選択するダイアログを表示します。

保存? が TRUE である場合、ユーザは新しいファイル名を入力することが出来ます。そうでない場合には、既存のファイルを選択することのみ可能です。

フィルター を指定すると、そのファイルマスク(「*.txt」や「prefs.*」など)に一致したファイルのみを表示することが出来ます。

メッセージ は、PC版とそれ以外では動作が異なります。PCではシステムのダイアログが使用されます。PCのシステムダイアログに新たなテキストを追加することは出来ない(えぇ、実は出来ますが、高速軽量を旨とするスクリプト言語にとってはややこしすぎる)ので、メッセージ テキストはファイルタイプ欄(「すべてのファイル(*.*)」みたいな表示)の中に表示されます。Windows Mobileのシステムダイアログはかなり酷いので独自のダイアログを使用しており、メッセージ の指定があればダイアログボックスの一番上に表示されます。スクリプトを双方のプラットフォームで使用したい場合には、「テキストファイルを選択してください」のように、双方の表示にマッチするようなメッセージを指定したほうがよいでしょう。

デフォルト が指定された場合、そのファイルが選択された状態で表示します(保存? が FALSE である場合には、そのファイルが実際に存在する場合のみ)。


9.20.9 Choice ダイアログの選択肢欄のサイズとフォントを設定する(SetChoiceEntryFormat)

SetChoiceEntryFormat( 選択肢サイズ [, フォントサイズ, フォント名 ] )

・選択肢欄の高さと - もし指定があれば - フォントを変更します。このコマンドが呼び出された以降の、サブルーチンや制御構造を含む全てのブロック中のChoice ダイアログに適用されます。

選択肢サイズ は、ピクセル数で指定します。数値は、- フォントサイズと同様に - VGA画面のモバイル機器では2倍されます。

フォントサイズは、ポイント数で指定します。フォント名は「"Courier"」「"Tahoma"」のように指定します。全ての機器が全てのフォントを備えているわけではないことに留意して下さい。通常はTahoma(モバイル機器)かArial(デスクトップ)を指定するのがよいでしょう。

・「8.4 選択ダイアログによる分岐(Choice, ChoiceDefault)」と「9.20.6 リストからの選択(Choice)」を参照。


9.20.10 BigMessage 等のフォントを指定する(SetMessageFont)

SetMessageFont( フォントサイズ, フォント名 )

・MortScriptが生成する BigMessage、SleepMessage、Input のフォントを変更します。Message と Question はシステムのダイアログを使用しているので、フォントの変更は出来ません。

・各引数の指定方法は、上記の SetChoiceEntryFormat のフォント用引数と同様です。

・「9.20.3 スクロールバー付きの大きなメッセージ(BigMessage)」、「9.20.1 自由に文を入力する(Input)」と「9.20.4 カウントダウン/条件付きのメッセージ(SleepMessage)」を参照。


9.21 ステイタスウィンドウ

9.21.1 ステイタスウィンドウとは?

9.20 ダイアログ のダイアログ群は、スクリプトの実行を一旦中断し、「OK」ボタン押下などしないと続行しないので、進行状況(長時間の処理やデバッギングなど)を知らせるには向いていません。

・そこでステイタスウィンドウです。これを使えば、スクリプトの実行を中断することなくメッセージを表示させることが出来ます。スタイルには2種類あり、ひとつは常に最新のメッセージのみを表示するもの( BigMessage のように)、もうひとつは新しいメッセージのいくつかをリスト表示するもの( Choice ダイアログのように)です。ウィンドウ表示時/非表示時を問わず、メッセージ行を追加したり削除したりすることが出来ます。

・ステイタスウィンドウは、表示状態になった際、および表示を命令する特有のコマンド(「9.21.8 ステイタスウィンドウを可視化する(StatusShow) 」を参照)を使用した場合のみ、前面に表示されます。これによって、いちいち前面に飛び出してくるウィンドウに悩まされることなく、メッセージ行を追加/削除することが出来ます。

・指定によっては、ステイタスウィンドウにキャンセルボタンを追加してスクリプトを中止したり、スクリプトが終了してもウィンドウを表示させ続ける(この場合はOKボタンでウィンドウを閉じる必要あり)ことが出来ます。


9.21. 2 表示タイプを設定する(StatusType)

StatusType( スタイル [, 表示継続? [, キャンセルボタン? ] ] )

・引数 スタイル は、ステイタスウィンドウの表示形式を決定します。使用可能な値は、以下の通り(※定数。「""」で囲まないこと。以下同様)

ST_HIDDEN : ステイタスウィンドウを非表示
ST_LIST : リスト形式でメッセージ行を表示
ST_MESSAGE : 最新のメッセージ行のみを表示

・既存のメッセージ行は スタイル が変更されても保持されます。例えば、ST_LIST から ST_MESSAGE に変更すると、リスト中最新のメッセージ行が単一のメッセージとして表示されます。

表示継続? に TRUE を指定すると、スクリプト終了後もウィンドウを表示し続けます。スクリプト終了後にはOKボタンが表示され、これを押すことによってウィンドウは閉じます。

キャンセルボタン? に TRUE を指定した場合、スクリプト継続中にキャンセルボタンが表示され、これを押すことによってスクリプトは中止されます。これは「9.22.7 起動中のスクリプトを終了させる(KillScript)」と同様の動作をしますが、ファイル操作は中断しません。


9.21.3 ウィンドウタイトルと但し書きを設定する(StatusInfo)

StatusInfo( タイトル [, 但し書き ] )

・ウィンドウタイトルと、メッセージ/リストの上部に表示される但し書きを設定します。


9.21.4 リスト形式の表示を設定する(StatusListEntryFormat)

StatusListEntryFormat( 選択肢サイズ [, フォントサイズ, フォント名 ] )

・リスト形式メッセージの表示スタイルを定義します。引数は、「9.20.9 Choice ダイアログの選択肢欄のサイズとフォントを設定する(SetChoiceEntryFormat)」と同様です。


9.21.5 リスト形式の表示数を設定する(StatusHistorySize)

StatusHistorySize( 表示数 )

・リスト形式時の表示行数を設定します。

・指定された表示数は、ステイタスウィンドウを非表示/単一メッセージ表示に変更した後も、保持されます。デバッグ目的などで、スクリプト終了時にログを表示させたり、メッセージ行をファイルに書き込んだり(「9.21.9 ステイタスメッセージをファイルに書き出す(WriteStatusHistory) 」を参照)したい場合に便利です。


9.21.6 ステイタスメッセージを追加する(StatusMessage, StatusMessageAppend)

StatusMessage( メッセージ [, スタイル [, 表示継続? [, キャンセルボタン? ]]] )
StatusMessageAppend( テキスト )


・StatusMessage は、新しいメッセージ行を追加します。リスト形式では、リストの末尾に新しい項目を加えてハイライト表示します。単一メッセージ形式では、このコマンドで指定した新メッセージのみ表示します。その他の引数は、「9.21.2 表示タイプを設定する(StatusType)」と同様です。これらによって、メッセージとその形式を一度に変更出来ます。

・ステイタスウィンドウは必ずしも可視的であるとは限りません(「9.21.8 ステイタスウィンドウを可視化する(StatusShow) 」を参照)。警告メッセージなどの用途では、「9.20.2 メッセージ(Message)」「9.20.4 カウントダウン/条件付きのメッセージ(SleepMessage)」を使った方がよいかもしれません。

・StatusMessageAppend では、指定のテキストが最新のメッセージ行の末尾に付加されます。進行状況を「....」の増加で表したり、処理成功/不成功などの処理結果を表示するには便利でしょう。

例:
StatusMessage( "Step 1", ST_LIST, TRUE )
For i =1 to 10
    StatusMessageAppend( "." )
Next
StatusMessageAppend( "OK" )
StatusMessage( "Finished" )


9.21.7 ステイタスメッセージを消去する(StatusRemoveLastMessage, StatusClear)

StatusRemoveLastMessage()
StatusClear()


・StatusRemoveLastMessage は、最新のメッセージ行を消去します。メッセージ行を“上書き”したい時に役立ちます(「ファイルをコピーしています」から「ファイルがコピーされました」に変化させたい時など)。新たなメッセージ行が追加されるまでは、ひとつ前のメッセージ行が選択された状態で表示されます。

・StatusClear は、全てのメッセージ行を消去します。

・いずれのコマンドを使用した場合も、メッセージが全部消えてウィンドウが空になるのは、あまり格好の良いものではありませんね。すぐ後ろに StatusMessage を記述するか、ウィンドウが非表示されている状態の時に使用するのがよいでしょう。


9.21.8 ステイタスウィンドウを可視化する(StatusShow)

StatusShow()

・「9.21.1 ステイタスウィンドウとは?」で既に述べたように、新しいメッセージ行が追加されても、他のアプリケーションが前面に出ていれば、ステイタスウィンドウはバックグラウンドに居続けます。このコマンドを使用すると、ステイタスウィンドウは可視化されアクティヴになります。

※このコマンドは、 StatusType( ST_HIDDEN ) で非表示化されているウィンドウを可視化するものではありません。そうしたい場合は、StatusType( ST_HIDDEN 以外 )を再度記述します。


9.21.9 ステイタスメッセージをファイルに書き出す(WriteStatusHistory)

WriteStatusHistory( ファイル [, 追記? [, 文字コード ] ] )

・蓄積された全てのメッセージ行(例:リスト形式で表示されている or 表示されるはずの内容)を、ファイルに書き出します。

・各引数は「9.13.2 テキストファイルに書き込む(WriteFile)」と同様です。もちろん内容はこの場合、メッセージ行のみとなりますが。

※訳者の環境では現在のところ、文字コード を省略しない限り、どの文字コードでも追記は出来ないようです。

※WriteFile で「utf8」「utf8-prefix」指定時に発生する重大な問題は、このコマンドでは発生しませんでした。


9.22 プロセス(起動中のアプリケーション)

9.22.1 プロセス用関数が利用可能かどうか?(SupportsProcHandling)

bool = SupportsProcHandling()

・Kill や ProcExists のようなプロセス用関数がそのデバイスで利用可能であれば TRUE を返します。

・この関数はナヴィゲーション機器用に用意したものですが、他の機器でも利用可能です。

・Kill や ProcExists のようなMortScript関数は、あるシステムライブラリ(toolhelp.dll)を必要とし、これは全ての“簡易版”Windows CE機器に備えられているわけではありません。このシステムライブラリ無しにこれらの関数を使用すると、エラーを吐きます。SupportsProcHandling()を使えば、(代替策としてウィンドウ関数を使用するなどして)エラーを回避したり、独自のエラーメッセージを表示したり出来ます。


9.22.2 プロセスの存在をチェックする(ProcExists)

bool = ProcExists( プロセス名 )

・指定のプロセスが起動中ならば TRUE を、そうでなければ FALSE を返します。

プロセス名 は、実行ファイル(.exe)名です。通常は、「solitaire.exe」のようにパス無しで指定するのがよいでしょう。そのほうが速いし、余計な間違い(過ったパスやミスタイピングやファイルロケーション違いなど)を避けられますので。しかし、フルパスで指定することも可能です。

・デスクトップ機では、フルパス指定によるチェックが全てのプログラムで利用可能とは限りません。特に、システムスレッドやサービスに関して、システムからパスを問い合わせることは不可能だからです。


9.22.3 スクリプトプロセスの存在をチェックする(ScriptProcExists)

bool = ScriptProcExists( スクリプト名 )

・指定の MortScript が起動中ならば TRUE を、そうでなければ FALSE を返します。

・「ProcExists」は、個々のMortScript には使えません。MortScript のプロセス名は常に「MortScript.exe」だからです。

スクリプト名 は、ファイルパス無しの".mscr"名("myscript.mscr" など)、もしくはフルパス("¥My Documents¥myscript.mscr"。PC版ではドライブ名が必要です)で指定します。

・「9.22.7 起動中のスクリプトを終了させる(KillScript)」も併せて参照のこと。


9.22.4 アクティブなウィンドウのプロセス名(ActiveProcess)

string = ActiveProcess( [ フルパス? ] )

・現在アクティブなウィンドウのプログラム名を返します。

フルパス? にTRUEを指定した場合、フルパスが返され、そうでなければパス無しの実行ファイル名を返します。

・デスクトップ機では、フルパスの取得が常に可能とは限りません。


9.22.5 指定のウィンドウのプロセス名(WindowProcess)

string = WindowProcess( ウィンドウ名 [, フルパス? ] )

・指定のウィンドウ名を持つウィンドウのプログラム名を返します。

フルパス? にTRUEを指定した場合、フルパスが返され、そうでなければパス無しの実行ファイル名を返します。

・デスクトップ機では、フルパスの取得が常に可能とは限りません。


9.22.6 起動中のプロセスを強制終了する(Kill)

Kill( プロセス名 )

・アプリケーションを強制終了します。プロセス名 は、ファイルパス無しの実行ファイル名("solitaire.exe" など)か、フルパスのどちらかでなければなりません。ProcExists と同様、パス無しで指定するほうがよいでしょう。詳しくは「9.22.2 プロセスの存在をチェックする(ProcExists)」を参照のこと。

警告:このコマンドは、データを保存せずにプロセスを強制終了します。編集中のデータは失われ、クラッシュもしくはエラーを引き起こす可能性があります。可能な限り、「Close」コマンド(データ保存ダイアログなどとともにアプリケーションを正常に終了させます)を使って下さい。


9.22.7 起動中のスクリプトを終了させる(KillScript)

KillScript( スクリプト名 )

・指定のスクリプトを終了します。KillScript は、不正な終了によるトラブルを避けるため、スクリプト中で現在実行中のコマンドが終了するまで3秒待ちます。これが働かない場合、プロセスは Kill と同様に強制終了されます。

スクリプト名 は、ファイルパス無しのスクリプト名(".myscript.mscr" など)、もしくはフルパス("¥My Documents¥myscript.mscr"。PC版ではドライブ名が必要です)で指定します。

・スクリプト名がパス無しで指定された場合、他のディレクトリにある同名のスクリプトを終了させてしまう可能性がありますので、可能な限りフルパスで指定するのが良いでしょう(「9.18.4 システムパスを取得する(SystemPath)」などを使用)。

・スクリプトは二重に起動できないことに留意して下さい。バックグラウンドタスクを起動したり終了したりしたい場合、そのプロセスが起動中かどうか(ScriptProcExists で)調べ、起動中でなければ(Run コマンドで)起動させ、起動中ならば KillScript で終了させるスクリプトを追加すると良いでしょう。

(※バックグラウンドタスクを終了させたい場合、“フォアグラウンド”のスクリプト中には)RunWait や CallScript は使用しないで下さい!呼び出す側のスクリプトは、呼び出されたバックグラウンドタスクが完了するまでアクティブのままであり、ということは、バックグラウンドスクリプトを終了させるためにもう一度起動できなくなるからです!

・例:
backScript = SystemPath( "ScriptPath" ) ¥ "background.mscr"
If( ScriptProcExists( backScript ))
    If(Question( "Stop background process?" ) = YES )
        KillScript( "background.mscr" )
    EndIf
Else
    Run( backScript )
EndIf



9.23 シグナル

9.23.1 システム音量を変更する(SetVolume)

SetVolume( )
int =Volume()


・システム音量を指定の値に変更します。可能な値は0(オフ)から255(最大)です。Loox720 など、いくつかのデバイスは、数値を4〜16段階に丸めますが、ほとんどのデバイスは実際に256段階でコントロール可能です。


9.23.2 WAVファイルを再生する(PlaySound)

PlaySound( WAVファイル )

・指定のWAVファイルを再生します。スクリプトは、再生が終わるまで残りのプロセス実行を待ちます。


9.23.3 バイブレート(Vibrate)

Vibrate( ミリ秒 )

・指定の時間だけデバイスをバイブレートします。

・PC版では、警告音を鳴らします。

・PPCにおいて、バイブレータはステイタスLEDと同様にアクセスされますが、標準のアクセス番号はありません。MortScript は、「利用可能な『LED』のうち、最後のものがバイブレータ」と推測してアクセスし、ほとんどのデバイスで上手く働くようです。が、デバイスによっては、LEDが点灯したり、何も起こらなかったりする可能性はあります。


9.24 ディスプレイ/スクリーン

9.24.1 ある座標の色コードを取得する(ColorAt)

int = ColorAt( x, y )

・スクリーン上の指定の座標ピクセルの色コードを返します。いくつかのデバイスでは、タイトルバーは除外され、Todayスクリーンの背景の色が返されます。

※ColorAt() が返す色コードは、いわゆるHTMLカラーコードのR, G, B をB, G, Rに並べ替えた6桁の16進数を、10進数に変換したものです。
例:
白(#FFFFFF) : 16777215
赤(#FF0000)(→0000FF): 255
緑(#00FF00):65280
青(#0000FF)(→FF0000): 16711680

※少なくとも訳者の環境では、スクリーン外の座標を指定すると「-1」を返します。


9.24.2 スクリーンの一部を文字列に変換する(ScreenToChars)

Array =ScreenToChars( x, y, , 高さ, 色コード[, 背景色? [, 前景用文字[, 背景用文字 ]]] )

・スクリーンの一部を、指定の色コードで前景色と背景色を区別して、文字列の配列に変換します。

・例えば、スクリーンに黒い円があるとして、色コード を「0」(=黒)と指定して ScreenToChars を実行すると、下のような配列に変換します。

array [1 ] =="___####___"
array [2 ] =="_########_"
array [3 ] =="##########"
array [4 ] =="##########"
array [5 ] =="##########"
array [6 ] =="_########_"
array [7 ] =="___####___"

・つまりこれは、ColorAt の機能拡張版のようなものでしかなく、文字認識機能ではありません。が、あるテキストや画像が表示されているかどうかをチェックするのに、単一座標を ColorAt するよりは、より信頼性のある方法でしょう。

・ClearType (フォントのエッジを滑らかにする、Windows のシステムオプション)が有効になっていると、うまい結果が得られない場合があります。

背景色? に TRUE を設定すると、指定の色以外の全ての色が前景として扱われます。そうでなければ、指定の色のみが前景として扱われます。

前景用/背景用文字 を省略すると、前景用は「#」、背景用は「_」が使用されます。これら2つの引数を指定することによって、別の文字に変更できます。

高さ は取得/変換する範囲のピクセル数、xy はその範囲の左上角の座標です。

前景用/背景用文字 には、全角文字、複数文字列も使用できます。


9.24.3 RGB値から色コードを生成する(RGB)

int = RGB( red, green, blue )

・赤、緑、青の10進数値(それぞれ0〜255)を、ColorAt() が返すフォーマットに変換します。両者の比較に便利です。


9.24.4 色コードから赤/緑/青の値を取得する(Red, Green, Blue)

int = Red( 色コード )
int = Green( 色コード )
int = Blue( 色コード )


・RGB() の逆を行います。ColorAt() やRGB() が返す形式の色コード から、赤、緑、青の値(それぞれ0〜255)を抽出して返します。


9.24.5 画面を回転させる(Rotate)

Rotate( 方向 )

・画面を回転します。有効な値は以下のとおり:
0:デフォルト(ポートレート)、90:ランドスケープ、
180:上下さかさま、270:ランドスケープの逆

方向 は絶対値です。Rotate( 90 ) を繰り返したからといって、ぐるぐる回転するわけではありません。

★PC、スマートフォン、WM2003以下のPPC/PNAでは使えません。


9.24.6 バックライトの明るさを設定する(SetBacklight)

SetBacklight( バッテリー, ACアダプタ )

・バックライトを指定の明るさに設定します。

バッテリー はバッテリー使用時の明るさ、ACアダプタ はACアダプタ使用時の明るさです。

・有効な値は、0〜100です。

・全てのデバイスで働くとは限りません!また、最大の明るさを設定する値は、機種によって異なります。現在作者の知る限り、10や60や100が最高の値であるデバイスがあります。また、10がオフで0が最高、といったように、逆の数値が有効なデバイスもあり、0が最高、1が最低、10が少し暗い、というデバイスもあるようです。

※W-ZERO3では、1〜6が有効な値ですが、バッテリー使用時の設定は無視されるようです( WS003/007SH で確認)。

★PC、PNA、スマートフォンでは使えません。


9.24.7 ディスプレイをオン/オフする(ToggleDisplay)

ToggleDisplay( オン? )

・バックライトを指定の明るさに設定します。

オン? = TRUE でディスプレイをオン、FALSE でオフにします。

★PC、PNA、スマートフォンでは使えません。


9.24.8 スクリーンのサイズを取得する(ScreenWidth, ScreenHeight)

int = ScreenWidth()
int = ScreenHeight()


・スクリーンの幅、高さを、それぞれピクセル数で返します。


9.24.9 スクリーンの状態(方向/解像度)をチェックする(Screen)

bool = Screen( タイプ )

タイプ で指定された条件が満たされれば TRUE を、そうでなければ FALSE を返します。

タイプ に指定可能な値は、以下のとおり:
"landscape" :ランドスケープモードかどうか
"portrait" :ポートレートモードかどうか
"squere" :正方形スクリーンかどうか
"vga" :VGAかどうか。デフォルト/リアル/トゥルーVGAは区別しません。
"qbga" QVGAかどうか

★PCでは使えません。


9.24.10 Todayスクリーンを再表示する(RedrawToday)

RedrawToday

・Todayスクリーンを再表示します。(※Todayスクリーン関係の)レジストリを変更した場合に(※リセットしなくても変更をTodayスクリーンに反映できるので)便利です。


9.24.11 処理中カーソルを表示する/隠す(ShowWaitCursor/HideWaitCursor)

ShowWaitCursor
HideWaitCursor


・ShowWaitCursor は処理中カーソル(砂時計カーソル。Windows Mobile ではクルクル回る円盤型カーソル)を表示し、HideWaitCursorは隠します。


9.24.12 現在のカーソルの種類を取得する(CurrentCursor)

string = CurrentCursor( [ウィンドウ名] )

・指定のウィンドウ上にある、現在のカーソルの種類を取得します。ウィンドウ名 が省略されると、現在前面に出ているウィンドウが扱われます。

・戻り値は、以下のいずれかです:
arrow :標準の矢印
wait :砂時計
cross :照準十字形
help :クエスチョンマーク
uparrow :※上向き矢印
other :その他(アプリケーション独自のカーソルなど)

・この関数は、必ずしもユーザに見えているカーソルを返すとは限りません。例えば、アプリケーションがスタートした際やウィンドウを持たない場合に、Windows Mobile は砂時計(というよりはクルクル回る円盤)を表示しますが、デスクトップ用 Windows では「アプリケーションスタートカーソル」(小さい砂時計付き矢印)もしくはウィンドウリサイズ矢印を表示したりします。これらのカーソル種類を取得する確実な方法はありません。あくまでも“ウィンドウが Windows に表示させようとしている”カーソル種類を取得できるだけです。


9.24.13 入力パネルを表示する/隠す(ShowInput/HideInput

ShowInput
HideInput


・それぞれ、入力パネル(スクリーンキーボードなど)を表示します/隠します。

★PC、スマートフォンでは使えません。


9.24.14 入力パネルの種類を設定する(SetInput)

SetInput( 入力タイプ )

・現在の入力タイプを設定します(SetInput( "Keyboard" ) 、SetInput( "Transcriber" ) など)。

・このコマンドを使ったスクリプトを公開する場合には、入力タイプは機種/言語によってローカライズされている可能性があることに留意して下さい。

※日本語版 Windows Mobile の標準入力タイプは、「ひらがな/カタカナ」「ローマ字/かな」「手書き検索」「手書き入力」(いずれも文字は全角、スラッシュは半角)の4種です。

★PC、スマートフォンでは使えません。


9.25 クリップボード

9.25.1 テキストをクリップボードにコピーする(SetClipText)

SetClipText( テキスト )

・与えられたテキストをクリップボードにコピーします。


9.25.2 クリップボードのテキストを取得する(ClipText)

string = ClipText()

・クリップボードのテキストを返します。

・コピーされたデータのテキスト型式がクリップボード上で利用可能であることが前提条件となります。これは、クリップボード上のデータを作成したアプリケーションに依存します。


9.26 メモリ

9.26.1 メインメモリの空き領域(FreeMemory)

int = FreeMemory( 単位 )

・メインメモリの(※プログラム実行用の)空き領域を返します。単位 の指定が無ければバイトで、単位 を BYTES, KB, MB, GB (定数。「""」で囲まないこと)で指定すれば、その単位で返します。

・Windows Mobile 5 以前のデバイスでは、デバイスのメモリとプログラム実行用メモリ(FreeMemory() が返す値の領域と、FreeDiskSpace( "¥" )が返す「RAMディスク」の値の領域)を動的に分割します。


9.26.2 メインメモリの合計(TotalMemory)

int = TotalMemory( 単位 )

・メインメモリの(※プログラム実行用の)合計を返します。。単位 の指定が無ければバイトで、単位 を BYTES, KB, MB, GB (定数。「""」で囲まないこと)で指定すれば、その単位で返します。


9.27 電源

9.27.1 外部電源使用中かどうかチェックする(ExternalPowered)

bool = ExternalPowered()

・デバイスが外部電源使用中なら TRUE を、バッテリ使用中なら FALSE を返します。

・PC版は、バッテリ使用中のノートブックであっても、常に TRUE を返します。


9.27.2 現在のバッテリレベル(BatteryPercentage, BackupBatteryPercentage)

int = BatteryPercentage()
int = BackupBatteryPercentage()


・現在のバッテリレベルをパーセントで返します。外部電源を使用している場合は、正確な値を返さないデバイスもあります。

・バックアップ電池に関しても同様です。が、全てのデバイスで利用可能なわけではありません。コンデンサーを使用するもの、問い合わせ不可であるもの、バックアップ電池を持たないもの(電池交換できない廉価版機器や、バックアップ電池なしにデータを保持するWM5以降の機種など)があります。これらの場合、どのような値が返ってくるかは、デバイスによります。

・PC版は、バッテリ使用中のノートブックであっても、常に100を返します。


9.27.3 デバイスの電源をオフにする(PowerOff)

PowerOff

・デバイスの電源をオフ(スタンバイモード)にします。スクリプトは、それ以後電源オンになってから、継続します。

・電源オン直後には、ストレージカードにアクセスできません。Sleep や While( not FileExists(...)) などを使用して、エラーを回避できます。

★PCでは使えません。


9.27.4 自動電源オフを回避する(IdleTimerReset)

IdleTimerReset

・システムの自動電源オフ経過時間をリセットします。自動電源オフを延期したり、(ループの中で呼び出された場合は)回避したりできます。

・悲しいことに、このコマンドで自動バックライトオフを回避することはできません。システムは、自動バックライトオフ用には別のタイマーを使用し、このタイマーに指示したり設定値を変更したりすることができないためです(少なくともこれについて書かれた文書がありません)。

・このコマンドが作用しないデバイスも、わずかながらあるようです。

★PCでは使えません。


9.28 システム

9.28.1 システムのバージョンを取得する(SystemVersion)

value = SystemVersion( [ 要素 ] )

・システムのバージョンを返します。引数が無い場合、および無効な値の場合は、"major.minor.build" の形式の文字列(XP/SP2 の場合は "5.1.2600" 、WM5 の場合は "5.1.195" など)を返します。

・引数を指定すると、パートのひとつを返します。指定可能な値は、以下のとおり:
"major" :メジャー・バージョンナンバー(整数値)を返します
"minor" :マイナー・バージョンナンバー(整数値)を返します
"build" :ビルドナンバーを返します(整数値)
"platform" :プラットフォームを返します。"Win95"(98とMeを含む)、"WinNT"(XPとVistaを含む)、"WinCE"(スマートフォン、PPCとWindows Mobileを含む)のどれかです。


9.28.2 MortScript の"版"を取得する(MortScriptType)

string = MortScriptType()

・スクリプト実行にMortScript のどの版が使用されているかを返します。現在、戻り値は以下のどれか:
"PPC" :PocketPC
"PC" :PC(デスクトップ)
"SP" :スマートフォン
"PNA" :PocketNavigation(Windows Mobile 小型ナビゲーション機器)


9.28.3 MortScript のバージョンを取得する(MortScriptVersion, GetMortScriptVersion)

string = MortScriptVersion()
GetMortScriptVersion( 変数, 変数, 変数, 変数 )


・MortScriptのバージョンを、文字列(「a.b.c.d」)もしくは個々の整数値が代入された変数で取得します。

・関数 MortScriptVersion() は、各パートがピリオドで連結された形式(「4.1.0.0」など)で返します。コマンド GetMortScriptVersion() は、各パートをそれぞれの変数にひとつずつ代入します。


9.28.4 デバイスを再起動する(Reset)

Reset

・ソフトリセットを実行します。自分だけで使うスクリプト以外で使用する場合は、警告や問合せののち記述して下さい。

★PCでは使えません。



10 旧シンタックス(文法)とコマンド


以下の文法、条件式、コマンドは、下位互換性維持のため、依然として使用可能ですが、今後は使用しないで下さい

※この章は割愛します。



11 寄付


えぇー、このプログラムはもちろんフリーウェアなので、無料です。でも、もしあなたが「わぁ、なんてすごいプログラムなんだ。作者の努力に対していくらかお金をあげたいな」と思われるなら、私はありがたく頂戴いたします。

www.paypal.com にアクセスし、登録するかログインして、"mort@sto-helit.de" 宛に送金して下さい。

私の銀行口座については、お問い合わせ下さい。不特定多数には公開したくありませんし、有用なのはEU在住の方々にとってだけですから。