ヘッダーの結合はできない? - umemura - 08-13-2013
レコードグリッドのヘッダーを、結合したいと思っています。
RecordGridColumnGroup で複数のグリッドをまとめたヘッダーを作成できますが、
このグループヘッダー「のみ」を表示する、ということはできないのでしょうか。
RecordGridColumn に height オプションがあれば 0pt にして見えないようにできるかなと思ったのですが、
widht しかないため、断念しました。
インスペクトしてみると、ヘッダー「SkRGInnerRow」クラスという格納されているようなので、
グラフィックをたどっていけば何とかなるかもしれませんが、
もし正規の方法で、実現可能な方法があれば教えてください。
RE: ヘッダーの結合はできない? - dyoshida - 09-13-2013
open controlのレコードグリッドのコードを眺めてみたのですが、
公式にはヘッダーを外部から変更する機能はなさそうな気がします。
グラフィックをたどるのがよさそうですが、ヘッダ周りはpackageで隠ぺいされてるものが多いので、
header-specで指定したグラフィックから親をたどる方法をためしてみました。
インスペクタでみたところ、header-specで指定したオブジェクトを格納しているHBoxがあり、
これの高さを0pxに設定すればヘッダ行が潰れるようです。
試しにさらに親のSkRGInnerRowまでたどって高さを0pxに設定してみたのですがこちらは効果が
ないように見えました。
実験したコードは下記の通りです。
非ローカルオプションをトリガにしているので、レコードセットを変更した際など、ヘッダが再生成された
場合は、一度falseに設定して再度trueに変更する必要がありますが・・・
Code: {curl 8.0 applet}
{curl-file-attributes character-encoding = "shift-jis"}
|| レコードグリッドのカラムヘッダの高さを0にする処理を呼び出すために非ローカルオプションを定義
{define-nonlocal-option public my-collapse-rg-header?:bool = false}
||
{define-class public MyCollapseRgHeaderFrame {inherits Frame}
{constructor {default ...}
{construct-super
{splice ...}
}
}
|| レコードグリッドのカラムヘッダの高さを0にする処理を呼び出すために非ローカルオプション
{nonlocal-option public my-collapse-rg-header?:bool
{if my-collapse-rg-header? then
|| 一つ上の階層のHBOXの高さを0pxに設定
def pbox = self.parent
set pbox.height = 0px
}
}
}
|| カラムヘッダの高さを0するためのカスタムRecordGridColumn
{define-class public MyRecordGridColumn {inherits RecordGridColumn}
{constructor {default ...}
{construct-super
{splice ...},
header-spec = {MyCollapseRgHeaderFrame}
}
}
}
{let rs:RecordSet =
{RecordSet
{RecordFields
{RecordField
"id", caption = "User ID", domain = int,
index-type = RecordFieldIndexType.unique
},
{RecordField "First", domain = String},
{RecordField "Last", domain = String},
{RecordField "City", domain = String},
{RecordField "State", domain = String}
},
{RecordData id = 1, First = "Gene", Last = "Smith", City = "Boston", State = "MA"},
{RecordData id = 2, First = "Fred", Last = "Smith", City = "Cambridge", State = "MA"}
}
}
{let rg:RecordGrid =
{RecordGrid
record-source = rs,
height = 10cm,
width = 13cm,
{RecordGridColumnGroup
"id",
|| ヘッダーのセパレーターを削除します
enclose-header-label? = false,
{MyRecordGridColumn "id"}
},
{RecordGridColumnGroup
"Name",
|| ヘッダーのセパレーターを削除します
enclose-header-label? = false,
{MyRecordGridColumn "First"},
{MyRecordGridColumn "Last"}
},
{RecordGridColumnGroup
"Address",
|| ヘッダーのセパレーターを削除します
enclose-header-label? = false,
{MyRecordGridColumn "City"},
{MyRecordGridColumn "State"}
}
}
}
{value
{VBox
rg,
{CommandButton
label = "下段を潰す",
{on Action do
|| 非ローカルオプションを設定
set rg.my-collapse-rg-header? = true
}
}
}
}
ご参考まで
RE: ヘッダーの結合はできない? - umemura - 09-19-2013
なるほど、親の高さをつぶせばよいのですね。
dyoshidaさんのコードを参考に、ヘッダーの表示時につぶすようにしてみました。
ヘッダーの再表示の問題は残りますね。
Code: {define-proc {heder-spec-proc rgc:RecordGridColumn}:Graphic
{return
{Frame
{on AttachEvent at fr:Frame do
set fr.parent.height = 0pt
}
}
}
}
{let rg2:RecordGrid =
{RecordGrid
record-source = rs,
height = 10cm,
width = 13cm,
{RecordGridColumnGroup
"id",
|| ヘッダーのセパレーターを削除します
enclose-header-label? = false,
{RecordGridColumn "id", header-spec = heder-spec-proc}
},
{RecordGridColumnGroup
"Name",
|| ヘッダーのセパレーターを削除します
enclose-header-label? = false,
{RecordGridColumn "First", header-spec = heder-spec-proc},
{RecordGridColumn "Last", header-spec = heder-spec-proc}
},
{RecordGridColumnGroup
"Address",
|| ヘッダーのセパレーターを削除します
enclose-header-label? = false,
{RecordGridColumn "City", header-spec = heder-spec-proc},
{RecordGridColumn "State", header-spec = heder-spec-proc}
}
}
}
{value rg2}
|