月別アーカイブ: 2017年9月

4D リストボックス 列の移動をできなくしたい

リストボックス 列の移動をできなくしたい

フォームにリストボックスを配置して列数を2以上にすると、実行モードではユーザが列を移動することができます。実行モードでリストボックスの列(ヘッダ部分)をドラッグすると、列の順番を変えることができる、という機能です。

プログラマとしては何もコードを書かずにこの機能を提供できるのはいいことですが、たまにこの機能を抑制したい時があります。つまりユーザに列の入れ替えをしてほしくないケースです。

例えば、次の例では、勘定科目の金額は借方金額の方が左の列、貸方金額が右の列に並んでいます。これを次のようにドラッグして貸方金額を左に移動させることができてしまいます。これは抑止したいところです。会計の世界では「借方金額は左」と決まっているからです。

図1 借方金額は左

図2 ドラッグして移動中

図3 貸方が左に!!

 

 

対策:

リストボックスのプロパティで「ドラッグしない列数」に「列数」と同じ数値を入力します。数値が異なる場合はどうなるかというと、左からN個目までが移動できない列になります。

http://doc.4d.com/4Dv16/4D/16.1/List-box-specific-properties.300-3373463.ja.html

図 リストボックスを選択して表示したプロパティリストの一部

プロパティリスト

現在の「ドラッグで移動しない列数」は次のコマンドで取得できます。

LISTBOX Get static columns

「ドラッグで移動しない列数」をセットするコマンドは次です。

LISTBOX SET STATIC COLUMNS

参考情報:

リストボックスの機能に「スクロースしない列数」というのがあります。

リスボックスの横スクロールが有効になっている時に、横スクロールすると左側にあった列は左に隠れてしまいます。このように隠れて欲しくない列、つまり左側にいつも表示していたい列を指定する機能です。フォームエディタではプロパティリストの「リストボックス」の「スクロールしない列数」に数値を入力することで指定します。

このほかリストボックスの機能に「スクロースしない列数」というのがあります。

列数が多かったり、列幅が大きい列がある場合、リスボックスは横スクロールが有効になります。ことのきにスクロールして欲しくない列、つまり左側にいつも表示していたい列を「スクロールしない列数」と呼びます。

フォームエディタではプロパティリストの「リストボックス」の「スクロールしない列数」に数値を入力することで指定します。

4D 文字数に応じてフォントサイズを自動的に小さくする

4D 文字数に応じてフォントサイズを自動的に小さくする

フィールドや変数は四角形の領域を指定して配置します。そして表示する文字列がこの四角形に収まるようにフォントサイズを指定します。しかし文字列が長い場合は文字が切れてしまいます。

リストボックスの場合は、ユーザが列幅をドラッグして広げたり、v16以降で使えるようになったエリプシスを指定することで文字切れの問題を緩和させることができます。

画面表示の場合はそれで問題はないのですが、印刷の場合は問題になります。あとで広げたりすることができないからです。

そこで、文字数によって、動的にフォントサイズを指定する方法を紹介します。フォームがロードされた時に表示したい文字列に合わせて、入り切らない場合はフォントサイズを小さくします。次のようなプログラムです。

このプログラムをフォームロード後「On Load」イベント、印刷時であれば「On Printign Detail」イベントで実行します。印刷時の例で説明します。

これで「詳細」部分が印刷される時。フィールドの幅を超える文字列のフォントサイズが自動的に小さくなります。

[注意]
「On Printing Detail」イベントはデフォルトでオンになっていて、オフにすることができません。明示的にオンにする必要はありません。デフォルトでオフになっている思い込んでいたために探してしまいました。

4Dで印刷、MacでPDFに保存するときにデフォルトのファイル名を指定したい

MacでPDFに保存 デフォルトのファイル名を指定したい

4Dアプリでフォームを使って印刷する場合、PDFファイルに保存したい場合があります。その時のデフォルトファイル名を指定する方法です。

プロジェクトメソッドに次のように記述します。

//—– ここから A04_btnPrint
//一覧を印刷、P07
//20170901 wat

C_LONGINT($numOfPages)
C_LONGINT($sizeOfAry;$i)
C_LONGINT($dlg_ok)
C_LONGINT($maxRows)
$maxRows:=42
C_LONGINT($pittari)
$pittari:=0

C_TEXT($title)
$title:=vA04_txtSpaceTitle+” “+vA01_txtPE_BeginEnd

P07_DefInit

//印刷設定ダイアログを表示
$dlg_ok:=JCL_prt_PageSetup (“P07_A04”)
If ($dlg_ok=1)

//印刷ファイル名を指定
SET PRINT OPTION(Spooler document name option;$title)

//進歩表示を隠す
SET PRINT OPTION(Hide printing progress option;1)

//総ページ数を求める ページごとの開始SL_ID
$numOfPages:=zz_prt_GetNumOfPages ($maxRows;->vA04_lstB_JO_ID)
For ($i;1;$numOfPages)

P07_PrintHeader ($i;$numOfPages)

//伝票を印刷 ボディ部を印刷
P07_PrintDetail ($i;$maxRows;->vA04_lstB_JO_ID)

If ($i=$numOfPages)

P07_PrintFooter

End if

If ($i<$numOfPages) PAGE BREAK(>)
End if

End for

End if
//—– ここまで 

このソースでは、SET PRINT OPTIONに「Spooler document name option」を指定すればPDFのファイル名をデフォルト設定できると期待しました。
SET PRINT OPTION
http://doc.4d.com/4Dv16/4D/16.2/SET-PRINT-OPTION.301-3432883.ja.html

□ Windowsの場合
OSにPDF出力機能が実装されていないため、オプションでPDF出力機能を追加することになります。このケースでは上記スプーラドキュメントのデフォルトファイル名はうまく機能します。

□ Macの場合
OSにPDF出力機能が実装されているため、うまく働きません。プリントダイアログで左下のプルダウンメニューの[PDFで保存]を実行するとデフォルトファイル名は「名称未設定.pdf」になってしまいます。
しかし、プリントダイアログで左下のプルダウンメニューで[プレビューでPDFを開く]を選択すると、プレビューアプリが起動してデフォルトファイル名に指定した文字列が適用されます。プレビューの保存機能を利用することでデオフォルトファイル名が有効に働きます。