4D v17」タグアーカイブ

4D Serverが使うポート

4D Serverとポート番号

4D Serverは3つのTCPポートを使用して内部サーバとクライアントの通信を行います:

・SQLサーバ: デフォルトで19812 (環境設定の”SQL/設定”ページで変更可)。

・アプリケーションサーバ: デフォルトで19813 (“クライアント-サーバ/設定”ページで変更可)。

・DB4Dサーバ(データベースサーバ): デフォルトで19814。このポート番号を直接は変更できません。常にアプリケーションサーバのポート番号+1です。

詳しくはここ:

v17でも確認済み。

4D リストボックスから開くフォームの次前ボタン

4Dのリストボックスから開いたフォームに、「次前(つぎまえ、と読む)」を実装する

リストボックスの選択行の詳細を表示した時、次のレコードに移動するには、一度フォームを閉じてリストボックスに戻り、次の行をダブルクリックなどでレコードを表示する。これではユーザは不便。それでフォームに[次][前]ボタンを配置して、リストボックスに戻らなくても隣のレコードを表示できるように、という要望にお応えするのだ。

実装方法

たとえばvKA01_lstKAというリストボックスがある。キー配列はvKA01_lstKA_IDとすると、次前はこのvKA01_lstKA_IDの配列中から隣のKA_IDを取得して、そのレコードをロードして表示する、ような実装をする。これでリストボックスに表示されているレコードを行ったり来たりする動きになる。

実装箇所

修正が必要なのは次の箇所。

1)フォームに◁▶︎のようなボタンと現在の位置を2/30のような形式で表示するテキストが必要

フォームにオブジェクトを配置、現在の位置はvKA02_varIndexに表示、メッセージはSetControlsValues_PrevNext(後述)で作成する。

2)呼び出し元、たぶんKA01_btnModのようなボタンメソッド

次前しなければ$ka_idは変更されない値だったが、次前を実装するとフォームが閉じた時に変化していることがある。選択されている行番号も同様だ。戻ってきた時、最後に選択されているはずの行の内容を保存したり、リストボックスでその行を選択したりするために、フォームで次前が行われた結果の$ka_idと行番号を返してもらう必要がある。よってこれらはポインタで渡す。引数は次の3つ。

  • $ka_idのポインタ
  • 配列vKA01_lstKA_IDのポインタ
  • 選択されている行番号のポインタ
KA01_btnModの例

3)呼び出される側、KA02_Input_Mod

KA02_Displayする前に、配列のポインタ、行番号、$ka_idをプロセス変数に保持、ゲッターセッターを用意。_DisplayでOKされたら、フォームを表示する前のKA_IDと閉じた時のKA_IDは次前で変化している可能性があるため、Acceptの際にゲッターでKA_IDを取得してからレコードを保存する。リストを再作成してから、変化した行番号をゲッターで取得してリストボックスの行を選択し直す。

KA02_Input_Modの例

4)一番前に来たら前ボタン、一番後ろに来たら次ボタンをディスエイブルにするために、SetControlsValuesにSetControlsValues_PrevNextを追加

SetControlsValuesの例

5)次前ボタン(KA02_brnNext)

次前の際に、レコードを保存するかどうかは設計が必要だ。次のようなケースがある。

  • A)問答無用で保存(いわゆる自動保存)
  • B)問答無用でキャンセル(保存しない、変更内容は失われる)
  • C)変更していたら自動保存、変更していなければ保存しない
  • D)変更していたらアラートでお知らせしてから保存、変更していなければアラートせずに保存しない

理想を言えばDだが、Aでも成立するケースは多い。ユーザからの強い要望でBというケースもあったので決めつけることのないように。次の実装はAの自動保存。

KA02_brnNextの例、KA02_brnPrevは24、26行目の「+1」を「-1」に変えるだけ。

ネーミングおよびJCL4Dについては「4Dアプリ開発ガイド」を参照。

4DアプリをNotarizeするぞ、Catalina対応

これまで4Dアプリは、署名つきビルドをすれば、macOS Mojaveまでは、control+クリックで「開く」を選択すれば、実行することができた。

macOS 10.15 Catalinaは厳しい。Appleのいうところの「notarize」をしていないアプリをダウンロードして実行しようとすると、Controlクリックだろうが環境設定のセキュリティでなんとかしようとしても開けない。異常終了させられる。同じアプリをビルドしたマシンで起動させれば正常に動くし、USBで持っていけば別のマシンでも正常に動くのに。つまりアプリそのものは実行可能であるにも拘わらず、ネットから落としてきたというだけで悪者アプリのレッテルを貼ってくれる。

で、notarize。参考資料はここ↓、さすがです。

https://www.rk-k.com/archives/3458

xcodeでビルドするアプリはxcodeがこの辺りを上手いことやってくれるので、実際に何が行われているかはわかりにくい。アールケーさんありがとうございます。ターミナルコマンドでやってくれているのが助かります。4Dアプリにとっては必須ですので。

ここからは4Dアプリの場合:

4D v17.3で署名つきでビルド。まず拡張属性を取り除こう。特にResourcesフォルダとかにネットで管理しているテキストファイルとか画像ファイルを置いている場合は要チェック。まず

xattr -rc 「パス名」

これで「パス名」の中のフォルダの中まで拡張属性を取り除いてくれる。次に4Dをアプリケーションビルド。

治郎吉商店では、できたアプリとデータファイルなどをバンドルして出荷するので、出荷前にアプリを起動してデータファイルを作成。できた出荷用アプリを複製してデータファイル作成用アプリを作って起動。データファイル作成後は複製したアプリを削除。

この出荷用アプリはまだ実行されていないものを使う

出荷フォルダには「お読みください」などのファイルを配置。できたフォルダが次。

これが出荷イメージ

これをディスクユーティリティの機能でdmg化する。ターミナルを起動して、次を実行。圧縮のオプションを使っている。

実行すると ・・・ と表示されて実行しているのがわかる。結構時間がかかる。

ここでも拡張属性に注意。「お読みください」などのファイルを誰かに編集を依頼して、ネットで落とした場合は拡張属性がついてしまうのだ。codesignに失敗することになる。

次はnotarize

このコマンドは成功する時が長い。dmgよりも長い。何も表示されずいきなり終わる。

これでできたのをzip圧縮する。なぜかWordPressのサイトにdmgがアップできないからね。しばらくすると(数分?)Appleからメールが来る。

このケースではビルドのタイムスタンプとメールのタイムスタンプの差はおよそ8分。

ShareDocにアップして、別のCatalinaマシンで試す。Catalinaで動いた!ちなみにアップしたマシンはMojaveでした。

メソッドエディタから4D COC CENTER ランゲージリファレンスを開く(v17)

4D オンラインマニュアル

メソッドエディタから4D COC CENTER ランゲージリファレンスを開く(v17)

v16以前からの仕様なので、いまさらのネタではありますが、何度もひっかかっているので書いておきます。

メソッドエディタで、4Dコマンドのリファレンスが見たくなるとき、optionキーとcommandキーを押しながらコマンド名をクリックすると、クリックしたコマンドのリファレンスがブラウザーに表示される。v17で作成したプロジェクトの場合はv17のランゲージリファレンスが表示される。と、ここまではOK。

問題はv16以前から移行してきたプロジェクト。option + commandクリックすると、v16のランゲージリファレンスが表示される。たいていの場合はv16のリファレンスが開いても内容がほぼ同じなので事足りるが、新しく追加されたコマンドの周辺を探っている場合、v17で新しく追加されたコマンドがないので、ヒットしなかったり、v16の古い情報が表示されたりして不便。ヒットしなかった場合はマニュアルサイトのv16のトップが表示される。

原因は、4Dの環境設定にある。v16から移行したプロジェクトでは、「一般」の「ドキュメントの場所」に「Webサイト:」の項目があって、これがv16のサイトを指したままになっている。

ここをv17に修正すればよい。

 

 

4D リストボックスの列幅拡大「カラム自動リサイズ」(v17)

リストボックスの列幅拡大

これはうれしい。ウインドウを拡大したときに、拡大対象の列を指定することができる。v16からあったらしいが、確かめたのはv17。少し面倒な手順もあるのでここに記す。

4Dには画面をリサイズする機能がある。フォームを作成すると、デフォルトでフォームプロパティの「固定幅」と固定高さ」はノーチェック。これでフォームを横方向と縦方向に拡大/縮小ができるようになっている。

4Dv15以前から、リストボックスを配置して、プロパティで「リサイズオプション」で「横方向サイズ変更」をチェックすると、フォームの拡大に伴ってリストボックスが拡大する。しかし「最も右のカラムのみがリサイズされます。」とマニュアルにもあるように、例えば次のフォーム。

フォームを拡大させると一番右の列が拡大されるけど、消費税の列が拡大してもうれしくない。

摘要の列が広がってほしい。

v17では(v16からあったようだが確かめていない)「カラム自動リサイズ」をチェックすると、列ごとに幅を拡大するかどうかを指定できる。

次に、消費税の列の「座標とサイズ」プロパティで「最小幅」と「最大幅」を「幅」と同じ68にする。これでこの列は固定幅を指定したことになるが、すべての列が固定幅だとやはり一番右の列が拡大する。

拡大させたい列は「摘要」。「最小幅」は「幅」と同じ144、「最大幅」はデフォルトの32000にする。これで「拡大されたあと、元に戻るときに最小で144以下になって欲しくない」という意味と、「拡大の最大値は無限」という意味になる。拡大のときだけじゃなくて、縮小のときにどの列が狭くなって欲しいかも設定しておくのだ。縮小のときは各列がまず最小幅になろうとするので、最小幅に144を与えると、この列の縮小は144で止まり、さらにリサイズすると別の列が狭くなっていって、これ以上狭くなる列がないとリサイズができなくなる。

これで「摘要」列だけを拡大させることができた。

 

【注意】
1)「拡大させたくない列」すべてについて、上記の消費税のような設定をしなくてはならない。
2)「拡大させたい列」については元に戻るときの最小幅も設定しなくてはならない。
3)v16以前から変換されたプロジェクトではデフォルトで「カラム自動リサイズ」はオフになっている。

参照:
4D v17

リストボックス特有のプロパティ

http://doc.4d.com/4Dv17/4D/17/List-box-specific-properties.300-3743666.ja.html