VectorScript用のエディタ紹介パート2

VectorScriptプログラムを編集するときはVectorworks備え付けのエディタではなく、別にプログラミング用のエディタを使うと便利。コマンドなどのキーワードに色付けしてくれる、いわゆるカラーシンタックス機能が使えるからだ。macOSには「CotEditor」や「mi」がある。Windowsでは「Visual Studio Code」。

今回紹介するのはVisual Studio Codeのカラーシンタックス機能の使い方。標準のVisual Studio CodeでVectorScriptのソースフィアルを開いてもカラーシンタックスは適用されない。VectorScriptの文法は構造化プログラミング言語のPascalをベースにしている。Pascalのカラーシンタックスが適用されれば実用上は大体OKなのだが、こちらも標準ではついていない。

Visual Studio Codeにはあとからカラーシンタックス言語を追加するために、Color Theme(カラーテーマ)をインストールする機能がある。Pascal言語のカラーシンタックスを実現するには、Pascal用のカラーテーマをインストールする。次のURLから簡単にインストールできる。

https://marketplace.visualstudio.com/items?itemName=alefragnani.pascal

このサイトは、ブラウザで「VisualStudio-Code Pascal」で検索、しても出てくる。 

ブラウザ上で「Install」をクリックする。これでVisualStudio Codeが起動してきて、VisualStudio Codeではテーマのページが表示されるのでもう一度「Install」をクリックする。

試してみる。ファイル名に「test.pas」のように「.pas」拡張子をつけてソースを記述して開く。カラーシンタックスが適用される。

Pascal ThemeをインストールしたVisual Studio Codeで開いたVectorScriptのソース

図は「VectorScriptプログラミング入門」に掲載しているコード。

よくみたらエーアンドエー社のサイトにもっと便利なのがあった。こちらはPascalではなくてVectorScript用。

https://www.aanda.co.jp/develop/VS/index.html

Vectorworks の動作環境

Vectorworksの動作環境について、実際にどんなバージョンを開発に使用したかをメモしておく。

たとえば、VW2014以前で実装されているVectorScriptコマンドに旧ダイアログ(Classic Dialogコマンドを使用)が使われていて、それらをModern Dialogに置き換える、ような仕事があったとする。20220405時点では、macOS MojaveのVW2015で開発して、Win7(64bit)のVW2014で最終動作確認する、と効率的だ。

Vectorworks 2014

Windowsでは、Windows7(64bit)またはWindows7(32bit)のいずれも推奨動作環境になっている。

VW2014では動いていたClassic Dialogコマンドは、VW2015以降のVectorScript環境では動かない。古いコマンドを実際に動かしてみて仕様を確認するにはVW2014の環境を用意する必要がある。

Modern Dialog

一方、Modern DialogコマンドはVW2015, VW2014のいずれでもそう変わりはないのでどちらでも動くコマンドを作るのは容易。

macOS

macOSはMojaveがターニングポイントになる。MojaveではVW2015, VW2016, VW2017, VW2020が動いている。Catalina以降ではVW2017は動かない。Catalinaで今使っているのはVW2021。

エンコーディング(文字コード)

VW2018はutf-8で、それ以前はShift-JIS。

64bit/32bit

64bit/32bitの制約もある。VW2016から32bit版がなくなった。エーアンドエー社のサイトには、「Vectorworks2016は64bitアプリケーションです。32bit OSには対応しておりません。」とある。VW2014までは32bitのみ。VW2015は64bitと32bit用のがどちらも用意されていた。

エーアンドエー社の関連サイト:

https://www.aanda.co.jp/Support/sysreq.html

遠隔地にある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

VBScriptでVectorworks 2016を自動実行できない?(解決済み)

あるお客様が、Vectorworks 2016へのバージョンアップに伴って、当社開発のシステム(Vectorworks 2009で最初のバージョンを提供、Vectorworks 2012へはアップグレード済みのシステム、プラグインを含む)をバージョンアップを依頼してきました。このシステムにはVBScriptによる外部からの自動実行機能が含まれていました。ここに含まれているプラグインをVectorworks 2016に対応させて、システムを動作確認したところ、以前から使っていた開発マシンでは正常に動いたのに、お客様のマシンでは動かない、という現象に悩まされました。

実は別件で、やはり当社開発のシステムのバージョンアップ、こちらはVectorworks 2010からVectorworks 2015へのバージョンアップです。こちらでもVBScriptによる自動実行機能が含まれています。

調査したところ、Vectorworks 2013までのバージョンがインストールされている環境では動いてしまうようですが、Vectorworks 2016だけがインストールされている環境では動かないようでした。

A&Aと米Vectorworks社に問い合わせたところ、Vectorworks.tlbファイルが送られてきました。これでVectorworks 2015, 2016でも正常にシステムが動作しました。ちなみにVectorworks 2014も同様の方法で解決できるはずです。

 

HDMI KVM Switch 16 port

2016年末から2017年始にかけて、設置に苦労したお話です。

サーバラックにMac miniが6台、もう一つのサーバラックにはMac miniが4台、Mac Proが1台あって、ディスプレイは4x1の切替器を使って共有していた。6台のラックにラックマウントの16x1の切替器を購入した。手頃な価格のはCKL製しかなかった。

71bbrv8peel-_sl1200_

購入して入荷してから接続設定までかなりの時間と手間がかかった。上記の写真から、USBタイプのキーボードを接続すれば動くと思ってしまったことが第1の原因。次の商品の説明や別の画像を見ると...

  • Windows、Linux、MacOS9 、 OSX、Sun Microシステムをサポートします。LEDディスプレイを使用して、パソコン及び服务器状態を監視することが応用できます
  • キーボード上のボタンとホットキーについての二つの切り替えモードを支持することができます。外部電源アダプタを連続してパワーをします
  • 1台コンソール(PS/2キーボード/マウス)から8台コンピュータをコントロールします。USB1.1/2.0仕様に完全アコードします
  • パソコンを消さなくて、全てKVMのデバイスを連続して、いつでも追加したり削除することができます
  • 1920×1440@ 60HzまでのVGA解像度をサポートします。切り替えを起動する時にブザーを支持します

71b6opjqmhl-_sl1100_

写真の「入力」というところ、確かにPS2端子を差している。この隣にあるUSBポートはメモリースティック装着用か。

結論からすると、次の3つの項目についてチェックする必要があった。

□ キーボードとマウスはUSBではなくPS2タイプを使う
1つ目の写真には、USBタイプのキーボードとマウスが写っているが、実際にはUSBタイプは動作しなかった。USB端子への供給電力が不足しているためかもしれない。

□ Mac miniでディスプレイをスリープする設定になっていた
スリープしているMac miniに切り替えたとき、本体からのディスプレイ信号がないため、切替器もスリープしてしまう。切替器の電源を入れ直すとMac miniを認識する。

□ HDMIケーブルにハイビジョン専用のが混ざっていた
Panasonic製1380円のがNGだった。ちなみにこのケーブルはApple TVとは接続できている。

20170101

&nbsp;