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
を使用するつもりであっても,プロパティリストの上ではツールボックスのリストをどれか指定する必要があります。とはいえ,デフォルトは「リスト項目の値(つまりテキスト)」なので,「リスト項目の参照番号(つまり数値)」を使用するのでなければ,「なし」のままでも問題ないでしょう。
17r5では,OpenSSLライブラリのバージョンが1.1.1b
に引き上げられ,最新のセキュリティレベルであるTLS 1.3に対応する予定です。OpenSSLは,HTTP Request
HTTP Get
ENCRYPT BLOB
DECRYPT BLOB
GENERATE CERTIFICATE REQUEST
GENERATE ENCRYPTION KEYPAIR
,Webサーバー,ネットワークレイヤー(クライアントサーバーおよびSQL),LDAP,Internet Commandsプラグイン,ODBC,32ビット版の統合Webエリア(WebKit)で使用されています。
ライブラリがアップデートされたことに伴い,アプリケーションにインストールされた証明書のセキュリティレベルが十分ではない場合,HTTPSで接続ができなくなりました。具体的には,RC4ハッシュアルゴリズムの暗号スイートを使用した証明書では,サーバーをTLS公開することができません。そのような証明書がインストールされたサーバーに対してブラウザからアクセスした場合,空のページが表示されます。これは仕様です。
Write Proに幅が120pxの列5個で構成されるテーブルを挿入した場合,テーブル全体の幅は600pxを超えることになります。これは仕様です。
wk width
およびwk height
はHTMLやCSSと同じ仕方で要素のサイズを定義します。つまり,セルのサイズには,パディングやボーダーが含まれません。テーブルの正確な幅は,セル・ボーダー・パディングの幅を合計した値になります。行の中間に位置するセルのサイズは,下記の計算式で求めることができます。
wk width+(wk border width left+wk border width right)*0.5+wk padding left+wk padding right
セルとセルの間にあるボーダーは,幅が半分にカットされる点に留意してください。左端のセルはwk border width left*0.5
,右端のセルはwk border width right*0.5
をこれに加える必要があります。両端のセルだけは,ボーダーがカットされないためです。なお,ボーダー幅の計算には,複雑なレンダリングルールが関係しており,ボーダーの幅とスタイルが揃っていない場合,この計算式だけでは多少の誤差が生じるかもしれません。
例題:
C_REAL($widthFull)
$widthFull:=0
For ($i;1;$NbCol)
$Col:=WP Table get columns($Tableau;$i;1)
WP SET ATTRIBUTES($Col;wk width;120)
$cells:=WP Table get cells($Tableau;$i;1;1;1)
C_REAL($width)
C_REAL($borderWidth;$padding)
WP GET ATTRIBUTES($cells;wk border width;$borderWidth;wk padding;$padding)
//full cell width = wk width+(wk border width*2)/2+wk padding*2 (only if all cells have same padding and border widths)
//for interior cells borders are collapsed
$width:=120+($borderWidth*2/2)+($padding*2)
$widthFull:=$widthFull+$width
If (($i=1) | ($i=$NbCol))
//for row first and last cell, exterior borders are not collapsed
$widthFull:=$widthFull+($borderWidth*0.5)
End if
End for
ALERT("full table width in px="+String($widthFull))
ORDAのエンティティセレクションには,ordered(順序あり)とunordered(順序なし)が存在します。前者は従来の命名セレクションに,後者は従来のセットに似ています。
デスクトップ版,あるいはサーバー側でORDAのquery()
を使用した場合,データストアds
はローカルなので,デフォルトでunordered(順序なし)のエンティティセレクションが返されます。ordered(順序あり)のエンティティセレクションが必要であれば,newSelection()
にdk keep ordered
オプションを渡すことができます。
クライアント側でORDAのquery()
を使用した場合,データストアds
はリモートなので,常にordered(順序あり)のエンティティセレクションが返されます。つまり,クライアント側でORDAを実行した場合,entitySelection.isOrdered()
は常にTrue
を返しますが,同じコードをデスクトップ版で実行した場合,False
が返されるかもしれません。これは仕様です。
タブコントロールオブジェクトは,フォームページの切り替えに適しているため,標準アクションの「ページ移動」がデフォルトで設定されています。フォームオブジェクトには,標準アクションとオブジェクトメソッドの両方が設定できますが,「ページ移動」アクションが設定されているタブコントロールの場合,On Clicked
でFORM GOTO PAGE
コマンドで指定したベージに移動することはできません。標準アクションは,オブジェクトメソッドの後に実行されるためです。
v16まで,一部のアクションはオブジェクトメソッドの前に実行され,他のアクションはオブジェクトメソッドの後に実行されるといった具合に振る舞いが一貫していませんでした。v17では,標準アクションは常にオブジェクトメソッドの後に実行されるよう,仕様が統一されています。
macOS MojaveでPHP Execute
を実行すると,「アプリケーションはお使いのMac用に最適化されていません」というアラートが表示されます。17r4と一緒に配付されているphp-fcgi
が32ビット版のアプリケーションであるためです。このメッセージは,30日に1回,リマインダーとして表示されます。
注記: 32ビット版アプリケーションは,17r4が最後のリリースとなります。17r5以降,4Dおよび4D Serverは64ビット版アプリケーションのみのリリースとなり,PHPも64ビット版のバージョン7.3.1
にアップデートされる予定です。
17r4では,DRAG AND DROP PROPERTIES
コマンドが正式に廃止予定となり,名称が_o_DRAG AND DROP PROPERTIES
に変更されました。このコマンドは,ポインターを使用した独自の面倒なメカニズムに基づいており,v11以降,推奨されていません。
フォームオブジェクト間のドラッグ&ドロップ,外部アプリケーションまたはファイルシステムからのドラッグ&ドロップ,テキストやピクチャのネイティブドラッグ&ドロップは,すべてペーストボードを使用したコードでシンプルかつ一元的に処理することができます。
廃止予定コマンドのリストは,各バージョンのランゲージリファレンスに掲載されています。廃止予定の機能と削除された機能もご覧ください。