パラメーターが宣言されているメソッドの引数が省略された場合,そのパラメーター($1など)は「未定義」となります。v16では,変数やフィールドに「未定義」を代入しようとすると,エラーが返されました。v17以降,「未定義」を変数やフィールドに代入してもエラーは返されません。これは仕様です。
オブジェクト型のプロパティは,変数やフィールドとは違い,型が決まっていません。値またはNullが代入されていないプロパティは,省略されたパラメーターと同じように「未定義」です。
オブジェクト記法を使用すれば,プロパティのプロパティにアクセスするコードがずっとシンプルで直感的になるだけでなく,実行速度も大幅に向上させることができます。しかし,プロパティのプロパティにアクセスするコードが成立するためには,上位のプロパティが「未定義」でなければなりません。
深い階層のプロパティに1行でアクセスするために,ひとつずつプロパティをチェックしなければならないとすれば,それは本末転倒であり,オブジェクト記法を使用するメリットがありません。それで,v17以降,「未定義」の参照と代入に関する仕様が変更され,より柔軟に「未定義」を扱うことができるようになりました。オブジェクトのプロパティだけでなく,省略されたパラメーターにも影響が及びます。
https://blog.4d.com/object-notation-improvement-after-customer-feedback/
v16r4まで
エラーが返されました。
v17から
オブジェクト記法で参照したプロパティが「未定義」だった場合,式は「未定義」を返し,以降のコードは無視されます。つまり,途中のプロパティをすべてチェックする必要がなくなりました。
v16まで
パラメーター($1など)は「未定義」でした。
v17から
パラメーター($1など)には,型のデフォルト値(0など)が代入されます。
注記: コマンドに「未定義」を渡すことはできません。引数が「未定義」になる可能性があるのであれば,String Num Date Time Boolを使用することができます。v17以降,「未定義」は型のデフォルト値に変換されるからです。
If Case ofなど)の式が「未定義」v16まで
エラーが返されました。
v17から
False条件として扱われます。
:=)の右オペランドが「未定義」v16まで
値を返さないメソッド($0なし)や未定義のプロパティ($o.undefined)を変数やフィールドに代入するようなコードは何もしませんでした。つまり,値は元のままでした。
v17から
値を返さないメソッド($0なし)や未定義のプロパティ($o.undefined)を変数やフィールドに代入した場合,左オペランドには型のデフォルト値(0など)が代入されます。
17r3では,WP Create rangeにドキュメントを渡した場合の振る舞いが調整され,仕様が明確になりました。
本文をクリックしてからコマンドを実行した場合(WP Get frameがwk bodyを返す状態),WP Create rangeにドキュメントを渡したときに返されるレンジは,本文に対して相対的でした。
ヘッダーをクリックしてからコマンドを実行した場合(WP Get frameがwk current section default headerを返す状態),WP Create rangeにドキュメントを渡したときに返されるレンジは,ヘッダーに対して相対的でした。
WP Create rangeにドキュメントを渡したときに返されるレンジは,フレームに関係なく,本文に対して相対的です。
ポイント: コマンドの振る舞いは,Write Proドキュメントがオフスクリーンであるかどうかに左右されず,一貫している必要があります。ヘッダーやフッターがフォーカスされている場合にレンジの基準が変動する以前の動作は,この原則に沿っていませんでした。
ヘッダーに対して相対的なレンジを取得することが目的であれば,ヘッダーをクリックしてカレントフレームを移動するのではなく,ヘッダーをコマンドに渡してください。
注記: 17r5でコマンドの名称はWP Text rangeに変更されています。
Windows 64ビット版は,ダブルクリックするだけで,アプリケーションのインスタンスがいくつでも起動できるようになりました。この改良により,マルチクライアントまたはマルチテナントを想定したビジネスアプリケーションであれば,同一のマシン上で複数のクライアントアプリケーションを起動し,それぞれ別のユーザーアカウントで同一のサーバーに接続する,といったことが容易になりました。
17r4以前のバージョンでは,同一のマシン上で複数のクライアントを起動し,同一のサーバーに接続するためには,ClientLocalという名称のフォルダー(ローカルリソースのキャッシュフォルダー)をそれぞれのクライアントをアプリケーションと同じフォルダーに作成する必要がありました。標準のキャッシュフォルダーは,サーバーの公開名・アドレス・ポート番号が同じであれば,同じものが使用されるためです。
ローカルリソースのキャッシュフォルダー(17r4)
\AppData\Local\{ApplicationName}\{DBName}_{ServerIP}_{ServerPort}
17r5以降,ローカルリソースのキャッシュフォルダーパスには,クライアントアプリケーションのフルパスから計算されたハッシュ値(10進数3桁)が追加され,コリジョンが検出された場合には,利用できるディレクトリがみつかるまで,自動的に値をインクリメントされるようになっています。使用中のキャッシュフォルダーには,inuse.txtおよびuuid.txtというテキストファイルが作成されます。前者には,アプリケーションのプロセス番号(pid)とアプリケーションのフルパスが改行コード(\n)で区切られて書き込まれています。後者には,クライアントのUUIDが書き込まれています。
17r5以降,ClientLocalという名称のフォルダーを作成する必要はありません。
ローカルリソースのキャッシュフォルダー(17r5)
\AppData\Local\{ApplicationName}\{DBName}_{ServerIP}_{ServerPort}_{hash}
注記: キャッシュフォルダーのパスは,Get 4D folder(4D Client database folder)で取得することができます。
ビルドされたアプリケーションは,デフォルトの設定で複数インスタンスの起動が禁止されています。具体的には,info.plistファイルに下記のキーが書き込まれています。
<key>SingleInstance</key>
<string>0</string>
このキーは,BUILD APPLICATIONで指定するプロジェクトのキーで設定することができます。
<Preferences4D>
<BuildApp>
<CS>
<ClientWinSingleInstance>False</ClientWinSingleInstance>
</CS>
</BuildApp>
</Preferences4D>
このキーは,Windows版のビルドされたクライアントアプリケーションで有効です。Windows版のビルドされたスタンドアロンアプリケーションは,常に複数インスタンスの起動が禁止されています。
注記: Macでは,コマンドラインからopen -nと命令することにより,同一アプリケーションのインスタンスを起動することができます。
17r4以降,Mac版のボーダーハイライトが17.xよりも「太く」表現されるようになりました。これはシステムの表示に合わせるための意図的な変更であり,仕様です。
17.x

17r4

4D for iOSは,標準的なXcodeプロジェクトを出力し,ネイティブiOSアプリをビルドするツールです。17r4に組み込まれている4D for iOSは,ABI安定化前のSwiftを使用しているため,XcodeおよびiOSのバージョンが17r4開発当時のもの(Xcode 10.1)でなければアプリをビルドしたり,デバイスで動かしたりすることができません。これは仕様です。
| Xcode | Swift | iOS | 4D |
|---|---|---|---|
| 10.2 | 5 | 12 | 17r5 |
| 10.1 | 4.2.1 | 12 | 17r4 |
| 10.0 | 4.2 | 12 | 17r3 |
| 9.4.1 | 4.1.2 | 11.4 | 17r2 |
17r4の4D for iOSを使用するのであれば,Xcode 10.1の環境を用意し,アップデートは控えるようにしてください。
注記: デバイスをiOS 12.2にアップデートすると,Xcode 10.1ではデバッグができなってしまいますので,テストに使用するデバイスのアップデートも控えたほうが良いかもしれません。
すでにアップデートしてしまった場合, Appleから過去のXcodeをダウンロードすることができます。
17r5には,Xcode 10.2およびSwift 5に対応した4D for iOSが組み込まれています。最新版のXcodeを使用するのであれば,17r5(ベータ版)の4D for iOSをご検討ください。
なお,4D for iOSは,単独でダウンロードすることもできます。
17r5のexport structure fileコマンドでフォームをエクスポートした場合,フォームの名前がそのままフォルダーの名前として使用されます。ファイルシステムで許可されていない名前がつけられたフォームは,必然的にエラーが返されることになります。
プロジェクトモードでは,識別子がファイルパスの一部になりますので,フォーム・オブジェクト・メソッドの名前に : \ / . といった文字を使用することは控えてください。バージョン管理システムとの連携を考え,POSIXパスのフォルダー区切り文字も避けたほうが無難です。なお,テーブルは,名前ではなく,番号がフォルダー名に使用されるので,問題にはなりません。
忘れがちな点として,Windowsでは,歴史的な経緯により,フォルダー名に使用できない識別子があります。
IN OUT CON PRN AUX NUL
COM1 COM2 COM3 COM4 COM5 COM6 COM7 COM8 COM9
LPT1 LPT2 LPT3 LPT4 LPT5 LPT6 LPT7 LPT8 LPT9
Windows版でMDIウィンドウの閉じるボタンをクリックしたり,Alt+F4を入力したり,タイトルバーの左端にあるウィンドウメニューの「閉じる」アクションを実行したりしても,アプリケーションが終了しない場合,アプリケーション「終了」アクションがきちんと設定されているか,確認してください。
「終了」アクションが実行されるためには,「終了」標準アクションが設定された項目がメニューに存在しなければなりません。「終了」メニューを設定することにより,Windows版でMDIウィンドウの「閉じる」ボタンがこのメニュー項目に関連付けられます。Mac版では,アプリケーションメニューに「…を終了」という項目が追加され,代わりに本来の項目がメニューから取り除かれます。
このメニュー項目にプロジェクトメソッドが設定されていない場合,項目を選択すると,自動的に確認ダイアログが表示され,終了することに同意すると,アプリケーションの終了プロセスが始まります。
このメニュー項目にプロジェクトメソッドが設定されている場合,項目を選択すると,確認ダイアログは省略され,すぐにアプリケーションの終了プロセスが始まります。
「終了」標準アクションが設定された項目がメニューに存在しない場合,MDIウィンドウの「閉じる」ボタンをクリックしても何も起きません。
ヘルプTipsが表示されているときにOBJECT SET HELP TIPを使用した場合,表示中のヘルプは取り消され,新しい内容のヘルプが表示されます。これは仕様です。設定したメッセージが以前と同じものであったとしても,この点は変わりません。マウスポインターの移動中にコマンドを実行すると,ヘルプTipsが絶えず点滅し,ユーザーに不快な印象を与えるかもしれませんので,注意が必要です。
Current method nameをフォームメソッド内でコールした場合,コンパイルモードではフォーム名に出現する最後のピリオド以降の文字列が返されます。これは仕様です。たとえば,Invoice.Output.Dialogのような名前をフォームに設定した場合,Dialogだけが返されます。フォーム名にピリオドは使用しないでください。