レコードグリッドの行の背景色制御ですが、
下記の例のように「Notified」の値の変動によって変わると思いますが
「Notified」のデータ抽出時のみの値で判断して、色を付けたいのですが可能でしょうか?
例:
{include "../../default/support/data-long.scurl"}
{define-proc public {notified rg:RecordGrid, r:Record, i:int}:#Background
{if {r.compare-field "Notified?", true} == 0 then
{return {Background.from-string "silver"}}
else
{return null}
}
}
{RecordGrid
record-source = records,
height = 10cm,
width = 13cm,
row-background-spec = notified
}
レコードグリッドに読み込んで編集する前の値で判定して色をつけたいという意図でしたら、
例にあげられていた notified プロシージャをこのように変えてみてはどうでしょうか?
Code:
{define-proc public {notified rg:RecordGrid, r:Record, i:int}:#Background
|| {if {r.compare-field "Notified?", true} == 0 then
{if {r.get "Notified?", pending? = false} == true then
{return {Background.from-string "silver"}}
else
{return null}
}
}
CodeZineの掲載記事(*1)をみると、レコードグリッドで表示される行は表示される可能性が
でてきた際に随時作られているようなので、背景色設定のプロシージャもそのタイミングで
呼ばれるのではないかと思います。
このため、row-background-spec に指定したプロシージャが呼ばれた時点では、既に
レコードの値が更新されている可能性がありますが、幸い Recordクラスの get メソッドの
引数 pending? に false を指定すれば 更新前の値を取得できるようなので、この値を
参照して判定してみました。
ただし、レコードセットがレコードグリッドに読み込む前にプログラムや他のレコードグリッド
等で更新されていると期待しない結果になりそうですので、読み込むレコードセットは未更新
または更新されたレコードがcommitされている事が前提になりそうです。
*1:全機能を使い倒せ!大量データもグラフィカルに表示するCurlコントロール「RecordGrid」マニア
http://codezine.jp/article/detail/6113
Notified? の値をユーザに書き換えられてしまうことが問題なのであれば、
Notified? とは別のフィールド(HiddenNotifiedなど)を用意して、グリッドにカラムとして表示しない、というのも手かもしれませんね。
>Notified? とは別のフィールド(HiddenNotifiedなど)を用意して、グリッドにカラムとして表示しない、というのも手かもしれませんね。
レコードから更新前の値を取り出す方法を書いてみたものの、そちらの方法の方が安全確実でよさそうですね
ある任意の状態でのNotified?の値をずっと参照したいというケースでも、そのタイミングでHiddenNotifiedへ転記すれば済みますし。
試しに隠しフィールドを使う方法でコードを書いてみましたがこんな感じでしょうか?
Code:
{include "../../default/support/data-long.scurl"}
|| HiddenNotified? フィールドを追加したレコードセットを生成するプロシージャ
{define-proc {make-new-recordset src-rs:RecordSet}:RecordSet
def src-field-name = "Notified?"
def dup-field-name = "HiddenNotified?"
|| 新規レコードセット作成用にレコードフィールド一覧の配列を作成
let record-field-array:{Array-of RecordField} = {new {Array-of RecordField}}
{for rf:RecordField in src-rs.fields do
{record-field-array.append rf}
}
|| レコードフィールド一覧配列に追加するフィールドを追加
{record-field-array.append {RecordField dup-field-name, domain = bool}}
|| レコードフィールド一覧配列より新規レコードセットを作成
let new-records:RecordSet =
{RecordSet
{RecordFields
{splice record-field-array}
}
}
|| 新規レコードセットにデータを複製
{for src-rec:Record in src-rs do
let new-rec:Record = {new-records.new-record}
{for src-rf:RecordField in {src-rec.record-set.fields.to-Iterator} do
def field-name = src-rf.name
def field-val = {src-rec.get field-name}
{new-rec.set field-name, field-val}
|| 複製対象のフィールドの場合は複製先フィールドにも値をセット
{if {field-name.equal? src-field-name} then
{new-rec.set dup-field-name, field-val}
}
}
{new-records.append new-rec}
}
{return new-records}
}
|| HiddenNotified? フィールドを追加したレコードセットを生成
{let new-records:RecordSet = {make-new-recordset records}}
{define-proc public {notified rg:RecordGrid, r:Record, i:int}:#Background
|| "Notified?" ではなく、隠しフィールド "HiddenNotified?"を参照して背景色を設定
{if {r.compare-field "HiddenNotified?", true} == 0 then
{return {Background.from-string "silver"}}
else
{return null}
}
}
{RecordGrid
record-source = new-records,
height = 10cm,
width = 13cm,
row-background-spec = notified,
|| record-source 内のフィールドに対するカラムの自動生成を無効に設定
automatic-columns? = false,
|| 表示するカラムを明示的に生成
{RecordGridColumn "User ID"},
{RecordGridColumn "Last"},
{RecordGridColumn "First"},
{RecordGridColumn "City"},
{RecordGridColumn "State"},
{RecordGridColumn "Date"},
{RecordGridColumn "Time"},
{RecordGridColumn "Rank"},
{RecordGridColumn "Notified?"}
}