Curl Global Community
ヘッダーの結合はできない? - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: ヘッダーの結合はできない? (/showthread.php?tid=956)



ヘッダーの結合はできない? - 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}