RecordGridの右クリックメニューについて、
質問があります。
83列あるグリッドにて、右クリックをし、
右クリックメニューを表示しようとすると、
10秒ほどかかってしまっています。
なんとか、表示時間を短くしたいのですが、
何か良い対策はありませんか?
試しに、列数を19列に減らしてみたところ、
右クリックメニューの表示にかかる時間が1秒ほどに
短くなるため、時間がかかる原因としては
列数が多いためと推測しています。
右クリックメニュー内容は特に変えておらず、
標準のメニューを使用しています。
また、良く分からないのが、
グリッドのスクロールや、データ設定などの動作は遅くなっておらず、
右クリックメニュー表示だけ遅くなっています。
何か心当たりがありましたら、教えてください。
よろしくお願いします。
RecordGridの右クリックメニューについて
列が多くなってもそこまで遅くなるはずがないと思います。
こちらで試してみたら、やっぱりそうはなりません。
他にも条件があるんでしょうかね。
セルとか継承しているんでしょうか。
メニューは標準でも、作る時に他のAPIを呼び出します。
テストコード添付してくれればもっと調べられるでしょう。
こちらで試してみたら、やっぱりそうはなりません。
他にも条件があるんでしょうかね。
セルとか継承しているんでしょうか。
メニューは標準でも、作る時に他のAPIを呼び出します。
テストコード添付してくれればもっと調べられるでしょう。
一応、こちらで試したテストコードです。
そんなに遅いとは感じませんでしたので、相違点を教えてもらえると助かります。
Code:
{value
def fields = {{Array-of RecordField}}
{for i = 0 below 83 do
{fields.append
{RecordField
{format "col%s", i},
nullable? = true
}
}
}
def rs = {RecordSet {RecordFields {splice fields}}}
{for i = 0 below 100 do
def rd = {RecordData}
{for f in rs.fields do
def name = f.name
set rd[name] = {format "value[%s]", name}
}
{rs.append rd}
}
{RecordGrid record-source = rs}
}そんなに遅いとは感じませんでしたので、相違点を教えてもらえると助かります。
ご回答ありがとうございます。
プロジェクトの規約のため、
Curl標準のRecordGridを継承したクラスを使用しています。
私の方でも、該当の右クリックメニュー表示が遅いグリッドを
Curl標準のRecordGridに変えてみたところ、
列数を減らした時よりも早く、右クリックメニューが表示されました。
hokadaさんのソースと同じような実装になっています。
列数だけの問題かと思っていましたが、
継承したグリッドのソースコードを見直しをしています。
試しに、プロファイリングをしてみたところ、
標準のRecordGridUIを継承したUIクラスの
note-columns-collection-changedメソッドで
時間がかかっているようです。
継承したUIクラスに下記メソッドが存在し、
{method public {context-menu-at x
istance, y
istance}:#MenuPane
let menu-pane:#MenuPane
{with self.grid.editable? = false do
set menu-pane = {super.context-menu-at x, y}
}
{return menu-pane}
}
{with self.grid.editable? = false do
のeditableでRecordGridColumnを継承したクラスの
ローカルオプションを参照し、その処理内で
UIクラスのnote-columns-collection-changedメソッドを呼んでいるようです。
{define-class public ExBaseRecordGridColumn {inherits RecordGridColumn}
・・・コード略・・・
{local-option public editable?:bool
{self.note-columns-collection-changed}
}
・・・コード略・・・
{method protected {note-columns-collection-changed}:void
{if-non-null rg = self.grid then
{(rg.ui asa RecordGridUI).note-columns-collection-changed}
}
}
}
試しに、note-columns-collection-changedの
処理内容をコメントアウトしてみたところ、
右クリックメニューの表示が早くなりました。
今回のプロジェクトでどのような仕様でRecordGridを実装すべきか
一旦、フレームワーク作成者と相談してみます。
プロジェクトの規約のため、
Curl標準のRecordGridを継承したクラスを使用しています。
私の方でも、該当の右クリックメニュー表示が遅いグリッドを
Curl標準のRecordGridに変えてみたところ、
列数を減らした時よりも早く、右クリックメニューが表示されました。
hokadaさんのソースと同じような実装になっています。
列数だけの問題かと思っていましたが、
継承したグリッドのソースコードを見直しをしています。
試しに、プロファイリングをしてみたところ、
標準のRecordGridUIを継承したUIクラスの
note-columns-collection-changedメソッドで
時間がかかっているようです。
継承したUIクラスに下記メソッドが存在し、
{method public {context-menu-at x
istance, y
istance}:#MenuPanelet menu-pane:#MenuPane
{with self.grid.editable? = false do
set menu-pane = {super.context-menu-at x, y}
}
{return menu-pane}
}
{with self.grid.editable? = false do
のeditableでRecordGridColumnを継承したクラスの
ローカルオプションを参照し、その処理内で
UIクラスのnote-columns-collection-changedメソッドを呼んでいるようです。
{define-class public ExBaseRecordGridColumn {inherits RecordGridColumn}
・・・コード略・・・
{local-option public editable?:bool
{self.note-columns-collection-changed}
}
・・・コード略・・・
{method protected {note-columns-collection-changed}:void
{if-non-null rg = self.grid then
{(rg.ui asa RecordGridUI).note-columns-collection-changed}
}
}
}
試しに、note-columns-collection-changedの
処理内容をコメントアウトしてみたところ、
右クリックメニューの表示が早くなりました。
今回のプロジェクトでどのような仕様でRecordGridを実装すべきか
一旦、フレームワーク作成者と相談してみます。
なるほど。
まあ、RecordGridUI.note-columns-collection-changedメソッドは、すでに作成しているカラムなどの情報を全てクリアしてしまいますので、遅くなってしまいますね。
まあ、RecordGridUI.note-columns-collection-changedメソッドは、すでに作成しているカラムなどの情報を全てクリアしてしまいますので、遅くなってしまいますね。