コレクション型のリストボックスは,要素がオブジェクト型ではなくスカラー値(テキスト・数値・ブールなど)だった場合,This.value
という特殊な表記で値を表示することができます。This.value
は値のコピーであるため,新しい値を代入しても,元のコレクション要素を更新することにはなりません。これは仕様です。リストボックスに表示されたコレクションの要素を更新するのであれば,スカラー値ではなく,オブジェクト型のコレクションを使用してください。
Macプラットフォームでは「システム環境設定 > キーボード > ショートカット」でシステム全体またはアプリケーション毎のカスタムキーボードショートカットを設定することができます。
システム環境設定で追加したショートカットは,項目名が合致する4Dのメニューに関連付けられます。4Dの場合,32ビット版では,アプリケーションが最前面であればカスタムキーボードショートカットが入力できますが,64ビット版では,メニューをクリックした後でなければ,カスタムキーボードショートカットが入力できません。これは仕様です。
回避策: カスタムキーボードショートカット設定は,下記のファイルに登録されています。この設定を優先したいのであれば,ファイルを参照し,必要に応じて4D側のキーボードショートカット設定を調整してください( SET MENU ITEM SHORTCUT
)。
~/Library/Preferences/com.myapp.*
17r6では,メソッドのコールスタック(呼び出し連鎖)を取得するためのコマンドが追加されたことに伴い,コンパイルモードの内部ランタイムバージョンがインクリメントされました。17r6でコンパイルしたコードは,新コマンドを使用していなかったとしても,17.xや17r5で実行することができません(「再コンパイルが必要」というエラーメッセージが表示されます)。17r5以前でコンパイルしたコードを17r6で実行することは問題ありません。
オブジェクト型のプロパティには,テキスト型あるいは日付型で日付がセットできるので,v17では,Date
のシンタックスが緩和され,テキスト型の代わりに日付型が渡されても,シンタックスエラー(59
)が返されないようになりました。
符号付き整数型のオーバーフローは未定義の動作です。MAXLONG*2
MAXLONG*3
1.234567898765e+23
のような実数値を整数型のフィールドや変数に代入した場合の結果は, WindowsとmacOSでは違うかもしれません。これは仕様です。
パラメーターが宣言されているメソッドの引数が省略された場合,そのパラメーター($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
と命令することにより,同一アプリケーションのインスタンスを起動することができます。