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=957)



レコードグリッドの行番号を表示するには? - umemura - 08-20-2013

レコードグリッドに行番号を表示したいです。

よい実装方法はありますでしょうか。



RE: レコードグリッドの行番号 - umemura - 08-20-2013

RecordGrid.row-background-spec を利用する方法があると思いますが、
そもそも行番号のためのプロパティではないですし、
並び替えのたびに、すべてのレコードが編集されてしまうのがうれしくありません。

中のレコードとは関係なく行番号を表示することはできないのでしょうか。

Code:
{define-proc public {notified rg:RecordGrid, r:Record, i:int}:#Background
    set r["id"] = {String i + 1}
    {return null}
}

{let people:RecordSet =
    {RecordSet
        {RecordFields
            {RecordField "id", domain = String},
            {RecordField "First", domain = String},
            {RecordField "Last", domain = String},
            {RecordField "Age", domain = int}
        },
        {RecordData id = "1", First = "John", Last = "Smith", Age = 25},
        {RecordData id = "1", First = "Jane", Last = "Smith", Age = 29},
        {RecordData id = "1", First = "Jane", Last = "Jones", Age = 28}
    }
}
{def rg =
    {RecordGrid
        row-background-spec = notified,
        record-source = people,
        height = 5cm,
        width = 8in,
        vertical-grid-line-width = 4px
    }
}

{value
    {VBox
        rg,
        {HBox
            {CommandButton
                width = {make-elastic}, label = "append record",
                {on Action do
                    {people.append {RecordData}}
                }
            },
            {CommandButton
                width = {make-elastic}, label = "delete current record",
                {on Action do
                    {if-non-null r = rg.current-record then
                        {r.delete}
                    }
                }
            },
            {CommandButton
                width = {make-elastic}, label = "commit records",
                bound-command = {rg.get-command "commit"}
            },
            {CommandButton
                width = {make-elastic}, label = "revert records",
                bound-command = {rg.get-command "revert"}
            }
        }
    }
}




RE: レコードグリッドの行番号 - Yuhki - 08-21-2013

RecordGridColumnのformat-specを利用してはどうでしょうか?

Code:
{RecordGridColumn
"id",
format-spec =
    {proc {data:any, r:Record}:String
        {return {String {rg.records.get-index r} + 1}}
    }
}

ただ、処理の負荷を考えるとRecordGridCellを継承したクラスを作って
formatメソッドにてRecordGridCell.record-indexを返すようにするほうが
いいかもしれませんね。





RE: レコードグリッドの行番号を表示するには? - umemura - 08-21-2013

RecordGridCell.record-index ですか!

format-spec を使うと、対象のRecordSetに存在する RecordField.field-name を指定しないと表示できない?のですかね?
対象のレコードに依存せずに、カラム単体で行番号を表示できるようにしたいです。
とりあえず、 refresh-data を利用してみました。

Code:
{define-class public LineNumberCell {inherits RecordGridCell }
  field line-number-frame:Frame = {Frame halign = "right", margin = 1pt}
  {constructor public {default ...}
    {construct-super {splice ...}}
    {self.add-internal self.line-number-frame}
  }
  {method public {refresh-data }:void
    {self.line-number-frame.add replace? = true, self.record-index + 1}
  }
}

{define-class public LineNumberColumnl {inherits RecordGridColumn}
  {constructor public {default
                          width:any = 20pt,
                          header-spec:any = "No.",
                          ...}
    {construct-super
        "",
        header-spec = header-spec,
        width = width,
        {splice ...}}
    set self.cell-spec = LineNumberCell
    set self.editable? = false
  }
}


{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}
    }
}
{def rg =
    {RecordGrid
        {LineNumberColumnl},
        record-source = people,
        height = 5cm,
        width = 8in,
        vertical-grid-line-width = 4px
    }
}
{value rg}




RE: レコードグリッドの行番号を表示するには? - dyoshida - 08-21-2013

umemuraさんのコードを試させていただきましたが、なかなかよい感じですね。

個人的には行選択した場合に行番号セルも選択色になって欲しい気がするので、
RecordGridCell のかわりに StandardStringCell を継承するのはどうでしょうか?

Code:
{define-class public LineNumberCell {inherits StandardStringCell}
  field line-number-frame:Frame = {Frame halign = "right", margin = 1pt}
  {constructor public {default ...}
    {construct-super {splice ...}}
    set self.cells-take-focus? = false
  }
  {method public {refresh-data }:void
    {super.refresh-data}
    set self.display-graphic.contents = {String (self.record-index + 1)}
  }
}