遠隔地にある4DServerと接続

RTX1210を利用して遠隔地にある4DServerと接続します。

4D → RTX1210→インターネット→RTX1210(固定IP1アドレス)→4DServer(192.168.0.10などのローカルアドレス)

 

WebGUI へ管理者ログインした後の設定は次のとおりです。

1.[詳細設定]→[NAT]をクリック

[NATディスクリプターの一覧]が表示されます。

2.[デフォルトNATディスクリプターの一覧]→[設定]をクリック

新規ではなく、既存のNATディスクリプターを変更します。

3.[静的IPマスカレードの設定]→[▼]をクリック

静的IPマスカレードの設定が表示されます。

4.静的IPマスカレードを入力

1     192.168.0.10    tcp    80

識別番号:なんでも構いません。

内側アドレス外部からグローバルIPに接続された場合、内側に変換するローカルアドレス

プロトコルtcp

ポート番号19813,19814

5.[確認]をクリック

これで、遠隔地にある4DServerと接続できます。

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

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を開く]を選択すると、プレビューアプリが起動してデフォルトファイル名に指定した文字列が適用されます。プレビューの保存機能を利用することでデオフォルトファイル名が有効に働きます。

カテゴリー: 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

4D スタックサイズ

4D v15.2 Windows版で、次のようなメッセージが表示されました。
Mac版、winのビルド版では発生しません。

Not enough stack space to complete the current method.

ちなみにこのメソッドは実行されました。

下記回答を受けて、New Processの使い方を次のように変更

ありがとうございました。
New Processに128KBを与えていました。
$main_proc:=New process(“A00_main”;128*1024;”A00_main”;*)

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

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

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

4D Drag Window

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

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

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

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

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

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

20160726 Bugとして認定された

カテゴリー: 4D

4D Serverが使うポート

4D Serverとポート番号

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

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

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

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

詳しくはここ:

v17

4D リストボックスの任意のセルに色を付ける

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

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

listbox_properties

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

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

listbox_column_properties

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

ARRAY TEXT(vCH01_lstCH_DATEstr;0)

3.次のソースを追加

// 20160321 wat 会社は赤色で表示

C_POINTER($pColumn3)

$pColumn3:=OBJECT Get pointer(Object named;”vCH01_lstCH_DATEstr”)

C_LONGINT($sizeOfAry;$i)

$sizeOfAry:=Size of array(vCH01_lstCH_DATEstr)

For ($i;1;$sizeOfAry)

If (vCH01_lstCH_KUBUN{$i}=”会社”)

$pColumn3->{$i}:=”“+String(vCH01_lstCH_DATE{$i})+”

Else

$pColumn3->{$i}:=”“+String(vCH01_lstCH_DATE{$i})+”

End if

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

listbox_color

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

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