4D」カテゴリーアーカイブ

リストボックスのイベントハンドリング(4D v16)

よくあるフォーム&ディテールの画面

エディットフィールドがいくつかあって、同じフォームに明細データがリストボックスで表示されているパターンです。

タブキーを押してフィールドを移動していき、リストボックスにフォーカスが移動したとき、このリストボックスは、
・配列型
・リストで編集可能
にしておきます。
そこで次のようにしたいです。
・配列要素がなければ1つだけ作る
・最初のフィールドに移動
これにはリストボックスのフォームメソッドに次のように記述します。

: (Form event=On Getting Focus)

If (Focus object=Self)

EDIT ITEM(vA05_lstJO_D_CODE;1) // 20170306 ok

End if

フォーカスが来たときに、EDIT ITEMを実行して、一つ目の編集可能な列に移動させています。if(focus object=self)が重要で、これがないと最初の列から次の列にフォーカスを移動できなくなってしまいます。次の列に移ろうとするときも、Getting Focusがリストボックスに対して発生してしまうからです。

4Dスタックサイズが足りない

JCL_dlgという自社製のダイアログを表示するコンポーネントを使っていました。たとえば「削除してよろしいですか?」などと表示するためのダイアログを標準化しているのです。このコンポーネントを呼び出しているときに、問題が起こりました。

4D v15.2 Windows版で、次のようなメッセージが表示されました。
Mac版、winのビルド版では発生しません。ダイアログのボタン名をセットしているコードが無視されていました。

Not enough stack space to complete the current method.

サポートに問い合わせたところ、下記のような回答が得られたため、
親プロジェクトのアプリで、New Processに与えたパラメータを確認したところ、第2引数に128KBを与えていました。
$main_proc:=New process(“A00_main”;128*1024;”A00_main”;*)

次のように変更したら問題は発生しなくなりました。
$main_proc:=New process(“A00_main”;1024*1024;”A00_main”;*)

サポートありがとうございました。

後日談
次のようにスタックサイズにゼロを与えると、デフォルト値をセットしてくれるようです。
$main_proc:=New process(“A00_main”;0;”A00_main”;*)

v15の場合、512*1024になります。

────────────── 回 答 ─────────────────

Not enough stack space to complete the current method メッセージが表示される理由は

1)New processコマンドの第2パラメーターが小さい
2)Execute on serverコマンドの第2パラメーターが小さい
3)プラグインが古い

などが考えられます。インタープリターとコンパイルおよびビルド版で状況が違う理由として考えられるのは、パラメータ並びにローカル変数の変数定義(型宣言)がされていないことが考えられます。

項目1と2についてですが、第2パラメータの推奨値は、下記のように変化しています。

4D v11:64KB
4D v12:128KB
4D v13以降:512KB

これは今のところドキュメント化されていない仕様ですが、4D v13以降は前述コマンドの第2パラメータに0を渡すと、そのバージョンの推奨値を少し上回る値がセットされます。

上記につきまして、当該データベースをご確認くださいますようお願い申し上げます。

────────────────────────────────────

4Dアプリ、リリースパッケージを作成

リリースパッケージ作成作業

4Dアプリをビルドしたあとの作業として、次の操作が必要。

1)使用許諾書 KeValueテーブルに読み込む
 最初にアプリを起動したときに使用許諾に同意するか促すメッセージをダイアログボックスに表示する。このメッセージはリリース直前まで変更される可能性があるため外部テキストにしている。

2)ライセンス購入 KeValueテーブルに読み込む
 利用者はライセンスキーを入力するまではお試し版利用者として扱われ、主要なテーブルへの登録件数が制限されたモードになる。この説明を表示するためのテキスト。やはりこのメッセージもリリース直前まで変更される可能性があるため外部テキストにしている。

3)郵便番号(県、事業所) z_PostalCodeテーブルに読み込む
 郵便番号ファイルはテキストで15MBもある。これを出荷前に読み込ませたい。

4つのテキストファイルを読み込ませるため、アプリ側は、A00_AddNecessariesというメソッドでそれぞれテーブルにImportする仕掛けになっている。出荷時に毎回これを実行するたびに、ファイルオープンダイアログでテキストファイルを指定していた。

これを修正
Importメソッドを修正してリソースフォルダからダイアログ無しで読み込むことにした。

「jiro」フォルダに上記4つのファイルを入れておいて、ビルド後のパッケージの中のresourcesフォルダに入れる。なぜresourcesかというと、Get 4d folderで取得できるからだ。Componentsと違ってビルド時にアプリ側にコピーされないため手作業でコピーする必要があるが。
ちなみにComponentsフォルダにテキストファイルとフォルダをおいてみたら、ビルドしてもコピーされなかった。おそらくビルド時にコピーされるのは4DBファイルとそれを内包するフォルダに限定されていると思われる。

この状態で、アプリを起動。4DDファイルを作成するダイアログが表示されるので、アプリと同じフォルダを指定。

このあと、郵便番号を読み込むかどうかのダイアログが表示されてリターンすれば、自動的にテキストファイルが読み込まれる。ImportメソッドはDocument to blobを使うことによって高速化した。

追伸:
v15.2 Hotfix1で起動時の速度は速くならなかった。

4D Drag Window

4D v15で動作テストしていたら、以前動いていたウインドウをドラッグして移動させる機能が反応しなくなっていた。

ボタンオブジェクトのオブジェクトメソッドに次のように記述していた。
DRAG WINDOW

これだけでこのボタンをドラッグすると、ウインドウもドラッグできるという便利なコマンド。

なぜ動かなくなったかというと、どうやら、
4Dがボタンオブジェクトの描画方法をOSに任せるようになったため。別件だが、このおかげでmacだとOKボタンの文字が白抜きになって読めない、という弊害も発生している。

この仕様変更につられて、通常のボタンはクリックすると反転イメージに描画される、そのところでDRAG WINDOWが無視されてしまうのではないか、という見立てです。

解決策は、透明ボタンを使うこと。
こちらは描画方法をOSに任せていないため、v11以前の4Dと同様に4DがOSに頼らずに描画、ハンドリングしているとみられる。このためDrag Windowも正しく動作するのだろうと。

20160726 Bugとして認定された

4Dのリストボックスで、文字に色を付ける方法

リストボックス : 文字に色を付ける方法

行全体が同じ色でいいなら、プロパティで「行フォントカラー配列」に、たとえば名前が「vKO01_lstKO_FontColors」のようなlongintの配列を用意して、プロパティに指定します。同様に背景色も行単位で指定することができます。

listbox_properties

それでは、「この行のこの列だけ赤色で表示したい」場合はどうすればいいのでしょうか。次です。

1.リストボックスのオブジェクトプロパティで「マルチスタイル」をチェック

listbox_column_properties

2.表示列は文字列で宣言

ARRAY TEXT(vKO01_lstKO_Last_CH_DATE_str;0)

3.次のソースを追加

//KO01_lstKO_Make_LastCH
//20160818 wat
// リストボックスの配列作成、最後の調律日の属性で色を付ける

C_POINTER($pColumn5)  //調律日(文字列)
$pColumn5:=OBJECT Get pointer(Object named;”vKO01_lstKO_Last_CH_DATE_str”)

C_LONGINT($sizeOfAry;$i)
$sizeOfAry:=Size of array(vKO01_lstKO_ID)

// 20160326 wat 最終調律日を表示
ARRAY DATE(vKO01_lstKO_Last_CH_DATE;$sizeOfAry)
ARRAY TEXT(vKO01_lstKO_Last_CH_DATE_str;$sizeOfAry)
ARRAY TEXT(vKO01_lstKO_Last_CH_KUBUN;$sizeOfAry)

// 会社は赤色で表示
For ($i;1;$sizeOfAry)

vKO01_lstKO_Last_CH_DATE{$i}:=CH_DATE_last_byKO_ID (vKO01_lstKO_ID{$i})
vKO01_lstKO_Last_CH_KUBUN{$i}:=CH_KUBUN_last_byKO_ID (vKO01_lstKO_ID{$i})

If (vKO01_lstKO_Last_CH_KUBUN{$i}=”会社”)
$pColumn5->{$i}:=”<SPAN STYLE=\”color:#D81E05\”>”+String(vKO01_lstKO_Last_CH_DATE{$i})+”</SPAN>”

Else
$pColumn5->{$i}:=”<SPAN STYLE=\”color:#000000\”>”+String(vKO01_lstKO_Last_CH_DATE{$i})+”</SPAN>”

End if

End for

このように、リストボックスの列にマルチスタイルに指定すると、セルごとに異なるHTMLタグを指定/表示できるようになります。

listbox_color

例では、vKO01_lstKO_Last_CH_DATE_strの列を表示して、日付型であるvKO01_lstKO_Last_CH_DATE列は非表示にしています。

元のサンプルは4D社からv13のソースを入手、v15でも動作確認済みです。