version 11 (Modified)
RECEIVE PACKET ({DocRef; }receiveVar; stopChar | numChars)
| 引数 | 型 | 説明 | |
| DocRef | DocRef | ドキュメント参照番号, または | |
| カレントチャンネル (シリアルポートまたはドキュメント) | |||
| receiveVar | 文字変数 | BLOB変数 | データを受け取る変数 | |
| stopChar | numChars | 文字 | 数値 | 受信を停止する文字, または | |
| 受信する文字数 |
説明
RECEIVE PACKET コマンドは、シリアルポートまたはドキュメントから文字を読み込みます。
docRefを指定した場合、このコマンドはOpen document, Create document または Append documentで開かれたドキュメントから文字を読み込みます。docRefを指定しない場合、このコマンドはSET CHANNELコマンドで開かれたシリアルポートかドキュメントから文字を読み込みます。
読み込み元に関わらず、読み込まれた文字は、テキスト、文字、またはBLOB型のreceiveVar変数に返されます。文字がSEND PACKET コマンドで送信された場合、型はパレットが送信された際の型に対応しなければなりません。
Notes:
・非Unicodeモード (互換モード) では、文字変数は固定長の最大255バイトまでです。テキスト変数は固定長を持たず32,000バイトまでを受け入れます。
・受信したパケットがBLOB型の場合、コマンドはUSE ASCII MAP コマンドで指定された文字セットを考慮しません。BLOBには変更されないデータが返されます。
特定の文字数まで読み込むためには、numCharsにその文字数を渡します。receiveVarがテキスト型の場合、一回の呼び出しで、Unicodeモードでは2GBのテキストを、非Unicodeモードでは32,000バイトまで読み込めます。この場合、最大文字数を指定するためにMAXTEXTLENBEFOREV11をnumCharsに渡せます。
特定の文字列(1桁以上の文字で構成される)が現われるまで文字を読み込むには、stopCharにその文字列を渡します(この文字列はreceiveVarに含まれません)。
この場合、stopCharで指定した文字を見つけることが出来ないければ:
・RECEIVE PACKETがドキュメントを読み込むとき、ドキュメントの最後で読み込みを終了します。
・RECEIVE PACKETがシリアルポートから読み込むとき、タイムアウト (SET TIMEOUT参照) に達するか、または利用者が割込(以下を参照)をかけるまで待ち続けます。
RECEIVE PACKETの実行中、利用者はCtrl+Alt+Shift (Windows) またはコマンド+Option+Shift (Macintosh)キーを押下することで、割込をかけることが出来ます。割込が発生するとエラー-9994が生成され、ON ERR CALLでインストールされたエラー処理メソッドでとらえることができます。通常、シリアルポートで通信している場合のみ、割込を処理します。
ドキュメントを読み込む場合、最初のRECEIVE PACKETコマンドは、ドキュメントファイルの先頭から読み込みを開始します。その後のデータ読み込みは、最後に読み込まれた文字の次から開始します。
Note: このコマンドは、SET CHANNELを用いて開かれたドキュメントに対して有効です。一方で、Open document, Create document あるいは Append documentで開かれたドキュメントに関しては、Get document position や SET DOCUMENT POSITIONコマンドを使用して、次の書き込み (SEND PACKET) や読み込み (RECEIVE PACKET) を行うドキュメント中の位置を取得したり設定したりできます。
ファイルの最後を越えて読み込もうとした場合、RECEIVE PACKETは、そのポイントまでに読み込んだデータを返し、システム変数OKに1を代入します。その次のRECEIVE PACKETは空の文字列を返し、システム変数OKに0を代入します。
Note: 非Unicodeモード (互換モード) で、WindowsのドキュメントをRECEIVE PACKETコマンドを使って文字を読み込む際で、Windows文字をMacintosh文字へ変換するためにASCIIマップを使用しない場合は、Win to Mac関数を使用できます。
例題
1. 以下の例は、20バイトのデータをシリアルポートから読み込み、変数getTwentyに格納します:
RECEIVE PACKET (getTwenty; 20)
2. 以下の例は、変数myDocで参照されるドキュメントからデータを読み込み、変数vDataに格納します。ここでは改行が見つかるまで読み込みます:
RECEIVE PACKET (myDoc;vData;Char (Carriage Return))
3. 以下の例は、変数myDocで参照されるドキュメントからデータを読み込み、変数vDataに格納します。HTMLタグ</TD>(テーブルセルの終わり)が現われるまでデータを読み込みます:
RECEIVE PACKET (myDoc;vData;"</TD>")
4. 以下の例は、ドキュメントファイルから読み込んだデータをフィールドに格納します。データは、固定長で格納されています。このメソッドは、サブルーチンを呼び出してデータの後ろに付随する不要なスペースを取り除きます:
$vhDocRef := Open document ("";"TEXT") ` TEXTドキュメントを開く
If (OK=1) ` ドキュメントが開かれたら
REPEAT ` データがなくなるまで繰り返す
RECEIVE PACKET ($vhDocRef; $Var1; 15) ` 15文字読み込む
RECEIVE PACKET ($vhDocRef; $Var2; 15) ` 2番目のフィールドに同じことを行う
If (($Var1#"")|($Var2#"")) ` どちらかのフィールドが空でなければ
CREATE RECORD([People]) ` レコードを作成
[People]First := Strip ($Var1) ` 名を格納
[People]Last := Strip ($Var2) ` 姓を格納
SAVE RECORD([People]) ` レコードを保存
End if
Until (OK =0)
CLOSE DOCUMENT ($vhDocRef) ` ドキュメントを閉じる
End if
データの終わりのスペースは以下のStripメソッドで取り除きます:
For ($i; Length ($1); 1; -1) ` 文字の最後からループ If ($1[[$i]] # " ") ` スペースでなければ… $i := -$i ` ループを終了する End if End for $0 := Delete string ($1; -$i; Length ($1)) ` スペースを削除
参照
Get document position, RECEIVE PACKET, SEND PACKET, SET DOCUMENT POSITION, SET TIMEOUT, USE CHARACTER SET.
システム変数またはセット
RECEIVE PACKET呼び出し後、エラーなしでパケットを受信すればOKシステム変数に1が、そうでなければ0が設定されます。