アプリケーションのResources
フォルダーには,cert.pem
key.pem
というファイルがプリインストールされています。これらの証明書は,クライアント/サーバー通信の暗号化に使用されるものです。
デフォルトの秘密暗号鍵と証明書は,すべてのアプリケーションに共通の内容です。そのため,クライアント/サーバー通信の暗号化を有効にする場合,独自のファイルで置き換えることが強く勧められています。
クライアント/サーバーの証明書は,Webサーバーの証明書とインストール場所が違っていることに留意してください。14.3では,Webサーバーの証明書が既定の場所にインストールされていない場合,クライアント/サーバーの証明書が代わりに使用されました。14.4以降,クライアント/サーバーのデフォルト証明書がWebサーバーで使用されることはありません。
Mac 32ビット版のアプリケーションがこれといった法則性もなく,頻繁にクラッシュするように思える場合,キャッシュメモリの設定を大幅に減らす必要があるかもしれません。
たとえば,アプリケーションモードからデザインモードに切り替えた直後,印刷ジョブを完了した直後,4D Writeプラグインエリアを操作した直後にアプリケーションがクラッシュする場合,クラッシュレポートの一番下にある使用メモリの合計が下記のようになっていることがあります。
=========== ======= =======
TOTAL 3.8G 2447
TOTAL, minus reserved VM space 3.8G 2447
32ビット版のアプリケーションがアクセスできるメモリ空間は,4
GiBに限定されています。Mac版のアプリケーションは,「利用可能フォント」をすべてロードするため,フォントがかなりのメモリサイズを占有することを意識しなければなりません。たとえば,Microsoft Officeがインストールされている場合,Windows互換フォントだけで1.5
GiBほどのメモリを占有します。そのような環境でアプリケーションのデータキャッシュサイズを1
GiB程度に設定した場合,アプリケーションが利用できるメモリがほとんど残されないことになります。そのため,安定してアプリケーションを使用するためには,必要のないフォントを「使用停止」に設定したり,アプリケーションのキャッシュサイズを数百MiBに抑えるなどして,メモリを上手にやりくりしなければなりません。
こうした問題は,64ビット版のアプリケーションに移行すれば自然に解消されます。なお,17r5以降,32ビット版の4Dはリリースされませんので,32ビット版を使用しているのであれば,早期に移行の計画を立てることが勧められています。
16r6では,フォームエディターで作成したフォームだけでなく,オブジェクト型またはJSONファイルに記述されたフォーム(JSONフォーム)もコマンドで表示したり,印刷したりできるようになりました。
Discover the power of dynamic forms
JSONフォームを使用するには,Open form window
やDIALOG
のような既存のコマンドにフォーム名の代わりにオブジェクト型またはファイルパスを渡します。ファイルパスを渡す場合,Resources
フォルダー内のファイルパスを特殊なシンタックスで指定します。Resources
フォルダーの外部のあるファイルを絶対パスで参照することはできません。
DIALOG ("/RESOURCES/form.json")
デザインリファレンス > フォームの作成 > 動的なフォーム
JSONフォームから別のJSONフォームを参照することもできます。その場合,カレントドキュメントからの相対パスでファイルを指定します。具体的には「JSONポインター」で別のJSONファイルを参照する場合にこのシンタックスを使用します。
ランゲージリファレンス > JSON > JSON Resolve pointers
17r3では,ドキュメントに明記されていない振る舞いとして,/RESOURCES/
から始まるパス名がDocument to text
やTest path name
など,一般のファイルアクセスコマンドでも認識されました。
この振る舞いは,内部的なメカニズムの副作用によるものであり,意図されたものではありませんでした。17r4以降,/RESOURCES/
から始まるJSONフォームのシンタックスは,一般のファイルアクセスコマンドでは使用できないようになっています。
新規プロセスで実行したフォーム上でカット&ペーストなどの操作をするためには,プロセス(SET MENU BAR
)またはフォーム(「連結メニューバー」プロパティ)のメニューバーで「編集」メニューがアクティブにされている必要があります。
メニューバーで「編集」メニューがアクティブにされていれば,フォーム上でカット&ペーストなどの操作ができるようになります。その場合,フォームオブジェクトのOn Data Change
イベントも実行されることになりますが,カットまたはペーストの直後ではなく,カットまたはペーストの直前にOn Data Change
が発生する点に注意してください。これは,メニューアクション全般に共通のルールとして「入力を確定してからアクションを実行する」という順序でデータが処理されるためです。
On Data Change
は,通常,キーストロークで入力が確定した直後に発生するイベントです。On Data Change
に入力値(変数やフィールド)を処理するようなコードが記述されている場合,カットまたはペーストで入力を完了したときにだけ「ひとつ前の」値が処理されることになってしまうので,特に注意が必要です。
コピー&ペースト操作をOn Data Change
イベントで通常のタイプ入力と同格に扱いたいのであれば,メニューエディターで編集アクションの「イベントを発生させない」オプションを有効にすることができます。そうすれば,コピー&ペースト操作だけではOn Data Change
が発生しなくなり,通常のタイプ入力と同じく,入力が確定したタイミングでOn Data Change
が発生するようになります。
デザインリファレンス > メニューとメニューバー > メニューアクションを指定する
ユーザーモードで表示される編集メニューは,「イベントを発生させない」オプションが有効にされていますが,メニューエディターで作成した編集メニューはオプションが有効にされていません。開発者は,フォームエディターかユーザーモードでフォームを検証することが多いので,コピー&ペースト操作でデータ入力を完了した場合にだけ問題が発生することに気づかないことがあります。On Data Change
に入力データを処理するコードが記述されているのであれば,念のため,メニューエディターで編集アクションの「イベントを発生させない」オプションが有効にされているかどうか,確認しておくと良いでしょう。
17r5では,64ビット版のWebエリアおよび4D View Proエリアのバックエンドフレームワークに採用されているChrome Embedded Frameworkのバージョンが3538
(Chromiumバージョン64
)から3626
(2018年12月版; Chromiumバージョン72
)にアップデートされました。なお,このバージョン以降,32ビット版の4Dはリリースされません。
注記: v17.xのバージョンは3282
,16r5のバージョンは3071
でした。
WP SET ATTRIBUTES
は,Write Proドキュメント・レンジ・要素の属性を更新することができるコマンドです。属性名と属性値からなるパラメーターペアをまとめて渡すことにより,1回のコールで複数の属性を一括更新することができます。
4D Write Pro属性の値は,テキスト・数値・ピクチャー・日付型で指定します。色(それぞれの要素値がRGB値が対応)や,タブ位置など,値を配列で指定できるものもありますが,そのような属性をWP SET ATTRIBUTES
でセットする場合は注意が必要です。
コンパイラー/シンタックスチェッカーは,パラメーターの数が可変であり,配列型もサポートするようなコマンドのシンタックスを解析する点で限界があります。そのようなコードは,配列型の引数まで評価されますが,その後のパラメーターは無視されます。これは仕様です。wk tab stop leadings
やwk tab stop offsets
のような属性をセットする場合,コマンドを分割してコールする必要があります。
Frontmost process
のドキュメントには,フローティングウィンドウの振る舞いについて下記のように説明されていました。
フローティングウィンドウのフォームメソッドやオブジェクトメソッドからFrontmost process
コマンドを使用すると,このコマンドはフローティングウィンドウレイヤー内の最前面のフローティングウィンドウのプロセス番号を返します。オプションの*
引数を指定すると,この関数は,通常ウィンドウレイヤー内の最前面のアクティブウィンドウのプロセス番号を返します。
しかし,フローティングウィンドウが表示されており,フローティングウィンドウではないウィンドウが最前面に位置していた場合,そのウィンドウからFrontmost process
をコールしても,最前面にあるフローティングウィンドウのプロセスが返されます。つまり,*
を指定すれば通常ウィンドウ,*
を指定しなければフローティングウィンドウの最前面プロセス番号が返されるのであり,「フローティングウィンドウのフォームメソッドやオブジェクトメソッドからコマンドを使用すると・・・」という前置きは余計でした。
この点については,近日中にドキュメントが修正される予定です。
4D Remote, 4D for iOSなど,ネットワーク版のORDAは,RESTインタフェースに支えられています。標準的なJSONとしてエクスポートできるようなオブジェクトであれば,クライアント側からORDAで更新できますが,[object picture]
が属性に含まれるオブジェクト型,あるいはWrite Proドキュメントのようなバイナリ形式のオブジェクトは,ORDAのentity.save()
で保存することができません。これは仕様です。対照的に,4D View Proドキュメントは標準的なJSONなので,ORDAで更新することができます。
C_OBJECT($e)
$e:=ds.Invoices.get(5)
$e.writeProDocument:=Form.writeProDocument
$status:=$e.save()
このコードをクライアント側で実行した場合,バイナリ形式のオブジェクト型であるWrite Proドキュメントはフィールドに保存されず,エラーも返されないことに注意してください。
バイナリ形式のデータが含まれるオブジェクト型フィールドのentity.save()
は,17r5でサポートされる予定です。17.xでは,クラシックコマンドのSAVE RECORD
を使用する必要があります(ACI0099139)。
v16以降,4D Popと4D SVG Areaは,公式インストーラーに収録されていません。この変更については,v16のリリースノートで言及されていました。
一般向けに提供されているフリー版のコンポーネントは,下記のURLからダウンロードすることができます。v15以前のバージョンも入手することができます。
https://download.4d.com/Components/
下記のコンポーネントは,パートナー向けにソースコードが公開されています。
FTPサイトのURLは,4D Forumsの4D Partner channel > 4D Partners Worldwideスレッドで案内しています。ブラウザが認証情報付きのURL(pass:user@domain
)に対応していない場合,FTPクライアントでアクセスする必要があるもしれません。
4D Forumsのパートナー限定スレッドは,有効なパートナープログラムのアカウントでログインすれば表示されます。アクセスしてもスレッドが表示されない場合,日本支社の営業部までお問い合わせください。
ポップアップメニュー/ドロップダウンリストは,いろいろなタイプのデータソース(変数)にバインドできるユニークなフォームオブジェクトです。具体的には,プロパティとデータソースの組み合わせにより,下記4タイプの設定ができます。
大概のフォームオブジェクトは,バインドできるデータソース(変数)のタイプが決まっているので,変数タイプのプロパティがどうであれ,コンパイラーは正しい型を特定することができます。しかし,テキスト入力(フィールドまたは変数)・タブコントロール・リストボックス・ポップアップメニュー・コンボボックスについては,複数の変数タイプにバインドすることができるため,静的な変数をバインドするのであれば,コンパイラーメソッドでその型を指定する必要があることに留意してください。
フォームイベントを発生させるフォームオブジェクト(アクティブオブジェクト)のプロパティリストには「変数タイプ」という項目が表示されます。このプロパティは,ダイナミック変数(静的な変数名がなく,スコープがフォームに対してローカルな変数)の型指定に使用されます。一方,プロセス変数などの静的な変数の型を指定する働きはありません。
変数に名前が与えられている場合,「変数タイプ」は実際には変数の型を指定しません。プロパティリストのオプション表示を更新するだけです (ピクチャー変数を除く)。名前付き変数の型を指定するには,コンパイラーテーマのコマンドを使用しなければなりません。— ランゲージリファレンス > プログラミング言語の構成要素 > 変数
プロセス変数やインタープロセス変数などの静的な変数をフォームオブジェクトにバインドするスタイルは,互換性のために残されている古典的なコーディングに属するものです。現在でも,試作品(プロトタイプ)のようなコンセプト実証を手速く制作する場合には,このスタイルが有効ですが,本格的な開発には,ダイナミック変数やForm
オブジェクトのプロパティを使用することが推奨されています。
コンパイラーメソッドは,コンパイラーに自動生成させることができます。「型宣言を生成」ボタンをクリックすると,コンパイラーはすべてのメソッドを解析し,代入文・引数・コンパイラコマンドなどに基づき,変数の型を推定しようとします。コンパイラーメソッドで型が宣言されている静的な変数は,メソッドエディター上でマウスポインターを重ねるとタイプ名が表示され,タイプアヘッドの候補リストに表示されます。
もっとも手軽なのは,ポップアップメニューのプロパティリストにデフォルト値を書き込む,という方法です。デフォルト値は,フォームがロードされると,オブジェクトのデータソース(変数)にテキスト配列としてコピーされます。したがって,変数はARRAY TEXT
で宣言されていることが暗黙的に求められています。
配列の値はデフォルト値ですでに定義されているため,コードにはIf (myMenuArray=1)
のような比較演算,あるいはmyMenuArray:=1
のような代入文しか記述されていないかもしれません,その場合,コンパイラーは,myMenuArray
が数値型である,という誤った判定をすることでしょう。数値型は,ポップアップメニューのデータソースとして有効なタイプだからです。一方,ARRAY TEXT(myMenuArray;3)
のように配列のサイズを指定した場合,ポップアップメニューの項目数がデフォルト値の行数と食い違ってしまうかもしれません。
ポップアップメニューのデータソースにデフォルト値を使用する場合,コンパイラーに対して「ヒント」を与えるような形で,下記のように実行されないコードを記述することが勧められています。
If (False)
ARRAY TEXT(myMenuArray;0)
End if
既定の配列を「デフォルト値」に書き込む代わりに,コードで構築したARRAY TEXT
をポップアップメニューにバインドすることもできます。配列の名前は,プロパティリストに書き込むこともできますし,OBJECT SET DATA SOURCE
でバインドすることもできます。
変数名を「無名」とした場合,つまり,ダイナミック変数を使用する場合,リストが関連づけられていないポップアップメニューのデータソースはテキスト配列となります。ポップアップメニューはコレクション型をサポートしていないため,Form
オブジェクトのプロパティをこのスタイルでバインドすることはできません。後述するリスト項目を使用する必要があります。
配列の代わりにリストをポップアップメニューにバインドすることができます。リストは,ツールボックスに登録されたものをプロパティリストの「選択リスト」に入力することもできますし,OBJECT SET LIST BY REFERENCE
あるいはOBJECT SET LIST BY NAME
でバインドすることもできます。後者は,プロパティリストでリスト名を指定するのとあまり変わりませんが,前者はNew list
で構築したリストを扱うことができ,より柔軟かつ強力です。
リストは,ツールボックスに登録されたもの,あるいはコードで構築されたもの,どちらであっても,重複しない一意の参照番号が割り振られていることが前提となっています。とはいえ,4Dのランタイムは参照番号の一意性をチェックすることはしないので,有効な参照番号を各項目にきちんと設定することは,デベロッパーの責任となっています。リスト項目の参照番号でポップアップメニューを管理するスタイルは,項目の表示テキストに関係なく,参照番号を絶対的な値として用いる場面において有効です。たとえば,表示テキストの言語を切り替えられるようなアプリケーションで使用されることが想定されています。参照番号は数値型です。したがって,変数はC_LONGINT
で宣言されていることが暗黙的に求められています。配列ではないので,Form
オブジェクトのプロパティをバインドすることもできます。
参照番号の代わりに,リスト項目の値そのものをポップアップメニューにバインドすることもできます。配列やリスト項目の参照番号のように,選択された位置や番号から項目を参照する必要がなく,選択された項目がそのまま変数にセットされるので,慣れてしまえば,もっとも自然で簡単な方法です。リストの値はテキスト型です。したがって,変数はC_TEXT
で宣言されていることが暗黙的に求められています。配列ではないので,Form
オブジェクトのプロパティをバインドすることもできます。
注記: ポップアップメニューのデータソースは,OBJECT SET DATA SOURCE
OBJECT SET LIST BY REFERENCE
OBJECT SET LIST BY NAME
で自由に切り替えることができます。しかし,「関連付け」の「リスト項目の参照番号・リスト項目の値」は,プロパティリストで決定する必要があり,フォーム実行中に変更することはできません。また,これらのプロパティは,「選択リスト」が設定されていないとアクセスできないため,配列ではなく,リストをデータソースに使用するのであれば,たとえツールボックスのリストではなく,New list
を使用するつもりであっても,プロパティリストの上ではツールボックスのリストをどれか指定する必要があります。とはいえ,デフォルトは「リスト項目の値(つまりテキスト)」なので,「リスト項目の参照番号(つまり数値)」を使用するのでなければ,「なし」のままでも問題ないでしょう。