グリッド内で、金額を入力するカラムがあるのですが、
通常は数十万円程度の入力のため、
カラムのデフォルトの幅、は6桁+カンマの7桁を前提に設定していますが、
明細によっては(つまり、あるレコードだけ)、数千万程度の金額を入れることがあり、
その場合に、自動的にカラムの幅を大きくして、
入力金額すべてが表示枠内に収まるようにしたいです。
どのような方法が良いでしょうか。
とりあえず、ユーザの入力時だけ自動伸張することを前提にして、
update-data メソッドで実装してみました。
Code:
{let people:RecordSet =
{RecordSet
{RecordFields
{RecordField "First", domain = String},
{RecordField "Last", domain = String},
{RecordField "Age", domain = int}
},
{RecordData First = "John", Last = "Smith", Age = 25},
{RecordData First = "Jane", Last = "Smith", Age = 29},
{RecordData First = "Jane", Last = "Jones", Age = 28}
}
}
||自動伸張可能なカラム
{define-class public open ElasticCell
{inherits StandardStringCell }
{constructor public {default}
{construct-super}
}
{method public open {update-data val:any}:#DataException
let str-val:String = {self.format val}
def current-col-width =
{if-non-null self.column.width then
{any-to-Distance self.column.width}
else
0pt
}
||文字数×フォントサイズ ÷ 2 + 余白
||※実際は、文字のバイト数を取得したほうがよい
def demanded-cell-width =
{any-to-Distance self.font-size} * str-val.size / 2 + 10pt
set self.column.width = {max current-col-width, demanded-cell-width }
{return {super.update-data val}}
}
}
{value
{RecordGrid
record-source = people,
{RecordGridColumn "Last", cell-spec = ElasticCell}
}
}
Curlの拡張ライブラリには、縦に伸張する(改行分の複数行を表示できる)セルがありますね。
ステキ。
http://developers.curlap.com/re-referenc...lib05.html
Code:
{import * from COM.CURL.EXT.DATA-ACCESS}
{let rs:RecordSet =
{RecordSet
{RecordFields
{RecordField "multi", domain = String}
},
{RecordData multi = "あいうえおかきくけこさしすせそ"}
}
}
{value
{RecordGrid
record-source = rs,
height = 5in,
{RecordGridColumn
"multi",
cell-spec = MultilineStringCell
}
}
}
テキストの正確な長さを取得するためには、font-sizeよりDisplayContextのget-string-advance-widthメッソドを使用することがいいと思います。
画面のDisplayContextを求める簡単な方法はget-default-display-contextプロシージャを利用します。
次はテキストの長さを取得する例です。
Code:
def string-width = {{get-default-display-context}.get-string-advance-width
{Font "tahoma", 9pt}, "いちにさんし" }
ご指摘のとおり、フォントサイズが関係するので、
get-string-advance-width を使うべきですね。
Unicode などの文字の場合は、おかしくなってしまうところでした。
ありがとうございます。