Thread Rating:
  • 472 Vote(s) - 2.79 Average
  • 1
  • 2
  • 3
  • 4
  • 5
入力チェックについての質問です
04-07-2014, 12:56 PM,
#5
RE: 入力チェックについての質問です

romさんの質問は、RecordGrid を利用する際に多くの方がぶつかる問題だと思います。
とくに、dyoshidaさんもおっしゃられているように「チェック機能をどのように設計するのか」という
問題にかかわってくるので、かなり深いところに突っ込まなくてはならず、
設計の知識にうとい私では、簡潔な回答には至りませんでした。


まず、質問のポイントをまとめると、下記2点になるかと思います。
①フォーカスアウト時にチェックをかけるには?
②ボタン押下時にチェックをかけるには?

そして、これらには、隠れている問題があり、
A.エラー状態を表現するにはどうするか
B.エラー状態を保持するにはどうするか
を考える必要があります。

さらに、汎用的な設計として、
α.誰がチェックするのか
β.いつチェックするのか
ということ問題に波及していきます。


①についての回答としては、私も、dyoshidaさんのように、
update-data にすることが直接的な解決方法かな、と思うのですが、
ただ、この解決方法には、隠れた問題Aがあります。

問題Aの発生手順
1.レコードを100レコード作成する
2.任意のレコードで、エラーにする(セル背景が赤になる)
3.グリッドの縦スクロールを操作する
4.エラーでないセルの背景が赤く表示される ←問題発生

この問題は、RecordGrid のセルのインスタンスが、再利用されていることから発生しています。

再利用されているセルが、現在表現すべきエラー状態を正常に表現するには、
セルの描画メソッドである、refresh-data メソッドを利用する必要があります。

しかし、描画の度にエラーを判断する処理を行うと、グリッド全体のパフォーマンスが低下する恐れがあり、
単純に update-data に移管した処理内容を、refresh-dataに移管する、というのはおすすめできません。
これが、隠れた問題B、ということになります。

ではどうすればよいか、というと、私は、レコードに「エラー状態」というフラグを持ち、
描画とチェックの機能を分けて実装する方法が良いと思っています。

つまり、チェックメソッドで、チェック処理とエラー状態フラグの切り替えを行い、
描画メソッド(refresh-data)では、エラー状態フラグの結果だけを参照するようにする、ということです。

もっとよい設計があるかもしれませんが、下記のスレッドで、セル単位でエラー状態を保持するサンプルコードが載っています。
http://communities.curl.com/showthread.php?tid=905


もうひとつの問題②については、上記で作成したチェックメソッドを、
ボタン押下時に呼び出す仕組みを用意すればよいかと思います。

romさんのソースでは、カスタムセルにチェックロジックが入っているので、
グリッド内の全セルに対してチェックをかけるとすると、
1.グリッドに、ボタン押下時に呼ばれるチェックメソッドを用意し
2.チェックメソッド中で RecordGrid.ui から、RecordGridUI を取得
3.RecordGridUI.get-cell-at で全セルをまわしながらチェックする
4.一つでもエラーがあれば、RecordSet.commit をコールしない
という方法になりそうですが、
案外、セルをインスタンス化するコストは無視できないので、
チェックロジックはRecordGridColumn に持たせ、チェックロジックに渡すデータはReocrd から取得する、
という設計のほうがよいかもしれません。
これが設計上の問題αになります。

ただ、ボタン押下以前に、すべてのグリッドが、必ず1度以上チェックロジックをとおっている、という前提があれば、
上記のように、セルをまわさなくても、レコードにエラー状態が保持されているはずなので、
ボタン押下時は、レコードのエラーフラグだけ参照すればよいかもしれません。

フォーカスアウト時、ボタン押下時の両方でチェックすべきか、どちらか片方だけでよいのか、
つまり、いつチェックすべきか、という問題βにかかわってくるわけです。

「エラー時にフォーカスを戻すべきか」という内容についても
思うところはあるのですが、こうあるべき、という結論には至っていません。
そのあたりも含めて、Tech blog にネタを提供できたらと思っています。


Messages In This Thread
RE: 入力チェックについての質問です - by umemura - 04-07-2014, 12:56 PM
Forum Jump:


Users browsing this thread:
1 Guest(s)

MyBB SQL Error

MyBB has experienced an internal SQL error and cannot continue.

SQL Error:
1017 - Can't find file: 'mybb_threadviews' (errno: 2)
Query:
INSERT INTO mybb_threadviews (tid) VALUES('1063')