RECEIVE PACKET
RECEIVE PACKET ( {DocRef ;} receiveVar ; stopChar | numBytes )
引数 | 型 | 説明 | |
---|---|---|---|
Time | Time | → | ドキュメント参照番号, または カレントチャンネル (シリアルポートまたはドキュメント) |
receiveVar | Text, Blob | ← | データを受け取る変数 |
stopChar | numBytes | 文字, 倍長整数 | → | 受信を停止する文字, または受信するバイト数 |
説明
RECEIVE PACKET コマンドは、シリアルポートまたはドキュメントから文字を読み込みます。
docRefを指定した場合、このコマンドは Open document, Create document または Append document で開かれたドキュメントからデータを取得します。docRefを指定しない場合、このコマンドは SET CHANNELコマンドで開かれたシリアルポートかドキュメントからデータを取得します。
読み込み元に関わらず、読み込まれた文字は、テキスト、文字、またはBLOB型のreceiveVar変数に返されます。文字が SEND PACKET コマンドで送信された場合、型はパレットが送信された際の型に対応しなければなりません。
Notes:
- 受信したパケットがBLOB型の場合、コマンドは USE CHARACTER SET コマンドで指定された文字セットを考慮しません。BLOBには変更されないデータが返されます。
- テキスト型のパケットを受信した場合、 RECEIVE PACKET コ マンドはByte Order Marks (BOM) をサポートします。この場合、カレントの文字セットがUnicodeタイプ (UTF-8, UTF-16またはUTF-32) であれば、4Dは受信した先頭のバイトでBOMの識別を試みます。BOMが検知されると、それはreceiveVar変数から取り除かれ、4Dは現在の文字セットではなくBOMで指定された文字セットを使用します。
特定の文字数まで読み込むためには、numBytesにその数を渡します。receiveVarがテキスト型の場合、一回の呼び出しで、Unicodeモードでは2GB (理論的な値) までのテキストを読み込めます。
特定の文字列(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を代入します。
例題 1
以下の例は、20バイトのデータをシリアルポートから読み込み、変数getTwentyに格納します:
RECEIVE PACKET(getTwenty;20)
例題 2
以下の例は、変数myDocで参照されるドキュメントからデータを読み込み、変数vDataに格納します。ここでは改行が見つかるまで読み込みます:
RECEIVE PACKET(myDoc;vData;Char(Carriage return))
例題 3
以下の例は、変数myDocで参照されるドキュメントからデータを読み込み、変数vDataに格納します。HTMLタグ**(テーブルセルの終わり)が現われるまでデータを読み込みます:
RECEIVE PACKET(myDoc;vData;"")
例題 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)) // スペースを削除
システム変数およびセット
RECEIVE PACKET呼び出し後、エラーなしでパケットを受信すればOKシステム変数に1が、そうでなければ0が設定されます。
参照
Get document position
RECEIVE BUFFER
SEND PACKET
SET DOCUMENT POSITION
SET TIMEOUT
USE CHARACTER SET