4D v13.4

RECEIVE PACKET

ホーム

 
4D v13.4
RECEIVE PACKET

RECEIVE PACKET 


 

RECEIVE PACKET ( {DocRef ;} receiveVar ; stopChar | numBytes ) 
引数   説明
DocRef  DocRef in ドキュメント参照番号, または カレントチャンネル (シリアルポートまたはドキュメント)
receiveVar  テキスト変数, BLOB変数 in データを受け取る変数
stopChar | numBytes  文字, 倍長整数 in 受信を停止する文字, または受信するバイト数

説明   

RECEIVE PACKET コマンドは、シリアルポートまたはドキュメントから文字を読み込みます。

docRefを指定した場合、このコマンドはOpen document, Create document または Append documentで開かれたドキュメントからデータを取得します。docRefを指定しない場合、このコマンドはSET CHANNELコマンドで開かれたシリアルポートかドキュメントからデータを取得します。

読み込み元に関わらず、読み込まれた文字は、テキスト、文字、またはBLOB型のreceiveVar変数に返されます。文字がSEND PACKET コマンドで送信された場合、型はパレットが送信された際の型に対応しなければなりません。

Notes:

  • 非Unicodeモード (互換モード) では、文字変数は固定長の最大255バイトまでです。テキスト変数は固定長を持たず32,000バイトまでを受け入れます。
  • 受信したパケットが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 (理論的な値) のテキストを、非Unicodeモードでは32,000バイトまで読み込めます。この場合、最大文字数を指定するためにMAXTEXTLENBEFOREV11numBytesに渡せます。

互換性メモ: バージョン11より前の4Dで、データベースはASCII文字セット (Mac-Roman) を基本として動作していました。この場合、それぞれの文字は1バイト (8ビット) で構成されます。numBytes 引数はそのまま直接受信する文字数を表していました。(ただし日本語の場合、1文字が2バイトで構成される文字も存在するため、バイトは文字数を表してはいませんでした)。バージョン11よりUnicodeモードで動作するデータベースは外部とのデータ通信にデフォルトでUTF-8文字エンコーディングを使用します。このモードでは2バイトや3バイトなど文字毎に構成するバイト数が異なります。つまりバイト数と文字数は対応しなくなりました。この場合、読み込む文字数を制御するためには、USE CHARACTER SETコマンドを使用して文字セットをMac-Romanに指定するか (日本語環境ではこのオプションは使用できません)、BLOBを使用するか、stopChar 引数を使用します。

特定の文字列(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 positionSET 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関数を使用できます。

以下の例は、20バイトのデータをシリアルポートから読み込み、変数getTwentyに格納します:

 RECEIVE PACKET(getTwenty;20)

以下の例は、変数myDocで参照されるドキュメントからデータを読み込み、変数vDataに格納します。ここでは改行が見つかるまで読み込みます:

 RECEIVE PACKET(myDoc;vData;Char(Carriage return))

以下の例は、変数myDocで参照されるドキュメントからデータを読み込み、変数vDataに格納します。HTMLタグ</TD>(テーブルセルの終わり)が現われるまでデータを読み込みます:

 RECEIVE PACKET(myDoc;vData;"</TD>")

以下の例は、ドキュメントファイルから読み込んだデータをフィールドに格納します。データは、固定長で格納されています。このメソッドは、サブルーチンを呼び出してデータの後ろに付随する不要なスペースを取り除きます:

 $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が設定されます。

 
プロパティ 

プロダクト: 4D
テーマ: 通信
番号: 104

このコマンドはOKシステム変数を更新しますUnicodeモードの設定がこのコマンドの動作に影響します

 
目次

コマンドリスト (文字順)

 
履歴 

変更: 4D v11 SQL
変更: 4D v12

 
参照 

Get document position
RECEIVE BUFFER
SEND PACKET
SET DOCUMENT POSITION
SET TIMEOUT
USE CHARACTER SET

 
タグ 

BOM***