メインコンテンツまでスキップ
バージョン: 20 R7 BETA

APPEND DATA TO PASTEBOARD

APPEND DATA TO PASTEBOARD ( dataType ; data )

引数説明
dataTypeText追加するデータのタイプ
dataBlobペーストボードに追加するデータ

このコマンドはスレッドセーフではないため、プリエンプティブなコードには使えません。

説明

APPEND DATA TO PASTEBOARD コマンドは、dataTypeで指定されたデータタイプでdataBLOB内にあるデータをペーストボードに追加します。

Note: コピー/ペースト操作の場合、ペーストボードはクリップボードと同じです。

dataTypeには、追加するデータのタイプを指定する値を渡します。4D シグネチャ, UTI タイプ (Mac OS), フォーマット名/番号 (Windows), 4文字のタイプ (互換性) を渡すことができます。これらのデータタイプについてはの節を参照してください。

Windowsユーザへの注意: コマンドをテキストタイプのデータに対して使用するとき (dataType が"TEXT"、com.4d.private.text.native または com.4d.private.text.utf16)、Blob引数dataに含まれる文字列はNULL文字で終了していなければなりません。

通常、同一データの複数のインスタンスをペーストボードに追加、またはテキストやピクチャ以外のタイプのデータを追加するときには、APPEND DATA TO PASTEBOARDコマンドを使用します。ペーストボードに新しいデータを追加するには、まず最初にCLEAR PASTEBOARDコマンドを使用してペーストボードを消去する必要があります。

消去と追加を実行するには:

しかし、BLOBにテキストやピクチャが含まれている場合、APPEND DATA TO PASTEBOARD コマンドを使用してテキストやピクチャをペーストボードに追加できることに留意してください。

例題

ペーストボードコマンドとBLOBを使用すると、洗練されたカット/コピー/ペーストの仕組みを構築でき、たった1つのデータではなく構造化されたデータを扱うことができます。以下の例では、2つのプロジェクトメソッドSET RECORD TO PASTEBOARDとGET RECORD FROM PASTEBOARDは、ペーストボードとの間でコピーするためにレコード全体を1つのデータとして扱うことができます。

  // SET RECORD TO PASTEBOARD プロジェクトメソッド
  // SET RECORD TO PASTEBOARD ( 数値 )
  // SET RECORD TO PASTEBOARD ( テーブル 数値 )
 
 var $1;$vlField;$vlFieldType : Integer
 var $vpTable;$vpField : Pointer
 C_STRING(255;$vsDocName)
 var $vtRecordData;$vtFieldData : Text
 var $vxRecordData : Blob
 
  // ペーストボードをクリア (カレントレコードがない場合には空のままとなる)
 CLEAR PASTEBOARD
  // 引数で渡されたテーブル番号のテーブルポインタを得る
 $vpTable:=Table($1)
  // テーブルのカレントレコードがあれば
 If((Record number($vpTable->)>=0)|(Is new record($vpTable->)))
  // レコードのテキストイメージを保持するテキスト変数を初期化
    $vtRecordData:=""
  // レコードのフィールドごとに
    For($vlField;1;Last field number($1))
  // フィールドの型を取得
       GET FIELD PROPERTIES($1;$vlField;$vlFieldType)
  // フィールドのポインタを取得
       $vpField:=Field($1;$vlField)
  // フィールド型に基づき、適切な方法でデータをコピー
       Case of
          :(($vlFieldType=Is alpha field)|($vlFieldType=Is text))
             $vtFieldData:=$vpField->
          :(($vlFieldType=Is real)|($vlFieldType=Is integer)|($vlFieldType=Is longint)
             |($vlFieldType=Is date)|($vlFieldType=Is time))
             $vtFieldData:=String($vpField->)
          :($vlFieldType=Is Boolean)
             $vtFieldData:=String(Num($vpField->);"Yes;;No")
          Else
  // 他のデータタイプは無視
             $vtFieldData:=""
       End case
  // レコードのテキストイメージを保持するテキスト変数にフィールドデータを追加
       $vtRecordData:=$vtRecordData+Field name($1;$vlField)+":"+Char(9)+$vtFieldData+CR
  // Note: CRメソッドは、Mac OS上ではChar(13)を、Windows上ではChar(13)+Char(10)を返す
    End for
  // テキストイメージをペーストボードに置く
    SET TEXT TO PASTEBOARD($vtRecordData)
  // Temporary フォルダのスクラップファイル名
    $vsDocName:=Temporary folder+"Scrap"+String(1+(Random%99))
  // スクラップファイルがあれば削除する (ここでエラーをテストすべき)
    DELETE DOCUMENT($vsDocName)
  // スクラップファイルを作成
    SET CHANNEL(10;$vsDocName)
  // スクラップファイルにレコード全体を送信
    SEND RECORD($vpTable->)
  // スクラップファイルを閉じる
    SET CHANNEL(11)
  // スクラップファイルをBLOB読み込む
    DOCUMENT TO BLOB($vsDocName;$vxRecordData)
  // スクラップファイルはもう必要ない
    DELETE DOCUMENT($vsDocName)
  // ペーストボードにレコードの完全なイメージを追加
  // Note: ここではデータ型に"4Drc" を使用しています
    APPEND DATA TO PASTEBOARD("4Drc";$vxRecordData)
  // この時点でペーストボードには以下が含まれます:
  // (1) レコードのテキストイメージ (以下のスクリーンショットで見られるような)
  // (2) レコード全体のイメージ (ピクチャや BLOB フィールドを含む)
 End if

以下のようなレコードを表示させた時:

SET RECORD TO PASTEBOARD メソッドを[Employees] テーブルに適用すると、ペーストボードには以下のようなレコードのテキストイメージとレコード全体のイメージが含まれます。

GET RECORD FROM PASTEBOARDメソッドを使用して、このレコードイメージを他のレコードにペーストできます:

  // GET RECORD FROM PASTEBOARDメソッド
  // GET RECORD FROM PASTEBOARD( 数値 )
  // GET RECORD FROM PASTEBOARD( テーブル 数値 )
 var $1;$vlField;$vlFieldType;$vlPosCR;$vlPosColon : Integer
 var $vpTable;$vpField : Pointer
 C_STRING(255;$vsDocName)
 var $vxPasteboardData : Blob
 var $vtPasteboardData;$vtFieldData : Text
 
  // 引数として渡されたテーブル番号のテーブルポインタを得る
 $vpTable:=Table($1)
  // カレントレコードがあれば
 If((Record number($vpTable->)>=0)|(Is new record($vpTable->)))
    Case of
  // ペーストボードに完全なレコードイメージが含まれているか?
       :(Pasteboard data size("4Drc")>0)
  // 含まれていればペーストボードの中身を取り出す
          GET PASTEBOARD DATA("4Drc";$vxPasteboardData)
  // Temporary フォルダ内のスクラップファイル名
          $vsDocName:=Temporary folder+"Scrap"+String(1+(Random%99))
  // スクラップファイルが存在すれば削除する (ここでエラーをテストすべき)
          DELETE DOCUMENT($vsDocName)
  // スクラップファイルにBLOBを保存
          BLOB TO DOCUMENT($vsDocName;$vxPasteboardData)
  // スクラップファイルを開く
          SET CHANNEL(10;$vsDocName)
  // スクラップファイルからレコード全体を取り込む
          RECEIVE RECORD($vpTable->)
  // スクラップファイルを閉じる
          SET CHANNEL(11)
  // スクラップファイルはもう必要ない
          DELETE DOCUMENT($vsDocName)
  // ペーストボードにTEXTが含まれているか?
       :(Pasteboard data size("TEXT")>0)
  // ペーストボードからテキストを取り出す
          $vtPasteboardData:=Get text from pasteboard
  // インクリメントするフィールド番号を初期化
          $vlField:=0
          Repeat
  // テキスト中で次のフィールド行を探す
             $vlPosCR:=Position(CR;$vtPasteboardData)
             If($vlPosCR>0)
  // フィールド行を取り出す
                $vtFieldData:=Substring($vtPasteboardData;1;$vlPosCR-1)
  // コロン ":" があれば
                $vlPosColon:=Position(":";$vtFieldData)
                If($vlPosColon>0)
  // フィールドデータのみを取り出す (フィールド名を削除)
                   $vtFieldData:=Substring($vtFieldData;$vlPosColon+2)
                End if
  // フィールド番号をインクリメント
                $vlField:=$vlField+1
  // ペーストボードには必要以上のデータが含まれていることがある...
                If($vlField<=Last field number($vpTable))
  // フィールドタイプを取得
                   GET FIELD PROPERTIES($1;$vlField;$vlFieldType)
  // フィールドへのポインタを取得
                   $vpField:=Field($1;$vlField)
  // フィールドのデータ型に基づき、適切な方法でデータをコピー
                   Case of
                      :(($vlFieldType=Is alpha field)|($vlFieldType=Is text))
                         $vpField->:=$vtFieldData
                      :(($vlFieldType=Is real)|($vlFieldType=Is integer)|($vlFieldType=Is longint))
                         $vpField->:=Num($vtFieldData)
                      :($vlFieldType=Is date)
                         $vpField->:=Date($vtFieldData)
                      :($vlFieldType=Is time)
                         $vpField->:=Time($vtFieldData)
                      :($vlFieldType=Is Boolean)
                         $vpField->:=($vtFieldData="Yes")
                      Else
  // 他のフィールドタイプは無視
                   End case
                Else
  // すべてのフィールドタイプに代入したのでループを抜ける
                   $vtPasteboardData:=""
                End if
  // 取り出したテキストを削除
                $vtPasteboardData:=Substring($vtPasteboardData;$vlPosCR+Length(CR))
             Else
  // 区切り文字が見つからないのでループを抜ける
                $vtPasteboardData:=""
             End if
  // データがある間ループする
          Until(Length($vtPasteboardData)=0)
       Else
          ALERT("The pasteboard does not any data that can be pasted as a record.")
    End case
 End if

システム変数およびセット

ペーストボードにBLOBデータが正しく追加されると、OKシステム変数は1に設定されます。そうでなければ0が設定され、エラーが生成されます。

参照

CLEAR PASTEBOARD
SET PICTURE TO PASTEBOARD
SET TEXT TO PASTEBOARD