programing」カテゴリーアーカイブ

リストボックスのプロパティで「セレクションハイライトを非表示」4D v17

リストボックスのプロパティで「セレクションハイライトを非表示」4D v17

行背景色配列(バックグラウンドカラー)、行フォントカラー配列(フォントカラー)を与えると、セレクションハイライト中のフォントカラーを制御できない、という問題が、v17で回避できるようになった。

v16以前は、次の図のように、選択行はOSで指定された色になり、文字色は黒、または指定した色になっていた。

文字色が反転しないため、これではハイライト色と文字色が近くなってしまって読みにくい。v17のプロパティで次の設定項目「セレクションハイライトを非表示」が追加された。これをチェックしてハイライトを自力で処理できる。自力ハイライトと呼ぶ。

図のようにリストボックスのプロパティで、次の3ヶ所に注目。

1)「セレクションハイライトを非表示」にチェック
2)「行背景色配列」に「vA01TB_lstBR_BakColor」を指定
3)「行フォントカラー配列」に「vA01TB_lstBR_FontColor」を指定
4)リストボックスのOn Loadで配列に色を代入
5)リストボックスのOn Selection changeで選択された行の背景色とフォントカラーを代入

すると次のようになる。

・色つきの行:文字が緑で背景が黄色 → 自力ハイライト:文字が黄色で背景が緑
・色無しの行:文字が黒で背景が白 → 自力ハイライト:文字が白で、背景が緑

勝手にハイライトしてくれないので、色を付けていない行も含めて、選択行が変化したときに常に配列に色を代入する必要がある。色は、配列に代入したときに適用されてリストボックスに表示される。

 

メソッドエディタから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

4D v16: フォームの2ページ目にWebエリアを配置しない

4D v16: フォームの2ページ目にWebエリアを配置しない

フォームにWebエリアを配置して、WA SET PAGE CONTENTでhtmlコンテンツをレンダリングしています。

このフォームで表示したいWebエリアが4つあって、1ページのフォームでは入りきらない。そこでページを増やして2ページ目にWebエリアを配置したのでした。するとその2ページのWebエリアにhtmlコンテンツが表示されない。

不思議なことに3ページに移動させて戻ったりすると2ページのWebエリアは表示される。2ページから1ページに戻って、2ページに行くと表示される。しかしウインドウを開いた直後に2ページに移動させたときだけはどうしても表示されないのでした。メソッドが悪いわけではなさそう。

(4D サポートに電話して確認、解決しました)

これは4D、というかWebエリアの仕様でした。Webエリアは表示方法や画面制御について外部のレンダリングを使っていて、そのため4Dが制御しきれない部分があって、ウインドウを開いた直後に表示されるページ(1ページと0ページ)には、ウインドウを開いたタイミングで表示されるが、別ページのWebエリアにはオブジェクトがロードされる前にコマンドを実行しても作用しない、ということでした。どうやらFORM GOTO PAGE(2)の直後にWA SET PAGE CONTENTを実行しても、まだWebエリアはロードしきれていないため内容が表示されない。

で、回避策を考えました。
1)ページをやめて別のウインドウを開く
2)0ページに配置して、1ページを表示するときは四角形で隠しておく
3)0ページに配置して、2ページ目を表示するときだけ所定の位置に移動させ、ほかのページを表示するときは遠くに移動させておく
4)0ページに配置して、2ページ目を表示するときだけVisible、ほかのページを表示するときはInvisible

1)はできることはわかっているけど仕様変更なのでやりたくない。2)から試す。すると、1ページ目に置いた四角形は、0ページのボタンとか四角形を隠すことはできるが、0ページのWebエリアを隠せない。Webエリアは常に一番前に表示されてしまう。順番も4Dが制御しきれない部分のようです。左の図の2つあるWebエリアのうち、後ろの方を0ページに、前の方を1ページに配置したら、右の図のように1ページ目の四角形やボタンよりも前に表示されてしまう。これも驚きの結果だ。

 

3)はOK。ちょっとコードがトリッキーに見えるけど、これでも良しか。
4)もOK。こちらは仕様に納得感があり、コードはシンプル。これを採用。

マニュアルを見ると、次のように書いてあります。VISIBLEやMOVEで制御しろと言っているような...

Webエリアのプログラムによる管理
他の動的なフォームオブジェクトのように、Webエリアはオブジェクト名とテキスト型の変数名を持ちます。これらはWebエリアをプログラミングに よって処理する際に使用されます。 特にWebエリアに対して OBJECT SET VISIBLE コマンドと OBJECT MOVE コマンドを使用することができます。