View Proエリアは,SpreadJSをベースにしており,CEF版のWebエリアに表示されています。そのため,標準のView Proコマンドに加え,SpreadJSのJavaScript APIもWebエリアコマンド経由で実行することができます。たとえば,セルのスタイルを変更した後,下記のようなコードで操作を取り消すことができます(command
+Z
を入力することに相当)。
Utils.spread.undoManager().undo()
spread
ではなく,Utils.spread
と記述する必要がある点に留意してください。このテクニックは,リボンインタフェースだけで使用することができます。これは仕様です。ツールバーインタフェースで取り消すことができるのは,値の入力など,基本的な処理だけとなっています。
Internet Commandsではメールが送信でき,SMTP Transporter
では送信できない場合,SMTPサーバーのTLSバージョンが古い可能性があります。これは仕様です。サーバーがTLS_1.1
またはTLS_1.2
をサポートしていない場合,checkConnectivity()
でエラー 42
43
49
が返されます。これに対応するOpenSSL内部エラーメッセージは下記のとおりです。
1425F102:SSL routines:ssl_choose_client_version:unsupported protocol
古いSMTPサーバーを使用する場合,4DのデフォルトTLSバージョンを引き下げる必要があります。
SET DATABASE PARAMETER(Min TLS version;TLSv1_0)
Mac版でTRANSFORM PICTURE
のScale
オプションの倍率を0.5
から0.99
に設定した場合,.jpg
画像ファイルのサイズが縮小される代わりに拡大されることがあります。これは仕様です。0.5
あるいは1
のように割り切れる倍率であれば,問題ありません。現行バージョンでは,.jpg
画像を処理するためにシステムのライブラリをコールしています。システムは,最高の画質つまり100%
をデフォルトで適用しています。v12では,4D側で画質が94%
に設定されていました。画像を中途半端な倍率(たとえば78%
)にリサイズする必要があり,v12と同等のサイズを得たい場合,CONVERT PICTURE
で明示的に画質を指定してください。
64ビット整数型のフィールドに登録されている符号なし整数値を符号あり32ビット整数型の変数(C_LONGINT
)に代入した場合,インタープリターモードにおけるオーバーフロー値(例:30,000,000
)の扱いは,プラットフォーム依存となります。これは仕様です。Windowsでは,オーバーフロー値が0
になりますが,Macではなりません。そのため,クエリや演算の結果がプラットフォーム間で違うことがあります。なお,コンパイルモードでは,どちらのプラットフォームでも同じ結果になります。いずれにしても,整数値オーバーフローの動作は「未定義」ですので,特定の動作を前提にしたコーディングは避けるべきです。たとえば,整数をC_REAL
で処理できるかもしれません。
Mac版のv18は,4D SASによってコード署名され,アプリ公証(ノータリゼーション)にも合格していますが,macOS 10.13 High Sierraでは,初回の起動時に「開発元が未確認のため開けません」というエラーが表示されます。これは,4D.app特有の現象であり,4D Server.appでは発生しません。4D.appには,モバイルアプリのジェネレーター(4D for iOS)がプリインストールされていますが,このSDKのSwiftフレームワークは,High Sierraにインストールされているものよりもバージョンが新しいため,GateKeeperがアプリの検証に失敗してしまうようです。
4D for iOS v18のシステム要件は・・・
Xcode 11.2 Swift 5.1 iOS 13.2 macOS 10.14.4
・・・となっています。
4D v18 LTSのシステム要件は・・・
macOS High Sierra (10.13) – macOS Catalina (10.15)
・・・ですが,上述した問題が発生するようであれば,MojaveまたはCatalinaを使用することが推奨されています。
開発プラットフォームをアップグレードすることが難しい場合,下記いずれかの方法で問題を回避することができます。
Swiftをインストールする【推奨】
私たちにとって、日を追うごとにデベロッパーを楽にすることは大事な目的です。そしてリストボックス は、この目的を叶えるための、4Dで最も使われている強力なフォームの一つです。ご存知のようにリストボックス は多くのイベントのトリガーです。4D v18 R2ではForm eventコマンドを拡張して、リストボックス がトリガーとなった場合により多くの情報が返されるようにしたのは、そのような理由です。
古いトリッキーなコードで、どの列、行、ヘッダーをクリックしたか、マウスを重ねていたかを知りたいのではないでしょうか。よりスムーズでスマートな方法をお見せしましょう。
イベントによって、追加された関連のあるプロパティがForm eventコマンドによって返されます。 いくつかサンプルをチェックしてみましょう。
ヘッダーオブジェクトの名称、カラムオブジェクトの名称、カラム番号はForm eventコマンドによって返されます。以下のサンプルは、On Header Clickイベントでトリガーされた時にオブジェクトを返す例です。
{"headerName":"headerLastname", // New property - Header object name "columnName":"lastname", // New property - Column object name "column":2, // New property - Column number "code":42, "description":"On Header Click", "objectName":"EmployeesLB"}
例えば、カラム・オブジェクト名をデータベースの実際の属性名(例:lastname)に設定した場合、
Employeeのlastnameを表示するカラムのヘッダーをクリックした際に、lastnameとfirstname属性のカラムをソートします:
Form.event:=FORM Event
Case of
: (Form event code=On Header Click)
If (Form.event.columnName="lastname")
Form.employees:=Form.employees.orderBy(Form.event.columnName+", firstname")
End if
End case
On Display Detailイベントがトリガーされる場合、追加される関連のあるプロパティ(例:isRowSelected)はForm eventコマンドによって返されます。これはリストボックス の行の外観を管理するのに役に立ちます:
以下はリストボックス のMeta info expressionプロパティのメソッド(setColor)のサンプルです:
setColorメソッド:
C_OBJECT($event;$0;$meta)
$event:=FORM Event
$meta:=New object
Case of
: ($event.code=On Display Detail)
If ($event.isRowSelected) //set color when row is selected
$meta.fill:="lightblue"
End if
End case
$0:=$meta
そして行を選択した際のリストボックス の状態です:
他によく使われるイベントはOn Mouse Moveイベントです。下記はForm eventコマンドによってトリガーされた時に返されるオブジェクトの例です。
マウスを置いた場所の役に立つ情報をすぐに入手できます!
Form eventコマンドが返すのは:
{"area":"header", // The mouse is on a header
"areaName":"headerLastname", // Header object name
"column":2, // Column number
"columnName":"lastname", // Colmun object name
"code":37,
"description":"On Mouse Move",
"objectName":"EmployeesLB"}
Form eventコマンドが返すのは:
{"area":"cell", // The mouse is on a cell
"column":1, // Column number
"row":2, // Row number
"columnName":"firstname", // Colmun object name
"code":37,
"description":"On Mouse Move",
"objectName":"EmployeesLB"}
とても多くのリストボックス イベントがあるので、一つのブログでは全てをカバーすることはできません。ドキュメントをチェックして、各イベントについてより詳細な情報を参照し、HDIサンプルをダウンロードして多くを学んでください!
入力フォームでレコードを表示している間,そのテーブルは自動リレーションの対象から除外されます。これは編集中のレコードが意図に反してアンロードされることを防止するための措置であり,仕様です。たとえば,Nテーブルの入力フォームでダイアログを表示している場合,RELATE MANY
でNテーブルのカレントセレクションを作成することはできません。
フォームのサイズが「自動」に設定されている場合,ウィンドウの最小サイズは,すべてのオブジェクトが表示できるサイズになります。そのようなウィンドウに対してSET WINDOW RECT
を使用する場合,ウィンドウの最小サイズを下回るような指定をすることがないようにしてください。
コマンドで強制的に変形された「自動サイズ」のウィンドウをユーザーがマウス操作でリサイズした場合,ウィンドウの境界付近に表示された中途半端なオブジェクトが完全に表示されるよう,ウィンドウサイズの補正が試みられますが,ウィンドウの境界部はスプリッターでもあるので,同時にオブジェクトがリサイズされ,再びウィンドウサイズが不足することになります。ウィンドウとオブジェクトが互いを増幅させるため,リサイズがいつまでも終わりません。「自動サイズ」のウィンドウに対してSET WINDOW RECT
を使用する場合,ウィンドウの最小サイズに違反するような設定をしないように注意してください。
Windows版で,ウィンドウを表示する場合,編集メニュー(コピー&ペーストなど)を誤って無効化していないか,特に注意してしてください。Macとは違い,モーダル型のウィンドウがメニューバーをdisable
にするのは,仕様です。