Q81:テーブル編集を抜ける際(フォーカスアウト)、入力されている値が期待値と違う場合にフォーカスアウトを抑止し、編集が確定するまで処理の入力を促したい。
Q81-1:
テーブルの編集チェック処理につきまして、下記問題をご相談させて下さい。
【実現したいこと】
テーブル編集を抜ける際(フォーカスアウト)、入力されている値が期待値と違う場合にフォーカスアウトを抑止し、編集が確定するまで処理の入力を促したい。
【問題点】
セルの編集を抜ける際のチェック処理、セルの編集状態(フォーカスイン)が実現出来ない
@エンター実行時
Aマウスで別のセルにフォーカス移動した場合
【添付資料】
処理の流れを簡略化したアプリを添付に付けております。
また、Q&Aなどを見てテーブルの下記チェック処理を行っていたのですが、上手くいきません。テーブルのイベントの認識が間違っていないか、合わせてお伺いさせて下さい。
【テーブルについての質問内容】
@処理要求イベントについて
・処理概要:編集値確定前に起こるイベント
・編集中セルの位置を取得する場合のメソッド
行位置:選択行の位置を取得する
列位置:選択列の位置を取得する
Aデータ更新イベントについて
・処理概要:セル値確定後のイベント
・編集後セルの位置を取得する場合のメソッド
行位置:更新されたセルの行番号を取得する
列位置:更新されたセルの列番号を取得する
A81-1:
テーブルセルの値確定のタイミングはお書き頂いた通り、
> @エンター実行時
> Aマウスで別のセルにフォーカス移動した場合
となっています。
また[テーブル]の処理要求イベントについても、
> ・処理概要:編集値確定前に起こるイベント
> ・編集中セルの位置を取得する場合のメソッド
> 行位置:選択行の位置を取得する
> 列位置:選択列の位置を取得する
処理要求イベントに繋がる最後の処理の戻り値が「true」あるいは「false」であった場合、更新を行うかどうか指定できます。
問題は処理要求イベント発生時にセルの入力の内容を取得することができないということです。[テーブル]の処理要求イベント発生時には値は確定されていないので、「指定セルの値を取得する(int,int)」で取得できる値は更新前の確定済みの値(≠入力している値)です。また、イベント内包で取得できる値も更新前の値となります。
従って[テーブル]のデータ更新イベントに繋げて処理を行うことになりますが、他のセルやコンポーネントへのフォーカスの移動が [テーブル]のデータ更新イベントに繋がる一連の処理の後に行われ、元のセルへのフォーカス移動や編集状態にするメソッドがうまく効かない現象がみられることがあります。
タイマーを使って時間差で別スレッドで起動すると回避できますので、タイマーを一回だけ起動して処理を行います。
※Ver.2.9より、編集中のセルの値を取得する機能が追加されました。従って、処理要求イベント発生時(セル値確定前)に入力値を確認することができます。
日付の入力を簡単にする部品としては[日時選択ダイアログ/パネル]がございます。[テーブル]列位置などを限定して処理を行いたい場合[イベント生成]コンポーネントとイベント番号を組み合わせて使うこともあります。
[イベント生成]を使った簡単なサンプルファイルを掲載致しますので、ご参考になれば幸いです。
関連ファイル:イベント生成・日時選択.mzax