4D v13.4RECEIVE PACKET |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4D v13.4
RECEIVE PACKET
|
RECEIVE PACKET ( {DocRef ;} receiveVar ; stopChar | numBytes ) | ||||||||
引数 | 型 | 説明 | ||||||
DocRef | DocRef |
![]() |
ドキュメント参照番号, または カレントチャンネル (シリアルポートまたはドキュメント) | |||||
receiveVar | テキスト変数, BLOB変数 |
![]() |
データを受け取る変数 | |||||
stopChar | numBytes | 文字, 倍長整数 |
![]() |
受信を停止する文字, または受信するバイト数 | |||||
RECEIVE PACKET コマンドは、シリアルポートまたはドキュメントから文字を読み込みます。
docRefを指定した場合、このコマンドはOpen document, Create document または Append documentで開かれたドキュメントからデータを取得します。docRefを指定しない場合、このコマンドはSET CHANNELコマンドで開かれたシリアルポートかドキュメントからデータを取得します。
読み込み元に関わらず、読み込まれた文字は、テキスト、文字、またはBLOB型のreceiveVar変数に返されます。文字がSEND PACKET コマンドで送信された場合、型はパレットが送信された際の型に対応しなければなりません。
Notes:
特定の文字数まで読み込むためには、numBytesにその数を渡します。receiveVarがテキスト型の場合、一回の呼び出しで、Unicodeモードでは2GB (理論的な値) のテキストを、非Unicodeモードでは32,000バイトまで読み込めます。この場合、最大文字数を指定するためにMAXTEXTLENBEFOREV11をnumBytesに渡せます。
互換性メモ: バージョン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の実行中、利用者は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関数を使用できます。
以下の例は、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
変更: 4D v11 SQL
変更: 4D v12
Get document position
RECEIVE BUFFER
SEND PACKET
SET DOCUMENT POSITION
SET TIMEOUT
USE CHARACTER SET
BOM***